瀏覽代碼

[ui-storagebrowser] refactor action component to extend for trash actions (#4023)

Ram Prasad Agarwal 8 月之前
父節點
當前提交
4c2d68aee5
共有 38 個文件被更改,包括 243 次插入176 次删除
  1. 1 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageBrowserTab/StorageBrowserTab.scss
  2. 6 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageBrowserTab/StorageBrowserTab.tsx
  3. 0 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.scss
  4. 7 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.test.tsx
  5. 13 18
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.tsx
  6. 0 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.scss
  7. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.test.tsx
  8. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.tsx
  9. 0 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.scss
  10. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.test.tsx
  11. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.tsx
  12. 1 1
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.util.test.ts
  13. 1 1
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.util.ts
  14. 0 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.scss
  15. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.test.tsx
  16. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.tsx
  17. 19 3
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/DeletionModal/DeletionModal.test.tsx
  18. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/DeletionModal/DeletionModal.tsx
  19. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ExtractionModal/ExtractionModal.test.tsx
  20. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ExtractionModal/ExtractionModal.tsx
  21. 4 15
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/MoveCopyModal/MoveCopyModal.test.tsx
  22. 5 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/MoveCopyModal/MoveCopyModal.tsx
  23. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/RenameModal/RenameModal.test.tsx
  24. 5 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/RenameModal/RenameModal.tsx
  25. 2 2
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ReplicationModal/ReplicationModal.test.tsx
  26. 5 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ReplicationModal/ReplicationModal.tsx
  27. 1 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.scss
  28. 5 5
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.test.tsx
  29. 36 39
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.tsx
  30. 4 4
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.util.ts
  31. 1 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.scss
  32. 3 3
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.test.tsx
  33. 6 6
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.tsx
  34. 71 0
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/StorageDirectoryActions.tsx
  35. 13 17
      desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryPage.tsx
  36. 3 1
      desktop/core/src/desktop/js/apps/storageBrowser/StorageFilePage/StorageFilePage.tsx
  37. 0 6
      desktop/core/src/desktop/js/apps/storageBrowser/types.ts
  38. 1 0
      desktop/core/src/desktop/js/utils/storageBrowserUtils.test.ts

+ 1 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageBrowserTab/StorageBrowserTab.scss

@@ -13,6 +13,7 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
 @use 'variables' as vars;
 @use 'mixins';
 

+ 6 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageBrowserTab/StorageBrowserTab.tsx

@@ -56,6 +56,7 @@ const StorageBrowserTab = ({ fileSystem, testId }: StorageBrowserTabProps): JSX.
     filePath.split('/').pop() !== '' ? (filePath.split('/').pop() ?? '') : filePath.split('://')[0];
 
   const { t } = i18nReact.useTranslation();
+
   const {
     data: fileStats,
     loading,
@@ -111,8 +112,8 @@ const StorageBrowserTab = ({ fileSystem, testId }: StorageBrowserTabProps): JSX.
                 setFilePath(fileSystem.user_home_directory);
               }}
               className="hue-storage-browser__home-bar-btns"
-              data-event={''}
-              title={'home'}
+              data-event=""
+              title={t('Home')}
               icon={<HomeIcon />}
             >
               {t('Home')}
@@ -120,8 +121,8 @@ const StorageBrowserTab = ({ fileSystem, testId }: StorageBrowserTabProps): JSX.
             <BorderlessButton
               onClick={() => reloadData()}
               className="hue-storage-browser__home-bar-btns"
-              data-event={''}
-              title={'Refresh'}
+              data-event=""
+              title={t('Refresh')}
               icon={<RefreshIcon />}
             >
               {t('Refresh')}
@@ -143,7 +144,7 @@ const StorageBrowserTab = ({ fileSystem, testId }: StorageBrowserTabProps): JSX.
           <StorageDirectoryPage
             fileStats={fileStats}
             onFilePathChange={setFilePath}
-            config={fileSystem.config}
+            fileSystem={fileSystem}
           />
         )}
         {fileStats?.type === BrowserViewType.file && !loading && (

+ 0 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/CreateAndUploadAction/CreateAndUploadAction.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.scss


+ 7 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/CreateAndUploadAction/CreateAndUploadAction.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.test.tsx

@@ -2,24 +2,25 @@ import React from 'react';
 import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import CreateAndUploadAction from './CreateAndUploadAction';
-import { CREATE_DIRECTORY_API_URL, CREATE_FILE_API_URL } from '../../api';
+import { CREATE_DIRECTORY_API_URL, CREATE_FILE_API_URL } from '../../../api';
 
 const mockSave = jest.fn();
-jest.mock('../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave
   }))
 }));
 
