@aws-amplify/ui-react-storage 3.14.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +8 -2
- package/dist/{createStorageBrowser-CotOvK0A.js → createStorageBrowser-B-J76Lyp.js} +1012 -249
- package/dist/esm/browser.mjs +1 -0
- package/dist/esm/components/StorageBrowser/ErrorBoundary/ErrorBoundary.mjs +0 -3
- package/dist/esm/components/StorageBrowser/StorageBrowserAmplify.mjs +1 -0
- package/dist/esm/components/StorageBrowser/actions/configs/defaults.mjs +14 -3
- package/dist/esm/components/StorageBrowser/actions/handlers/defaults.mjs +1 -1
- package/dist/esm/components/StorageBrowser/actions/handlers/delete.mjs +39 -8
- package/dist/esm/components/StorageBrowser/actions/handlers/listLocations.mjs +7 -2
- package/dist/esm/components/StorageBrowser/actions/handlers/utils.mjs +65 -1
- package/dist/esm/components/StorageBrowser/actions/handlers/zipdownload.mjs +195 -0
- package/dist/esm/components/StorageBrowser/adapters/createAmplifyAuthAdapter/createAmplifyListLocationsHandler.mjs +3 -1
- package/dist/esm/components/StorageBrowser/adapters/createManagedAuthAdapter/createManagedAuthAdapter.mjs +1 -0
- package/dist/esm/components/StorageBrowser/components/ComponentsProvider.mjs +0 -3
- package/dist/esm/components/StorageBrowser/components/base/preview/DownloadButton.mjs +0 -3
- package/dist/esm/components/StorageBrowser/components/composables/ActionConfirmationModal.mjs +34 -0
- package/dist/esm/components/StorageBrowser/components/composables/defaults.mjs +2 -0
- package/dist/esm/components/StorageBrowser/components/elements/definitions.mjs +2 -2
- package/dist/esm/components/StorageBrowser/controls/ActionConfirmationModalControl.mjs +12 -0
- package/dist/esm/components/StorageBrowser/controls/DataTableControl.mjs +0 -3
- package/dist/esm/components/StorageBrowser/controls/hooks/useActionConfirmationModal.mjs +17 -0
- package/dist/esm/components/StorageBrowser/createStorageBrowser/StorageBrowserDefault.mjs +8 -3
- package/dist/esm/components/StorageBrowser/createStorageBrowser/createProvider.mjs +1 -0
- package/dist/esm/components/StorageBrowser/createStorageBrowser/createStorageBrowser.mjs +9 -4
- package/dist/esm/components/StorageBrowser/displayText/libraries/en/deleteView.mjs +117 -5
- package/dist/esm/components/StorageBrowser/displayText/libraries/en/downloadView.mjs +2 -0
- package/dist/esm/components/StorageBrowser/displayText/libraries/en/locationDetailView.mjs +1 -0
- package/dist/esm/components/StorageBrowser/displayText/libraries/en/shared.mjs +3 -0
- package/dist/esm/components/StorageBrowser/locationItems/context.mjs +18 -14
- package/dist/esm/components/StorageBrowser/locationItems/utils.mjs +38 -0
- package/dist/esm/components/StorageBrowser/store/validateStoreProps.mjs +1 -1
- package/dist/esm/components/StorageBrowser/tasks/constants.mjs +2 -0
- package/dist/esm/components/StorageBrowser/tasks/useProcessTasks.mjs +14 -5
- package/dist/esm/components/StorageBrowser/tasks/utils.mjs +4 -1
- package/dist/esm/components/StorageBrowser/useAction/useHandler.mjs +1 -1
- package/dist/esm/components/StorageBrowser/useAction/utils.mjs +0 -4
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyViewProvider.mjs +4 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/FoldersMessageControl.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/useCopyView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/useFolders.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/CreateFolderView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/useCreateFolderView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteView.mjs +5 -5
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteViewProvider.mjs +7 -6
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/useDeleteView.mjs +69 -6
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/utils.mjs +87 -0
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadViewProvider.mjs +9 -0
- package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/useDownloadView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadView.mjs +1 -4
- package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadViewProvider.mjs +4 -0
- package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/useUploadView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailViewProvider.mjs +2 -1
- package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFolderRowContent.mjs +38 -27
- package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.mjs +9 -1
- package/dist/esm/components/StorageBrowser/views/LocationDetailView/useLocationDetailView.mjs +11 -9
- package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsView.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsViewProvider.mjs +0 -3
- package/dist/esm/components/StorageBrowser/views/LocationsView/useLocationsView.mjs +1 -0
- package/dist/esm/components/StorageBrowser/views/context/actionViews.mjs +7 -3
- package/dist/esm/components/StorageBrowser/views/context/primaryViews.mjs +8 -3
- package/dist/esm/components/StorageBrowser/views/hooks/useFilePreview/useFilePreview.mjs +1 -0
- package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/constants.mjs +14 -1
- package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.mjs +123 -13
- package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/utils.mjs +4 -4
- package/dist/esm/version.mjs +1 -1
- package/dist/index.js +2 -1
- package/dist/styles.css +100 -1
- package/dist/types/components/StorageBrowser/actions/handlers/delete.d.ts +5 -3
- package/dist/types/components/StorageBrowser/actions/handlers/index.d.ts +1 -0
- package/dist/types/components/StorageBrowser/actions/handlers/types.d.ts +18 -2
- package/dist/types/components/StorageBrowser/actions/handlers/utils.d.ts +11 -0
- package/dist/types/components/StorageBrowser/actions/handlers/zipdownload.d.ts +3 -0
- package/dist/types/components/StorageBrowser/components/composables/ActionConfirmationModal.d.ts +12 -0
- package/dist/types/components/StorageBrowser/components/composables/types.d.ts +2 -0
- package/dist/types/components/StorageBrowser/controls/ActionConfirmationModalControl.d.ts +2 -0
- package/dist/types/components/StorageBrowser/controls/hooks/useActionConfirmationModal.d.ts +2 -0
- package/dist/types/components/StorageBrowser/controls/index.d.ts +1 -0
- package/dist/types/components/StorageBrowser/controls/types.d.ts +4 -0
- package/dist/types/components/StorageBrowser/displayText/types.d.ts +9 -0
- package/dist/types/components/StorageBrowser/locationItems/context.d.ts +12 -3
- package/dist/types/components/StorageBrowser/locationItems/index.d.ts +1 -0
- package/dist/types/components/StorageBrowser/locationItems/utils.d.ts +27 -0
- package/dist/types/components/StorageBrowser/tasks/types.d.ts +10 -5
- package/dist/types/components/StorageBrowser/tasks/useProcessTasks.d.ts +1 -1
- package/dist/types/components/StorageBrowser/useAction/useHandler.d.ts +1 -1
- package/dist/types/components/StorageBrowser/views/LocationActionView/DeleteView/types.d.ts +5 -0
- package/dist/types/components/StorageBrowser/views/LocationActionView/DeleteView/utils.d.ts +26 -0
- package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFolderRowContent.d.ts +4 -1
- package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.d.ts +3 -2
- package/dist/types/components/StorageBrowser/views/LocationDetailView/types.d.ts +8 -1
- package/dist/types/components/StorageBrowser/views/utils/index.d.ts +1 -1
- package/dist/types/components/StorageBrowser/views/utils/tableResolvers/constants.d.ts +5 -0
- package/dist/types/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.d.ts +5 -2
- package/dist/types/components/StorageBrowser/views/utils/tableResolvers/index.d.ts +1 -1
- package/dist/types/components/StorageBrowser/views/utils/tableResolvers/types.d.ts +4 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +12 -9
- package/dist/esm/components/StorageBrowser/actions/handlers/download.mjs +0 -38
|
@@ -9,11 +9,8 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
9
9
|
import '../credentials/context.mjs';
|
|
10
10
|
import '@aws-amplify/storage/internals';
|
|
11
11
|
import '../configuration/context.mjs';
|
|
12
|
-
import 'aws-amplify';
|
|
13
|
-
import 'aws-amplify/storage';
|
|
14
|
-
import { assertRegisterAuthListener } from '../validators/assertRegisterAuthListener.mjs';
|
|
15
|
-
import '../actions/configs/context.mjs';
|
|
16
12
|
import '../actions/configs/defaults.mjs';
|
|
13
|
+
import { assertRegisterAuthListener } from '../validators/assertRegisterAuthListener.mjs';
|
|
17
14
|
import '../views/context/actionViews.mjs';
|
|
18
15
|
import '../views/context/primaryViews.mjs';
|
|
19
16
|
import { CopyView } from '../views/LocationActionView/CopyView/CopyView.mjs';
|
|
@@ -21,11 +18,19 @@ import '../locationItems/context.mjs';
|
|
|
21
18
|
import '../store/context.mjs';
|
|
22
19
|
import { CreateFolderView } from '../views/LocationActionView/CreateFolderView/CreateFolderView.mjs';
|
|
23
20
|
import { DeleteView } from '../views/LocationActionView/DeleteView/DeleteView.mjs';
|
|
21
|
+
import '../displayText/context.mjs';
|
|
22
|
+
import '@aws-amplify/ui-react';
|
|
23
|
+
import '../components/elements/definitions.mjs';
|
|
24
|
+
import '../components/elements/IconElement.mjs';
|
|
25
|
+
import 'aws-amplify';
|
|
26
|
+
import 'jszip';
|
|
27
|
+
import 'aws-amplify/storage';
|
|
24
28
|
import { DownloadView } from '../views/LocationActionView/DownloadView/DownloadView.mjs';
|
|
25
29
|
import { LocationActionView } from '../views/LocationActionView/LocationActionView.mjs';
|
|
26
30
|
import { UploadView } from '../views/LocationActionView/UploadView/UploadView.mjs';
|
|
27
31
|
import '../fileItems/context.mjs';
|
|
28
32
|
import { LocationDetailView } from '../views/LocationDetailView/LocationDetailView.mjs';
|
|
33
|
+
import '../actions/configs/context.mjs';
|
|
29
34
|
import '../filePreview/context.mjs';
|
|
30
35
|
import { LocationsView } from '../views/LocationsView/LocationsView.mjs';
|
|
31
36
|
import { useView } from '../views/useView.mjs';
|
|
@@ -1,20 +1,132 @@
|
|
|
1
1
|
import { DEFAULT_ACTION_VIEW_DISPLAY_TEXT } from './shared.mjs';
|
|
2
2
|
|
|
3
|
+
const pluralize = (count, word) => count === 1 ? word : `${word}s`;
|
|
4
|
+
const formatCount = (count, word) => `${count === 1 ? '' : 'All '}${count} ${pluralize(count, word)}`;
|
|
3
5
|
const DEFAULT_DELETE_VIEW_DISPLAY_TEXT = {
|
|
4
6
|
...DEFAULT_ACTION_VIEW_DISPLAY_TEXT,
|
|
5
7
|
title: 'Delete',
|
|
6
8
|
actionStartLabel: 'Delete',
|
|
9
|
+
confirmationModalTitle: 'Confirm Deletion',
|
|
10
|
+
confirmationModalConfirmLabel: 'Delete',
|
|
11
|
+
confirmationModalCancelLabel: 'Cancel',
|
|
12
|
+
confirmationModalMessage: 'The items that will be deleted contain {count} folder{plural}',
|
|
13
|
+
confirmationModalFolderListTitle: 'Folder list:',
|
|
7
14
|
getActionCompleteMessage: (data) => {
|
|
8
|
-
const { counts } = data ?? {};
|
|
9
|
-
const { COMPLETE, FAILED, TOTAL } = counts ?? {};
|
|
15
|
+
const { counts, tasks } = data ?? {};
|
|
16
|
+
const { COMPLETE = 0, FAILED = 0, TOTAL = 0 } = counts ?? {};
|
|
17
|
+
if (!TOTAL || TOTAL === 0) {
|
|
18
|
+
return { content: 'No items to delete.', type: 'info' };
|
|
19
|
+
}
|
|
20
|
+
if (tasks && tasks.length > 0) {
|
|
21
|
+
const folderTasks = tasks.filter((task) => task.data.type === 'FOLDER');
|
|
22
|
+
const fileTasks = tasks.filter((task) => task.data.type === 'FILE');
|
|
23
|
+
const completeFolders = folderTasks.filter((task) => task.status === 'COMPLETE').length;
|
|
24
|
+
const failedFolders = folderTasks.filter((task) => task.status === 'FAILED').length;
|
|
25
|
+
const completeFiles = fileTasks.filter((task) => task.status === 'COMPLETE').length;
|
|
26
|
+
const failedFiles = fileTasks.filter((task) => task.status === 'FAILED').length;
|
|
27
|
+
const hasFolders = folderTasks.length > 0;
|
|
28
|
+
const hasFiles = fileTasks.length > 0;
|
|
29
|
+
const isMixed = hasFolders && hasFiles;
|
|
30
|
+
// All successful
|
|
31
|
+
if (COMPLETE === TOTAL) {
|
|
32
|
+
if (isMixed) {
|
|
33
|
+
return {
|
|
34
|
+
content: `${formatCount(completeFolders, 'folder')} and ${completeFiles} ${pluralize(completeFiles, 'file')} deleted successfully.`,
|
|
35
|
+
type: 'success',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
else if (hasFolders) {
|
|
39
|
+
return {
|
|
40
|
+
content: `${formatCount(completeFolders, 'folder')} deleted successfully.`,
|
|
41
|
+
type: 'success',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return {
|
|
46
|
+
content: `${formatCount(completeFiles, 'file')} deleted successfully.`,
|
|
47
|
+
type: 'success',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Complete failure
|
|
52
|
+
if (FAILED === TOTAL) {
|
|
53
|
+
if (isMixed) {
|
|
54
|
+
return {
|
|
55
|
+
content: `Failed to delete ${failedFolders} ${pluralize(failedFolders, 'folder')} and ${failedFiles} ${pluralize(failedFiles, 'file')}. Some contents may have been deleted.`,
|
|
56
|
+
type: 'error',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
else if (hasFolders) {
|
|
60
|
+
return {
|
|
61
|
+
content: `Failed to delete ${failedFolders} ${pluralize(failedFolders, 'folder')}. Some items may have been deleted.`,
|
|
62
|
+
type: 'error',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return {
|
|
67
|
+
content: `Failed to delete ${failedFiles} ${pluralize(failedFiles, 'file')}.`,
|
|
68
|
+
type: 'error',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Partial failure
|
|
73
|
+
if (isMixed) {
|
|
74
|
+
const messages = [];
|
|
75
|
+
if (completeFiles > 0) {
|
|
76
|
+
messages.push(`${completeFiles} ${pluralize(completeFiles, 'file')} deleted`);
|
|
77
|
+
}
|
|
78
|
+
if (completeFolders > 0) {
|
|
79
|
+
messages.push(`${completeFolders} ${pluralize(completeFolders, 'folder')} deleted`);
|
|
80
|
+
}
|
|
81
|
+
if (failedFiles > 0) {
|
|
82
|
+
messages.push(`${failedFiles} ${pluralize(failedFiles, 'file')} failed`);
|
|
83
|
+
}
|
|
84
|
+
if (failedFolders > 0) {
|
|
85
|
+
messages.push(`${failedFolders} ${pluralize(failedFolders, 'folder')} failed`);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
content: messages.join(', ') + '. Some items may have been deleted.',
|
|
89
|
+
type: 'error',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else if (hasFolders) {
|
|
93
|
+
// Folders only partial failure
|
|
94
|
+
if (completeFolders > 0) {
|
|
95
|
+
return {
|
|
96
|
+
content: `${completeFolders} ${pluralize(completeFolders, 'folder')} deleted, ${failedFolders} ${pluralize(failedFolders, 'folder')} failed. Some items may have been deleted.`,
|
|
97
|
+
type: 'error',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return {
|
|
102
|
+
content: `Failed to delete ${failedFolders} ${pluralize(failedFolders, 'folder')}. Some items may have been deleted.`,
|
|
103
|
+
type: 'error',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Files only partial failure
|
|
109
|
+
return {
|
|
110
|
+
content: `${completeFiles} ${pluralize(completeFiles, 'file')} deleted, ${failedFiles} ${pluralize(failedFiles, 'file')} failed.`,
|
|
111
|
+
type: 'error',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Fallback to generic messaging if tasks not available
|
|
10
116
|
if (COMPLETE === TOTAL) {
|
|
11
|
-
return {
|
|
117
|
+
return {
|
|
118
|
+
content: `${formatCount(TOTAL, 'item')} deleted successfully.`,
|
|
119
|
+
type: 'success',
|
|
120
|
+
};
|
|
12
121
|
}
|
|
13
122
|
if (FAILED === TOTAL) {
|
|
14
|
-
return {
|
|
123
|
+
return {
|
|
124
|
+
content: `Failed to delete ${formatCount(TOTAL, 'item')}.`,
|
|
125
|
+
type: 'error',
|
|
126
|
+
};
|
|
15
127
|
}
|
|
16
128
|
return {
|
|
17
|
-
content: `${COMPLETE}
|
|
129
|
+
content: `${COMPLETE} ${pluralize(COMPLETE, 'item')} deleted, ${FAILED} ${pluralize(FAILED, 'item')} failed to delete.`,
|
|
18
130
|
type: 'error',
|
|
19
131
|
};
|
|
20
132
|
},
|
|
@@ -4,6 +4,8 @@ const DEFAULT_DOWNLOAD_VIEW_DISPLAY_TEXT = {
|
|
|
4
4
|
...DEFAULT_ACTION_VIEW_DISPLAY_TEXT,
|
|
5
5
|
title: 'Download',
|
|
6
6
|
actionStartLabel: 'Download',
|
|
7
|
+
statusDisplayFinishingLabel: 'Zipping',
|
|
8
|
+
statusDisplayLoadedLabel: 'Loaded',
|
|
7
9
|
getActionCompleteMessage: (data) => {
|
|
8
10
|
const { counts } = data ?? {};
|
|
9
11
|
const { COMPLETE, FAILED, TOTAL } = counts ?? {};
|
|
@@ -69,6 +69,7 @@ const DEFAULT_LOCATION_DETAIL_VIEW_DISPLAY_TEXT = {
|
|
|
69
69
|
tableColumnSizeHeader: 'Size',
|
|
70
70
|
tableColumnTypeHeader: 'Type',
|
|
71
71
|
selectFileLabel: 'Select file',
|
|
72
|
+
selectFolderLabel: 'Select folder',
|
|
72
73
|
selectAllFilesLabel: 'Select all files',
|
|
73
74
|
getActionListItemLabel: (key = '') => {
|
|
74
75
|
switch (key) {
|
|
@@ -4,8 +4,10 @@ const DEFAULT_ACTION_VIEW_DISPLAY_TEXT = {
|
|
|
4
4
|
actionDestinationLabel: 'Destination',
|
|
5
5
|
statusDisplayCanceledLabel: 'Canceled',
|
|
6
6
|
statusDisplayCompletedLabel: 'Completed',
|
|
7
|
+
statusDisplayLoadedLabel: 'Completed',
|
|
7
8
|
statusDisplayFailedLabel: 'Failed',
|
|
8
9
|
statusDisplayInProgressLabel: 'In progress',
|
|
10
|
+
statusDisplayFinishingLabel: 'In progress',
|
|
9
11
|
statusDisplayTotalLabel: 'Total',
|
|
10
12
|
statusDisplayQueuedLabel: 'Not started',
|
|
11
13
|
// empty by default
|
|
@@ -15,6 +17,7 @@ const DEFAULT_ACTION_VIEW_DISPLAY_TEXT = {
|
|
|
15
17
|
tableColumnNameHeader: 'Name',
|
|
16
18
|
tableColumnTypeHeader: 'Type',
|
|
17
19
|
tableColumnSizeHeader: 'Size',
|
|
20
|
+
tableColumnProgressHeader: 'Progress',
|
|
18
21
|
};
|
|
19
22
|
const DEFAULT_LIST_VIEW_DISPLAY_TEXT = {
|
|
20
23
|
loadingIndicatorLabel: 'Loading',
|
|
@@ -3,11 +3,13 @@ import { createContextUtilities } from '@aws-amplify/ui-react-core';
|
|
|
3
3
|
import { noop } from '@aws-amplify/ui';
|
|
4
4
|
import '@aws-amplify/storage/internals';
|
|
5
5
|
import { createFileDataItem } from '../actions/handlers/utils.mjs';
|
|
6
|
+
import 'jszip';
|
|
6
7
|
import 'aws-amplify/storage';
|
|
7
8
|
import '../actions/configs/context.mjs';
|
|
8
9
|
import '../actions/configs/defaults.mjs';
|
|
9
10
|
|
|
10
11
|
const DEFAULT_STATE = {
|
|
12
|
+
dataItems: undefined,
|
|
11
13
|
fileDataItems: undefined,
|
|
12
14
|
};
|
|
13
15
|
const locationItemsReducer = (prevState, event) => {
|
|
@@ -16,27 +18,29 @@ const locationItemsReducer = (prevState, event) => {
|
|
|
16
18
|
const { items } = event;
|
|
17
19
|
if (!items?.length)
|
|
18
20
|
return prevState;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const nextDataItems = !prevState.dataItems?.length
|
|
22
|
+
? items
|
|
23
|
+
: prevState.dataItems.concat(items.filter((data) => !prevState.dataItems?.some(({ id }) => id === data.id)));
|
|
24
|
+
const fileItems = items.filter((item) => item.type === 'FILE');
|
|
25
|
+
const nextFileDataItems = !prevState.fileDataItems?.length
|
|
26
|
+
? fileItems.map(createFileDataItem)
|
|
27
|
+
: prevState.fileDataItems.concat(fileItems
|
|
28
|
+
.filter((data) => !prevState.fileDataItems?.some(({ id }) => id === data.id))
|
|
29
|
+
.map(createFileDataItem));
|
|
27
30
|
return {
|
|
28
|
-
|
|
31
|
+
dataItems: nextDataItems,
|
|
32
|
+
fileDataItems: nextFileDataItems,
|
|
29
33
|
};
|
|
30
34
|
}
|
|
31
35
|
case 'REMOVE_LOCATION_ITEM': {
|
|
32
36
|
const { id } = event;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
const dataItems = prevState.dataItems?.filter((item) => item.id !== id);
|
|
38
|
+
const fileDataItems = prevState.fileDataItems?.filter((item) => item.id !== id);
|
|
39
|
+
if (dataItems?.length === prevState.dataItems?.length &&
|
|
40
|
+
fileDataItems?.length === prevState.fileDataItems?.length) {
|
|
37
41
|
return prevState;
|
|
38
42
|
}
|
|
39
|
-
return { fileDataItems };
|
|
43
|
+
return { dataItems, fileDataItems };
|
|
40
44
|
}
|
|
41
45
|
case 'RESET_LOCATION_ITEMS': {
|
|
42
46
|
return DEFAULT_STATE;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selection utility functions for LocationItems
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get selected files from dataItems
|
|
6
|
+
*/
|
|
7
|
+
const getSelectedFiles = (dataItems) => {
|
|
8
|
+
return dataItems?.filter((item) => item.type === 'FILE') ?? [];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Get selected folders from dataItems
|
|
12
|
+
*/
|
|
13
|
+
const getSelectedFolders = (dataItems) => {
|
|
14
|
+
return dataItems?.filter((item) => item.type === 'FOLDER') ?? [];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Check if selection contains folders
|
|
18
|
+
*/
|
|
19
|
+
const hasSelectedFolders = (dataItems) => {
|
|
20
|
+
return dataItems?.some((item) => item.type === 'FOLDER') ?? false;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Get selection summary
|
|
24
|
+
*/
|
|
25
|
+
const getSelectionSummary = (dataItems) => {
|
|
26
|
+
const files = getSelectedFiles(dataItems);
|
|
27
|
+
const folders = getSelectedFolders(dataItems);
|
|
28
|
+
return {
|
|
29
|
+
total: dataItems?.length ?? 0,
|
|
30
|
+
files: files.length,
|
|
31
|
+
folders: folders.length,
|
|
32
|
+
hasFiles: files.length > 0,
|
|
33
|
+
hasFolders: folders.length > 0,
|
|
34
|
+
isMixed: files.length > 0 && folders.length > 0,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export { getSelectedFiles, getSelectedFolders, getSelectionSummary, hasSelectedFolders };
|
|
@@ -12,7 +12,7 @@ const DEPRECATED_PROP_KEYS = ['actionType', 'location', 'path'];
|
|
|
12
12
|
const template = (key, index, values) => `\`${key}\`${index < values.length - 1 ? ', ' : ''}`;
|
|
13
13
|
const getMissingLocationKeys = (location) => location === null
|
|
14
14
|
? []
|
|
15
|
-
: REQUIRED_LOCATION_KEYS.filter((key) =>
|
|
15
|
+
: REQUIRED_LOCATION_KEYS.filter((key) => location[key] === undefined || location[key] === null);
|
|
16
16
|
let didWarnConflictingBehavior = false;
|
|
17
17
|
let didWarnDeprecatedAndConflictingProps = false;
|
|
18
18
|
let didWarnDeprecatedProps = false;
|
|
@@ -92,20 +92,29 @@ function useProcessTasks(handler, options) {
|
|
|
92
92
|
: [...tasksRef.current.values()].find(({ status }) => status === 'QUEUED') ?? {};
|
|
93
93
|
if (!data)
|
|
94
94
|
return;
|
|
95
|
+
const all = isSingleTask
|
|
96
|
+
? [_input.data]
|
|
97
|
+
: [...tasksRef.current.values()].map(({ data }) => data);
|
|
95
98
|
const { onTaskCancel, onTaskComplete, onTaskError, onTaskProgress, onTaskSuccess, } = callbacksRef.current;
|
|
96
99
|
const getTask = () => tasksRef.current.get(data.id);
|
|
97
100
|
const { options } = _input;
|
|
98
101
|
const { onProgress: _onProgress } = options ?? {};
|
|
99
|
-
const onProgress = ({ id },
|
|
100
|
-
const
|
|
102
|
+
const onProgress = ({ id }, progressDetails, status = 'PENDING') => {
|
|
103
|
+
const isNumber = typeof progressDetails === 'number';
|
|
104
|
+
const task = updateTask(id, {
|
|
105
|
+
progress: isNumber ? progressDetails : progressDetails.progress,
|
|
106
|
+
failureCount: isNumber ? undefined : progressDetails.failureCount,
|
|
107
|
+
successCount: isNumber ? undefined : progressDetails.successCount,
|
|
108
|
+
status,
|
|
109
|
+
});
|
|
101
110
|
if (task && isFunction(onTaskProgress)) {
|
|
102
|
-
onTaskProgress(task,
|
|
111
|
+
onTaskProgress(task, progressDetails);
|
|
103
112
|
}
|
|
104
113
|
if (task && isFunction(_onProgress)) {
|
|
105
|
-
_onProgress(data,
|
|
114
|
+
_onProgress(data, progressDetails, status);
|
|
106
115
|
}
|
|
107
116
|
};
|
|
108
|
-
const input = { ..._input, data, options: { ...options, onProgress } };
|
|
117
|
+
const input = { ..._input, data, all, options: { ...options, onProgress } };
|
|
109
118
|
const { cancel: _cancel, result } = handler(input);
|
|
110
119
|
const cancel = !_cancel
|
|
111
120
|
? undefined
|
|
@@ -5,7 +5,10 @@ const isProcessingTasks = (statusCounts) => {
|
|
|
5
5
|
if (statusCounts.TOTAL === 0 || statusCounts.TOTAL === statusCounts.QUEUED) {
|
|
6
6
|
return false;
|
|
7
7
|
}
|
|
8
|
-
return !(statusCounts.QUEUED === 0 &&
|
|
8
|
+
return !(statusCounts.QUEUED === 0 &&
|
|
9
|
+
statusCounts.PENDING === 0 &&
|
|
10
|
+
statusCounts.LOADED === 0 &&
|
|
11
|
+
statusCounts.FINISHING === 0);
|
|
9
12
|
};
|
|
10
13
|
const hasCompletedProcessingTasks = (statusCounts) => {
|
|
11
14
|
if (statusCounts.TOTAL === 0 || isProcessingTasks(statusCounts))
|
|
@@ -21,7 +21,7 @@ function useHandler(handler, options) {
|
|
|
21
21
|
handleProcessing({
|
|
22
22
|
config,
|
|
23
23
|
...(hasData
|
|
24
|
-
? { data: input.data }
|
|
24
|
+
? { data: input.data, all: [input.data] }
|
|
25
25
|
: // if no `data` provided, provide `concurrency` to `options`
|
|
26
26
|
{ options: { concurrency: DEFAULT_ACTION_CONCURRENCY } }),
|
|
27
27
|
});
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { isFunction } from '@aws-amplify/ui';
|
|
2
|
-
import '@aws-amplify/storage/internals';
|
|
3
|
-
import 'aws-amplify';
|
|
4
|
-
import 'aws-amplify/storage';
|
|
5
|
-
import '../actions/configs/context.mjs';
|
|
6
2
|
import { isDefaultActionViewType } from '../actions/configs/defaults.mjs';
|
|
7
3
|
|
|
8
4
|
const resolveHandler = (value) => (isFunction(value) ? value : value.handler);
|
|
@@ -11,9 +11,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
11
11
|
import '../../../credentials/context.mjs';
|
|
12
12
|
import '@aws-amplify/storage/internals';
|
|
13
13
|
import '../../../configuration/context.mjs';
|
|
14
|
-
import 'aws-amplify';
|
|
15
|
-
import 'aws-amplify/storage';
|
|
16
|
-
import '../../../actions/configs/context.mjs';
|
|
17
14
|
import '../../../actions/configs/defaults.mjs';
|
|
18
15
|
import '../../../displayText/context.mjs';
|
|
19
16
|
import '../../../filePreview/context.mjs';
|
package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyViewProvider.mjs
CHANGED
|
@@ -11,15 +11,16 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
11
11
|
import '../../../credentials/context.mjs';
|
|
12
12
|
import '@aws-amplify/storage/internals';
|
|
13
13
|
import '../../../configuration/context.mjs';
|
|
14
|
-
import 'aws-amplify';
|
|
15
|
-
import 'aws-amplify/storage';
|
|
16
|
-
import '../../../actions/configs/context.mjs';
|
|
17
14
|
import '../../../actions/configs/defaults.mjs';
|
|
18
15
|
import { useDisplayText } from '../../../displayText/context.mjs';
|
|
19
16
|
import '../../../filePreview/context.mjs';
|
|
20
17
|
import useResolveTableData from '../../hooks/useResolveTableData/useResolveTableData.mjs';
|
|
21
18
|
import { COPY_TABLE_RESOLVERS } from '../../utils/tableResolvers/copyResolvers.mjs';
|
|
22
19
|
import { FILE_DATA_ITEM_TABLE_KEYS } from '../../utils/tableResolvers/constants.mjs';
|
|
20
|
+
import 'aws-amplify';
|
|
21
|
+
import 'jszip';
|
|
22
|
+
import 'aws-amplify/storage';
|
|
23
|
+
import '../../../actions/configs/context.mjs';
|
|
23
24
|
import { FoldersMessageProvider } from './FoldersMessageControl.mjs';
|
|
24
25
|
import { FoldersPaginationProvider } from './FoldersPaginationControl.mjs';
|
|
25
26
|
import { FoldersTableProvider } from './FoldersTableControl.mjs';
|
|
@@ -13,9 +13,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
13
13
|
import '../../../credentials/context.mjs';
|
|
14
14
|
import '@aws-amplify/storage/internals';
|
|
15
15
|
import '../../../configuration/context.mjs';
|
|
16
|
-
import 'aws-amplify';
|
|
17
|
-
import 'aws-amplify/storage';
|
|
18
|
-
import '../../../actions/configs/context.mjs';
|
|
19
16
|
import '../../../actions/configs/defaults.mjs';
|
|
20
17
|
import { useDisplayText } from '../../../displayText/context.mjs';
|
|
21
18
|
import '../../../filePreview/context.mjs';
|
package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/useCopyView.mjs
CHANGED
|
@@ -9,9 +9,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
9
9
|
import '../../../credentials/context.mjs';
|
|
10
10
|
import '@aws-amplify/storage/internals';
|
|
11
11
|
import '../../../configuration/context.mjs';
|
|
12
|
-
import 'aws-amplify';
|
|
13
|
-
import 'aws-amplify/storage';
|
|
14
|
-
import '../../../actions/configs/context.mjs';
|
|
15
12
|
import '../../../actions/configs/defaults.mjs';
|
|
16
13
|
import { useFolders } from './useFolders.mjs';
|
|
17
14
|
|
|
@@ -6,9 +6,6 @@ import '@aws-amplify/storage/internals';
|
|
|
6
6
|
import '../../../configuration/context.mjs';
|
|
7
7
|
import '@aws-amplify/ui';
|
|
8
8
|
import { useList } from '../../../useAction/useList.mjs';
|
|
9
|
-
import 'aws-amplify';
|
|
10
|
-
import 'aws-amplify/storage';
|
|
11
|
-
import '../../../actions/configs/context.mjs';
|
|
12
9
|
import '../../../actions/configs/defaults.mjs';
|
|
13
10
|
import { usePaginate } from '../../hooks/usePaginate.mjs';
|
|
14
11
|
import { useSearch } from '../../hooks/useSearch.mjs';
|
|
@@ -11,9 +11,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
11
11
|
import '../../../credentials/context.mjs';
|
|
12
12
|
import '@aws-amplify/storage/internals';
|
|
13
13
|
import '../../../configuration/context.mjs';
|
|
14
|
-
import 'aws-amplify';
|
|
15
|
-
import 'aws-amplify/storage';
|
|
16
|
-
import '../../../actions/configs/context.mjs';
|
|
17
14
|
import '../../../actions/configs/defaults.mjs';
|
|
18
15
|
import '../../../displayText/context.mjs';
|
|
19
16
|
import '../../../filePreview/context.mjs';
|
|
@@ -7,9 +7,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
7
7
|
import '../../../credentials/context.mjs';
|
|
8
8
|
import '@aws-amplify/storage/internals';
|
|
9
9
|
import '../../../configuration/context.mjs';
|
|
10
|
-
import 'aws-amplify';
|
|
11
|
-
import 'aws-amplify/storage';
|
|
12
|
-
import '../../../actions/configs/context.mjs';
|
|
13
10
|
import '../../../actions/configs/defaults.mjs';
|
|
14
11
|
import { useStore } from '../../../store/context.mjs';
|
|
15
12
|
|
package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteView.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
|
+
import { classNames } from '@aws-amplify/ui';
|
|
2
3
|
import '@aws-amplify/ui-react';
|
|
3
4
|
import { ViewElement } from '../../../components/elements/definitions.mjs';
|
|
4
5
|
import '../../../components/elements/IconElement.mjs';
|
|
5
6
|
import { ActionCancelControl } from '../../../controls/ActionCancelControl.mjs';
|
|
7
|
+
import { ActionConfirmationModalControl } from '../../../controls/ActionConfirmationModalControl.mjs';
|
|
6
8
|
import { ActionExitControl } from '../../../controls/ActionExitControl.mjs';
|
|
7
9
|
import { ActionStartControl } from '../../../controls/ActionStartControl.mjs';
|
|
8
10
|
import { DataTableControl } from '../../../controls/DataTableControl.mjs';
|
|
9
11
|
import { MessageControl } from '../../../controls/MessageControl.mjs';
|
|
10
12
|
import { StatusDisplayControl } from '../../../controls/StatusDisplayControl.mjs';
|
|
11
13
|
import { TitleControl } from '../../../controls/TitleControl.mjs';
|
|
12
|
-
import { classNames } from '@aws-amplify/ui';
|
|
13
14
|
import { STORAGE_BROWSER_BLOCK } from '../../../components/base/constants.mjs';
|
|
14
15
|
import '../../../components/composables/context.mjs';
|
|
15
16
|
import '@aws-amplify/ui-react-core';
|
|
@@ -18,9 +19,6 @@ import '@aws-amplify/ui-react-core/elements';
|
|
|
18
19
|
import '../../../credentials/context.mjs';
|
|
19
20
|
import '@aws-amplify/storage/internals';
|
|
20
21
|
import '../../../configuration/context.mjs';
|
|
21
|
-
import 'aws-amplify';
|
|
22
|
-
import 'aws-amplify/storage';
|
|
23
|
-
import '../../../actions/configs/context.mjs';
|
|
24
22
|
import '../../../actions/configs/defaults.mjs';
|
|
25
23
|
import '../../../displayText/context.mjs';
|
|
26
24
|
import '../../../filePreview/context.mjs';
|
|
@@ -42,11 +40,13 @@ const DeleteView = ({ className, ...props }) => {
|
|
|
42
40
|
React__default.createElement(MessageControl, null)),
|
|
43
41
|
React__default.createElement(ViewElement, { className: `${STORAGE_BROWSER_BLOCK}__buttons` },
|
|
44
42
|
React__default.createElement(ActionCancelControl, null),
|
|
45
|
-
React__default.createElement(ActionStartControl, null)))
|
|
43
|
+
React__default.createElement(ActionStartControl, null))),
|
|
44
|
+
React__default.createElement(ActionConfirmationModalControl, null))));
|
|
46
45
|
};
|
|
47
46
|
DeleteView.displayName = 'DeleteView';
|
|
48
47
|
DeleteView.Provider = DeleteViewProvider;
|
|
49
48
|
DeleteView.Cancel = ActionCancelControl;
|
|
49
|
+
DeleteView.ConfirmationModal = ActionConfirmationModalControl;
|
|
50
50
|
DeleteView.Exit = ActionExitControl;
|
|
51
51
|
DeleteView.Message = MessageControl;
|
|
52
52
|
DeleteView.Start = ActionStartControl;
|
|
@@ -3,18 +3,18 @@ import { ControlsContextProvider } from '../../../controls/context.mjs';
|
|
|
3
3
|
import { useDisplayText } from '../../../displayText/context.mjs';
|
|
4
4
|
import useResolveTableData from '../../hooks/useResolveTableData/useResolveTableData.mjs';
|
|
5
5
|
import '@aws-amplify/ui';
|
|
6
|
-
import {
|
|
6
|
+
import { DELETE_TABLE_KEYS } from '../../utils/tableResolvers/constants.mjs';
|
|
7
7
|
import { DELETE_TABLE_RESOLVERS } from '../../utils/tableResolvers/deleteResolvers.mjs';
|
|
8
8
|
|
|
9
9
|
function DeleteViewProvider({ children, ...props }) {
|
|
10
10
|
const { DeleteView: displayText } = useDisplayText();
|
|
11
11
|
const { actionCancelLabel, actionExitLabel, actionStartLabel, title, statusDisplayCanceledLabel, statusDisplayCompletedLabel, statusDisplayFailedLabel, statusDisplayQueuedLabel, getActionCompleteMessage, } = displayText;
|
|
12
|
-
const { isProcessing, isProcessingComplete, statusCounts, tasks
|
|
12
|
+
const { isProcessing, isProcessingComplete, statusCounts, tasks, confirmationModal, onActionCancel, onActionStart, onActionExit, onTaskRemove, onConfirmDelete, onCancelConfirmation, } = props;
|
|
13
13
|
const message = isProcessingComplete
|
|
14
|
-
? getActionCompleteMessage({ counts: statusCounts })
|
|
14
|
+
? getActionCompleteMessage({ counts: statusCounts, tasks })
|
|
15
15
|
: undefined;
|
|
16
|
-
const tableData = useResolveTableData(
|
|
17
|
-
items,
|
|
16
|
+
const tableData = useResolveTableData(DELETE_TABLE_KEYS, DELETE_TABLE_RESOLVERS, {
|
|
17
|
+
items: tasks,
|
|
18
18
|
props: { displayText, isProcessing, onTaskRemove },
|
|
19
19
|
});
|
|
20
20
|
return (React__default.createElement(ControlsContextProvider, { data: {
|
|
@@ -32,7 +32,8 @@ function DeleteViewProvider({ children, ...props }) {
|
|
|
32
32
|
tableData,
|
|
33
33
|
title,
|
|
34
34
|
message,
|
|
35
|
-
|
|
35
|
+
confirmationModal,
|
|
36
|
+
}, onActionStart: onActionStart, onActionExit: onActionExit, onActionCancel: onActionCancel, onConfirmationModalConfirm: onConfirmDelete, onConfirmationModalCancel: onCancelConfirmation }, children));
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
export { DeleteViewProvider };
|