-jest.mock('../../../../utils/huePubSub', () => ({
+jest.mock('../../../../../utils/huePubSub', () => ({
   __esModule: true,
   publish: jest.fn()
 }));
 
 describe('CreateAndUploadAction', () => {
   const currentPath = '/some/path';
-  const onSuccessfulAction = jest.fn();
+  const onActionSuccess = jest.fn();
+  const onActionError = jest.fn();
   const setLoadingFiles = jest.fn();
   const mockFilesUpload = jest.fn();
 
@@ -27,9 +28,10 @@ describe('CreateAndUploadAction', () => {
     render(
       <CreateAndUploadAction
         currentPath={currentPath}
-        onSuccessfulAction={onSuccessfulAction}
+        onActionSuccess={onActionSuccess}
         setLoadingFiles={setLoadingFiles}
         onFilesUpload={mockFilesUpload}
+        onActionError={onActionError}
       />
     );
   });

+ 13 - 18
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/CreateAndUploadAction/CreateAndUploadAction.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/CreateAndUpload/CreateAndUploadAction.tsx

@@ -24,20 +24,20 @@ import DropDownIcon from '@cloudera/cuix-core/icons/react/DropdownIcon';
 import ImportIcon from '@cloudera/cuix-core/icons/react/ImportIcon';
 import { PrimaryButton } from 'cuix/dist/components/Button';
 
-import { i18nReact } from '../../../../utils/i18nReact';
-import huePubSub from '../../../../utils/huePubSub';
-import { CREATE_DIRECTORY_API_URL, CREATE_FILE_API_URL } from '../../api';
-import { FileStats } from '../../types';
-import useSaveData from '../../../../utils/hooks/useSaveData/useSaveData';
-import InputModal from '../../../../reactComponents/InputModal/InputModal';
+import { i18nReact } from '../../../../../utils/i18nReact';
+import { CREATE_DIRECTORY_API_URL, CREATE_FILE_API_URL } from '../../../api';
+import { FileStats } from '../../../types';
+import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
+import InputModal from '../../../../../reactComponents/InputModal/InputModal';
 import './CreateAndUploadAction.scss';
-import DragAndDrop from '../../../../reactComponents/DragAndDrop/DragAndDrop';
+import DragAndDrop from '../../../../../reactComponents/DragAndDrop/DragAndDrop';
 
 interface CreateAndUploadActionProps {
   currentPath: FileStats['path'];
-  onSuccessfulAction: () => void;
+  onActionSuccess: () => void;
   setLoadingFiles: (value: boolean) => void;
   onFilesUpload: (files: File[]) => void;
+  onActionError: (error: Error) => void;
 }
 
 enum ActionType {
@@ -48,9 +48,10 @@ enum ActionType {
 
 const CreateAndUploadAction = ({
   currentPath,
-  onSuccessfulAction,
+  onActionSuccess,
   setLoadingFiles,
-  onFilesUpload
+  onFilesUpload,
+  onActionError
 }: CreateAndUploadActionProps): JSX.Element => {
   const { t } = i18nReact.useTranslation();
 
@@ -66,19 +67,13 @@ const CreateAndUploadAction = ({
   };
 
   const onApiSuccess = () => {
-    setLoadingFiles(false);
     onModalClose();
-    onSuccessfulAction();
-  };
-
-  const onApiError = (error: Error) => {
-    setLoadingFiles(false);
-    huePubSub.publish('hue.error', error);
+    onActionSuccess();
   };
 
   const { save, loading } = useSaveData(undefined, {
     onSuccess: onApiSuccess,
-    onError: onApiError
+    onError: onActionError
   });
 
   const onActionClick = (action: ActionType) => () => {

+ 0 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.scss


+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.test.tsx

@@ -19,7 +19,7 @@ import { render, fireEvent, waitFor } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import userEvent from '@testing-library/user-event';
 import ChangeOwnerAndGroupModal from './ChangeOwnerAndGroupModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockFiles: StorageDirectoryTableData[] = [
   {
@@ -36,7 +36,7 @@ const mockFiles: StorageDirectoryTableData[] = [
 ];
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal.tsx

@@ -16,11 +16,11 @@
 
 import React, { useEffect, useMemo, useState } from 'react';
 import Modal from 'cuix/dist/components/Modal';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
 import { Checkbox, Input, Select } from 'antd';
-import { ListDirectory, StorageDirectoryTableData } from '../../../types';
-import { BULK_CHANGE_OWNER_API_URL } from '../../../api';
+import { ListDirectory, StorageDirectoryTableData } from '../../../../types';
+import { BULK_CHANGE_OWNER_API_URL } from '../../../../api';
 import './ChangeOwnerAndGroupModal.scss';
 
 interface ChangeOwnerAndGroupModalProps {

+ 0 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangePermissionModal/ChangePermissionModal.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.scss


+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangePermissionModal/ChangePermissionModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.test.tsx

@@ -18,7 +18,7 @@ import React from 'react';
 import { render, fireEvent, waitFor } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import ChangePermissionModal from './ChangePermissionModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockFiles: StorageDirectoryTableData[] = [
   {
@@ -35,7 +35,7 @@ const mockFiles: StorageDirectoryTableData[] = [
 ];
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangePermissionModal/ChangePermissionModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.tsx

@@ -16,11 +16,11 @@
 
 import React, { useState } from 'react';
 import Modal from 'cuix/dist/components/Modal';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
 import { Checkbox, Table } from 'antd';
-import { StorageDirectoryTableData } from '../../../types';
-import { BULK_CHANGE_PERMISSION_API_URL } from '../../../api';
+import { StorageDirectoryTableData } from '../../../../types';
+import { BULK_CHANGE_PERMISSION_API_URL } from '../../../../api';
 import { getInitialPermissions, Permission } from './ChangePermissionModal.util';
 
 import './ChangePermissionModal.scss';

+ 1 - 1
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangePermissionModal/ChangePermissionModal.util.test.ts → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.util.test.ts

@@ -15,7 +15,7 @@
 // limitations under the License.
 
 import { getInitialPermissions } from './ChangePermissionModal.util';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 describe('getInitialPermissions', () => {
   const mockFiles: StorageDirectoryTableData[] = [

+ 1 - 1
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ChangePermissionModal/ChangePermissionModal.util.ts → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ChangePermissionModal/ChangePermissionModal.util.ts

@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 interface entityPermission {
   read: boolean;

+ 0 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/CompressionModal/CompressionModal.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.scss


+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/CompressionModal/CompressionModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.test.tsx

@@ -18,7 +18,7 @@ import React from 'react';
 import { render, fireEvent, waitFor } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import CompressionModal from './CompressionModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockFiles: StorageDirectoryTableData[] = [
   {
@@ -46,7 +46,7 @@ const mockFiles: StorageDirectoryTableData[] = [
 ];
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/CompressionModal/CompressionModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/CompressionModal/CompressionModal.tsx

@@ -16,10 +16,10 @@
 
 import React, { useState } from 'react';
 import Modal from 'cuix/dist/components/Modal';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
-import { StorageDirectoryTableData } from '../../../types';
-import { COMPRESS_API_URL } from '../../../api';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
+import { StorageDirectoryTableData } from '../../../../types';
+import { COMPRESS_API_URL } from '../../../../api';
 import { Input } from 'antd';
 
 import './CompressionModal.scss';

+ 19 - 3
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/DeletionModal/DeletionModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/DeletionModal/DeletionModal.test.tsx

@@ -1,9 +1,25 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 import React from 'react';
 import { render, fireEvent } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import DeletionModal from './DeletionModal';
-import { StorageDirectoryTableData } from '../../../types';
-import { BULK_DELETION_API_URL, DELETION_API_URL } from '../../../api';
+import { StorageDirectoryTableData } from '../../../../types';
+import { BULK_DELETION_API_URL, DELETION_API_URL } from '../../../../api';
 
 const mockFiles: StorageDirectoryTableData[] = [
   {
@@ -31,7 +47,7 @@ const mockFiles: StorageDirectoryTableData[] = [
 ];
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/DeletionModal/DeletionModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/DeletionModal/DeletionModal.tsx

@@ -16,10 +16,10 @@
 
 import React from 'react';
 import Modal from 'cuix/dist/components/Modal';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
-import { StorageDirectoryTableData } from '../../../types';
-import { BULK_DELETION_API_URL, DELETION_API_URL } from '../../../api';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
+import { StorageDirectoryTableData } from '../../../../types';
+import { BULK_DELETION_API_URL, DELETION_API_URL } from '../../../../api';
 
 interface DeletionModalProps {
   isOpen?: boolean;

+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ExtractionModal/ExtractionModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ExtractionModal/ExtractionModal.test.tsx

@@ -18,7 +18,7 @@ import React from 'react';
 import { render, fireEvent, waitFor } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import ExtractAction from './ExtractionModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockFile: StorageDirectoryTableData = {
   name: 'archive.zip',
@@ -34,7 +34,7 @@ const mockFile: StorageDirectoryTableData = {
 
 const mockSave = jest.fn();
 let mockLoading = false;
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ExtractionModal/ExtractionModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ExtractionModal/ExtractionModal.tsx

@@ -16,10 +16,10 @@
 
 import React from 'react';
 import Modal from 'cuix/dist/components/Modal';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
-import { StorageDirectoryTableData } from '../../../types';
-import { EXTRACT_API_URL } from '../../../api';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
+import { StorageDirectoryTableData } from '../../../../types';
+import { EXTRACT_API_URL } from '../../../../api';
 
 interface ExtractActionProps {
   currentPath: string;

+ 4 - 15
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/MoveCopyModal/MoveCopyModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/MoveCopyModal/MoveCopyModal.test.tsx

@@ -9,17 +9,6 @@
 //     http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
-// Licensed to Cloudera, Inc. under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  Cloudera, Inc. licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
@@ -30,8 +19,8 @@ import { render, fireEvent } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import MoveCopyModal from './MoveCopyModal';
 import { ActionType } from '../StorageBrowserActions.util';
-import { BULK_COPY_API_URL, BULK_MOVE_API_URL } from '../../../api';
-import { StorageDirectoryTableData } from '../../../types';
+import { BULK_COPY_API_URL, BULK_MOVE_API_URL } from '../../../../api';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockFiles: StorageDirectoryTableData[] = [
   {
@@ -57,7 +46,7 @@ const mockFiles: StorageDirectoryTableData[] = [
     replication: 1
   }
 ];
-jest.mock('../../../../../utils/hooks/useLoadData/useLoadData', () => ({
+jest.mock('../../../../../../utils/hooks/useLoadData/useLoadData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     data: {
@@ -68,7 +57,7 @@ jest.mock('../../../../../utils/hooks/useLoadData/useLoadData', () => ({
 }));
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave

+ 5 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/MoveCopyModal/MoveCopyModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/MoveCopyModal/MoveCopyModal.tsx

@@ -15,12 +15,12 @@
 // limitations under the License.
 
 import React from 'react';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
 import { ActionType } from '../StorageBrowserActions.util';
-import { BULK_COPY_API_URL, BULK_MOVE_API_URL } from '../../../api';
-import FileChooserModal from '../../../FileChooserModal/FileChooserModal';
-import { FileStats, StorageDirectoryTableData } from '../../../types';
+import { BULK_COPY_API_URL, BULK_MOVE_API_URL } from '../../../../api';
+import FileChooserModal from '../../../../FileChooserModal/FileChooserModal';
+import { FileStats, StorageDirectoryTableData } from '../../../../types';
 
 interface MoveCopyModalProps {
   isOpen?: boolean;

+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/RenameModal/RenameModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/RenameModal/RenameModal.test.tsx

@@ -18,10 +18,10 @@ import React from 'react';
 import { render, fireEvent } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import RenameModal from './RenameModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 5 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/RenameModal/RenameModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/RenameModal/RenameModal.tsx

@@ -15,11 +15,11 @@
 // limitations under the License.
 
 import React from 'react';
-import { StorageDirectoryTableData } from '../../../types';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
-import { RENAME_API_URL } from '../../../api';
-import InputModal from '../../../../../reactComponents/InputModal/InputModal';
+import { StorageDirectoryTableData } from '../../../../types';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
+import { RENAME_API_URL } from '../../../../api';
+import InputModal from '../../../../../../reactComponents/InputModal/InputModal';
 
 interface RenameModalProps {
   isOpen?: boolean;

+ 2 - 2
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ReplicationModal/ReplicationModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ReplicationModal/ReplicationModal.test.tsx

@@ -18,10 +18,10 @@ import React from 'react';
 import { render, fireEvent } from '@testing-library/react';
 import '@testing-library/jest-dom';
 import ReplicationModal from './ReplicationModal';
-import { StorageDirectoryTableData } from '../../../types';
+import { StorageDirectoryTableData } from '../../../../types';
 
 const mockSave = jest.fn();
-jest.mock('../../../../../utils/hooks/useSaveData/useSaveData', () => ({
+jest.mock('../../../../../../utils/hooks/useSaveData/useSaveData', () => ({
   __esModule: true,
   default: jest.fn(() => ({
     save: mockSave,

+ 5 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/ReplicationModal/ReplicationModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/ReplicationModal/ReplicationModal.tsx

@@ -15,11 +15,11 @@
 // limitations under the License.
 
 import React from 'react';
-import { StorageDirectoryTableData } from '../../../types';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import useSaveData from '../../../../../utils/hooks/useSaveData/useSaveData';
-import { SET_REPLICATION_API_URL } from '../../../api';
-import InputModal from '../../../../../reactComponents/InputModal/InputModal';
+import { StorageDirectoryTableData } from '../../../../types';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import useSaveData from '../../../../../../utils/hooks/useSaveData/useSaveData';
+import { SET_REPLICATION_API_URL } from '../../../../api';
+import InputModal from '../../../../../../reactComponents/InputModal/InputModal';
 
 interface ReplicationModalProps {
   isOpen?: boolean;

+ 1 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/StorageBrowserActions.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.scss

@@ -13,6 +13,7 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
 @use 'mixins';
 
 $action-dropdown-width: 214px;

+ 5 - 5
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/StorageBrowserActions.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.test.tsx

@@ -20,15 +20,15 @@ import userEvent from '@testing-library/user-event';
 import '@testing-library/jest-dom';
 
 import StorageBrowserActions from './StorageBrowserActions';
-import { StorageDirectoryTableData } from '../../types';
-import { get } from '../../../../api/utils';
-import huePubSub from '../../../../utils/huePubSub';
+import { StorageDirectoryTableData } from '../../../types';
+import { get } from '../../../../../api/utils';
+import huePubSub from '../../../../../utils/huePubSub';
 
-jest.mock('../../../../api/utils', () => ({
+jest.mock('../../../../../api/utils', () => ({
   get: jest.fn()
 }));
 
-jest.mock('../../../../utils/huePubSub', () => ({
+jest.mock('../../../../../utils/huePubSub', () => ({
   publish: jest.fn()
 }));
 

+ 36 - 39
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/StorageBrowserActions.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.tsx

@@ -32,10 +32,10 @@ import DownloadIcon from '@cloudera/cuix-core/icons/react/DownloadIcon';
 import GroupsIcon from '@cloudera/cuix-core/icons/react/GroupsIcon';
 import ConfigureIcon from '@cloudera/cuix-core/icons/react/ConfigureIcon';
 
-import { i18nReact } from '../../../../utils/i18nReact';
-import huePubSub from '../../../../utils/huePubSub';
+import { i18nReact } from '../../../../../utils/i18nReact';
+import huePubSub from '../../../../../utils/huePubSub';
 import './StorageBrowserActions.scss';
-import { FileStats, FileSystem, StorageDirectoryTableData } from '../../types';
+import { FileStats, FileSystem, StorageDirectoryTableData } from '../../../types';
 import { ActionType, getEnabledActions } from './StorageBrowserActions.util';
 import MoveCopyModal from './MoveCopyModal/MoveCopyModal';
 import RenameModal from './RenameModal/RenameModal';
@@ -44,7 +44,7 @@ import SummaryModal from './SummaryModal/SummaryModal';
 import DeletionModal from './DeletionModal/DeletionModal';
 import CompressionModal from './CompressionModal/CompressionModal';
 import ExtractionModal from './ExtractionModal/ExtractionModal';
-import { DOWNLOAD_API_URL } from '../../api';
+import { DOWNLOAD_API_URL } from '../../../api';
 import ChangeOwnerAndGroupModal from './ChangeOwnerAndGroupModal/ChangeOwnerAndGroupModal';
 import ChangePermissionModal from './ChangePermissionModal/ChangePermissionModal';
 
@@ -52,7 +52,8 @@ interface StorageBrowserRowActionsProps {
   config: FileSystem['config'];
   currentPath: FileStats['path'];
   selectedFiles: StorageDirectoryTableData[];
-  onSuccessfulAction: () => void;
+  onActionSuccess: () => void;
+  onActionError: (error: Error) => void;
   setLoadingFiles: (value: boolean) => void;
 }
 
@@ -74,7 +75,8 @@ const StorageBrowserActions = ({
   config,
   currentPath,
   selectedFiles,
-  onSuccessfulAction,
+  onActionSuccess,
+  onActionError,
   setLoadingFiles
 }: StorageBrowserRowActionsProps): JSX.Element => {
   const [selectedAction, setSelectedAction] = useState<ActionType>();
@@ -98,14 +100,8 @@ const StorageBrowserActions = ({
   };
 
   const onApiSuccess = () => {
-    setLoadingFiles(false);
     closeModal();
-    onSuccessfulAction();
-  };
-
-  const onApiError = (error: Error) => {
-    setLoadingFiles(false);
-    huePubSub.publish('hue.error', error);
+    onActionSuccess();
   };
 
   const actionItems: MenuItemType[] = useMemo(() => {
@@ -134,67 +130,68 @@ const StorageBrowserActions = ({
           <DropDownIcon />
         </Button>
       </Dropdown>
-      {selectedAction === ActionType.Summary && (
+      {selectedAction === ActionType.Summary && !!selectedFiles.length && (
         <SummaryModal path={selectedFiles[0].path} onClose={closeModal} />
       )}
-      {selectedAction === ActionType.Rename && (
+      {selectedAction === ActionType.Rename && !!selectedFiles.length && (
         <RenameModal
           file={selectedFiles[0]}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
         />
       )}
-      {selectedAction === ActionType.Replication && (
+      {selectedAction === ActionType.Replication && !!selectedFiles.length && (
         <ReplicationModal
           file={selectedFiles[0]}
           onSuccess={onApiSuccess}
-          onError={onApiError}
-          onClose={closeModal}
-        />
-      )}
-      {(selectedAction === ActionType.Move || selectedAction === ActionType.Copy) && (
-        <MoveCopyModal
-          action={selectedAction}
-          files={selectedFiles}
-          currentPath={currentPath}
-          onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
-          setLoadingFiles={setLoadingFiles}
         />
       )}
-      {selectedAction === ActionType.Delete && (
+      {(selectedAction === ActionType.Move || selectedAction === ActionType.Copy) &&
+        !!selectedFiles.length && (
+          <MoveCopyModal
+            action={selectedAction}
+            files={selectedFiles}
+            currentPath={currentPath}
+            onSuccess={onApiSuccess}
+            onError={onActionError}
+            onClose={closeModal}
+            setLoadingFiles={setLoadingFiles}
+          />
+        )}
+      {selectedAction === ActionType.Delete && !!selectedFiles.length && (
         <DeletionModal
           isTrashEnabled={config?.is_trash_enabled}
           files={selectedFiles}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
           setLoading={setLoadingFiles}
         />
       )}
-      {selectedAction === ActionType.Compress && (
+      {selectedAction === ActionType.Compress && !!selectedFiles.length && (
         <CompressionModal
           currentPath={currentPath}
           files={selectedFiles}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
           setLoading={setLoadingFiles}
         />
       )}
-      {selectedAction === ActionType.Extract && (
+      {selectedAction === ActionType.Extract && !!selectedFiles.length && (
         <ExtractionModal
           currentPath={currentPath}
           file={selectedFiles[0]}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
           setLoading={setLoadingFiles}
         />
       )}
-      {selectedAction === ActionType.ChangeOwnerAndGroup && (
+      {selectedAction === ActionType.ChangeOwnerAndGroup && !!selectedFiles.length && (
         <ChangeOwnerAndGroupModal
           files={selectedFiles}
           superUser={config?.superuser}
@@ -202,16 +199,16 @@ const StorageBrowserActions = ({
           users={config?.users}
           groups={config?.groups}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
           setLoading={setLoadingFiles}
         />
       )}
-      {selectedAction === ActionType.ChangePermission && (
+      {selectedAction === ActionType.ChangePermission && !!selectedFiles.length && (
         <ChangePermissionModal
           files={selectedFiles}
           onSuccess={onApiSuccess}
-          onError={onApiError}
+          onError={onActionError}
           onClose={closeModal}
           setLoading={setLoadingFiles}
         />

+ 4 - 4
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/StorageBrowserActions.util.ts → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/StorageBrowserActions.util.ts

@@ -15,7 +15,7 @@
 // limitations under the License.
 
 import { getLastKnownConfig } from 'config/hueConfig';
-import { BrowserViewType, StorageDirectoryTableData } from '../../types';
+import { BrowserViewType, StorageDirectoryTableData } from '../../../types';
 import {
   isHDFS,
   isOFS,
@@ -29,10 +29,10 @@ import {
   isS3,
   isOFSRoot,
   inTrash
-} from '../../../../utils/storageBrowserUtils';
-import { SupportedFileTypes } from '../../../../utils/constants/storageBrowser';
+} from '../../../../../utils/storageBrowserUtils';
+import { SupportedFileTypes } from '../../../../../utils/constants/storageBrowser';
 import { TFunction } from 'i18next';
-import { getFileType } from '../../StorageFilePage/StorageFilePage.util';
+import { getFileType } from '../../../StorageFilePage/StorageFilePage.util';
 
 export enum ActionType {
   Copy = 'copy',

+ 1 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/SummaryModal/SummaryModal.scss → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.scss

@@ -13,6 +13,7 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
 @use 'variables' as vars;
 
 .antd.cuix {

+ 3 - 3
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/SummaryModal/SummaryModal.test.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.test.tsx

@@ -18,11 +18,11 @@ import React from 'react';
 import { waitFor, screen, fireEvent, render } from '@testing-library/react';
 import '@testing-library/jest-dom';
 
-import { get } from '../../../../../api/utils';
-import formatBytes from '../../../../../utils/formatBytes';
+import { get } from '../../../../../../api/utils';
+import formatBytes from '../../../../../../utils/formatBytes';
 import SummaryModal from './SummaryModal';
 
-jest.mock('../../../../../api/utils', () => ({
+jest.mock('../../../../../../api/utils', () => ({
   get: jest.fn()
 }));
 

+ 6 - 6
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageBrowserActions/SummaryModal/SummaryModal.tsx → desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/FileAndFolder/SummaryModal/SummaryModal.tsx

@@ -18,12 +18,12 @@ import React from 'react';
 import Modal from 'cuix/dist/components/Modal';
 import { Spin } from 'antd';
 
-import huePubSub from '../../../../../utils/huePubSub';
-import { i18nReact } from '../../../../../utils/i18nReact';
-import formatBytes from '../../../../../utils/formatBytes';
-import useLoadData from '../../../../../utils/hooks/useLoadData/useLoadData';
-import { CONTENT_SUMMARY_API_URL } from '../../../api';
-import { ContentSummary, StorageDirectoryTableData } from '../../../types';
+import huePubSub from '../../../../../../utils/huePubSub';
+import { i18nReact } from '../../../../../../utils/i18nReact';
+import formatBytes from '../../../../../../utils/formatBytes';
+import useLoadData from '../../../../../../utils/hooks/useLoadData/useLoadData';
+import { CONTENT_SUMMARY_API_URL } from '../../../../api';
+import { ContentSummary, StorageDirectoryTableData } from '../../../../types';
 
 import './SummaryModal.scss';
 

+ 71 - 0
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryActions/StorageDirectoryActions.tsx

@@ -0,0 +1,71 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import React from 'react';
+import CreateAndUploadAction from './CreateAndUpload/CreateAndUploadAction';
+import StorageBrowserActions from './FileAndFolder/StorageBrowserActions';
+import { FileStats, FileSystem, StorageDirectoryTableData } from '../../types';
+import huePubSub from '../../../../utils/huePubSub';
+
+interface StorageDirectoryActionsProps {
+  fileStats: FileStats;
+  fileSystem: FileSystem;
+  onActionSuccess: () => void;
+  setLoadingFiles: (value: boolean) => void;
+  selectedFiles: StorageDirectoryTableData[];
+  onFilesDrop: (files: File[]) => void;
+}
+
+const StorageDirectoryActions = ({
+  fileStats,
+  fileSystem,
+  onActionSuccess,
+  setLoadingFiles,
+  selectedFiles,
+  onFilesDrop
+}: StorageDirectoryActionsProps): JSX.Element => {
+  const onApiSuccess = () => {
+    setLoadingFiles(false);
+    onActionSuccess();
+  };
+
+  const onApiError = (error: Error) => {
+    setLoadingFiles(false);
+    huePubSub.publish('hue.error', error);
+  };
+
+  return (
+    <>
+      <StorageBrowserActions
+        config={fileSystem.config}
+        currentPath={fileStats.path}
+        selectedFiles={selectedFiles}
+        setLoadingFiles={setLoadingFiles}
+        onActionSuccess={onApiSuccess}
+        onActionError={onApiError}
+      />
+      <CreateAndUploadAction
+        currentPath={fileStats.path}
+        setLoadingFiles={setLoadingFiles}
+        onActionSuccess={onApiSuccess}
+        onActionError={onApiError}
+        onFilesUpload={onFilesDrop}
+      />
+    </>
+  );
+};
+
+export default StorageDirectoryActions;

+ 13 - 17
desktop/core/src/desktop/js/apps/storageBrowser/StorageDirectoryPage/StorageDirectoryPage.tsx

@@ -38,7 +38,6 @@ import {
   FileSystem
 } from '../types';
 import Pagination from '../../../reactComponents/Pagination/Pagination';
-import StorageBrowserActions from './StorageBrowserActions/StorageBrowserActions';
 import formatBytes from '../../../utils/formatBytes';
 
 import './StorageDirectoryPage.scss';
@@ -49,16 +48,16 @@ import {
   DEFAULT_POLLING_TIME,
   FileUploadStatus
 } from '../../../utils/constants/storageBrowser';
-import CreateAndUploadAction from './CreateAndUploadAction/CreateAndUploadAction';
 import DragAndDrop from '../../../reactComponents/DragAndDrop/DragAndDrop';
 import UUID from '../../../utils/string/UUID';
 import { UploadItem } from '../../../utils/hooks/useFileUpload/util';
 import FileUploadQueue from '../../../reactComponents/FileUploadQueue/FileUploadQueue';
 import LoadingErrorWrapper from '../../../reactComponents/LoadingErrorWrapper/LoadingErrorWrapper';
+import StorageDirectoryActions from './StorageDirectoryActions/StorageDirectoryActions';
 
 interface StorageDirectoryPageProps {
   fileStats: FileStats;
-  config: FileSystem['config'];
+  fileSystem: FileSystem;
   onFilePathChange: (path: string) => void;
   className?: string;
   rowClassName?: string;
@@ -73,7 +72,7 @@ const defaultProps = {
 
 const StorageDirectoryPage = ({
   fileStats,
-  config,
+  fileSystem,
   onFilePathChange,
   className,
   rowClassName,
@@ -98,7 +97,7 @@ const StorageDirectoryPage = ({
     data: filesData,
     loading: listDirectoryLoading,
     error: listDirectoryError,
-    reloadData
+    reloadData: reloadFilesData
   } = useLoadData<ListDirectory>(LIST_DIRECTORY_API_URL, {
     params: {
       path: fileStats.path,
@@ -268,7 +267,7 @@ const StorageDirectoryPage = ({
       enabled: !!listDirectoryError,
       message: t('An error occurred while fetching the data'),
       action: t('Retry'),
-      onClick: reloadData
+      onClick: reloadFilesData
     }
   ];
 
@@ -285,18 +284,15 @@ const StorageDirectoryPage = ({
           disabled={!tableData.length && !searchTerm.length}
         />
         <div className="hue-storage-browser__actions-bar-right">
-          <StorageBrowserActions
-            config={config}
-            currentPath={fileStats.path}
+          <StorageDirectoryActions
+            fileStats={fileStats}
+            fileSystem={fileSystem}
             selectedFiles={selectedFiles}
+            onActionSuccess={() => {
+              reloadFilesData();
+            }}
             setLoadingFiles={setLoadingFiles}
-            onSuccessfulAction={reloadData}
-          />
-          <CreateAndUploadAction
-            currentPath={fileStats.path}
-            setLoadingFiles={setLoadingFiles}
-            onSuccessfulAction={reloadData}
-            onFilesUpload={onFilesDrop}
+            onFilesDrop={onFilesDrop}
           />
         </div>
       </div>
@@ -341,7 +337,7 @@ const StorageDirectoryPage = ({
           filesQueue={filesToUpload}
           onClose={() => setFilesToUpload([])}
           onComplete={() => {
-            reloadData();
+            reloadFilesData();
             setPolling(false);
           }}
         />

+ 3 - 1
desktop/core/src/desktop/js/apps/storageBrowser/StorageFilePage/StorageFilePage.tsx

@@ -32,6 +32,7 @@ import {
 import useLoadData from '../../../utils/hooks/useLoadData/useLoadData';
 import { getLastKnownConfig } from '../../../config/hueConfig';
 import LoadingErrorWrapper from '../../../reactComponents/LoadingErrorWrapper/LoadingErrorWrapper';
+import { inTrash } from '../../../utils/storageBrowserUtils';
 
 interface StorageFilePageProps {
   onReload: () => void;
@@ -113,7 +114,8 @@ const StorageFilePage = ({ fileName, fileStats, onReload }: StorageFilePageProps
     !isEditing &&
     config?.storage_browser.max_file_editor_size &&
     config?.storage_browser.max_file_editor_size > fileStats.size &&
-    EDITABLE_FILE_FORMATS.has(fileType);
+    EDITABLE_FILE_FORMATS.has(fileType) &&
+    !inTrash(fileStats.path);
 
   const pageStats = {
     page_number: pageNumber,

+ 0 - 6
desktop/core/src/desktop/js/apps/storageBrowser/types.ts

@@ -67,12 +67,6 @@ export interface FilePreview {
 export interface ListDirectory {
   files: FileStats[];
   page: PageStats;
-  groups: string[];
-  users: string[];
-  supergroup: string;
-  superuser: string;
-  is_fs_superuser: boolean;
-  is_trash_enabled: boolean;
 }
 
 export interface ContentSummary {

+ 1 - 0
desktop/core/src/desktop/js/utils/storageBrowserUtils.test.ts

@@ -13,6 +13,7 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
 import {
   isHDFS,
   isS3,