@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.
Files changed (101) hide show
  1. package/dist/browser.js +8 -2
  2. package/dist/{createStorageBrowser-CotOvK0A.js → createStorageBrowser-B-J76Lyp.js} +1012 -249
  3. package/dist/esm/browser.mjs +1 -0
  4. package/dist/esm/components/StorageBrowser/ErrorBoundary/ErrorBoundary.mjs +0 -3
  5. package/dist/esm/components/StorageBrowser/StorageBrowserAmplify.mjs +1 -0
  6. package/dist/esm/components/StorageBrowser/actions/configs/defaults.mjs +14 -3
  7. package/dist/esm/components/StorageBrowser/actions/handlers/defaults.mjs +1 -1
  8. package/dist/esm/components/StorageBrowser/actions/handlers/delete.mjs +39 -8
  9. package/dist/esm/components/StorageBrowser/actions/handlers/listLocations.mjs +7 -2
  10. package/dist/esm/components/StorageBrowser/actions/handlers/utils.mjs +65 -1
  11. package/dist/esm/components/StorageBrowser/actions/handlers/zipdownload.mjs +195 -0
  12. package/dist/esm/components/StorageBrowser/adapters/createAmplifyAuthAdapter/createAmplifyListLocationsHandler.mjs +3 -1
  13. package/dist/esm/components/StorageBrowser/adapters/createManagedAuthAdapter/createManagedAuthAdapter.mjs +1 -0
  14. package/dist/esm/components/StorageBrowser/components/ComponentsProvider.mjs +0 -3
  15. package/dist/esm/components/StorageBrowser/components/base/preview/DownloadButton.mjs +0 -3
  16. package/dist/esm/components/StorageBrowser/components/composables/ActionConfirmationModal.mjs +34 -0
  17. package/dist/esm/components/StorageBrowser/components/composables/defaults.mjs +2 -0
  18. package/dist/esm/components/StorageBrowser/components/elements/definitions.mjs +2 -2
  19. package/dist/esm/components/StorageBrowser/controls/ActionConfirmationModalControl.mjs +12 -0
  20. package/dist/esm/components/StorageBrowser/controls/DataTableControl.mjs +0 -3
  21. package/dist/esm/components/StorageBrowser/controls/hooks/useActionConfirmationModal.mjs +17 -0
  22. package/dist/esm/components/StorageBrowser/createStorageBrowser/StorageBrowserDefault.mjs +8 -3
  23. package/dist/esm/components/StorageBrowser/createStorageBrowser/createProvider.mjs +1 -0
  24. package/dist/esm/components/StorageBrowser/createStorageBrowser/createStorageBrowser.mjs +9 -4
  25. package/dist/esm/components/StorageBrowser/displayText/libraries/en/deleteView.mjs +117 -5
  26. package/dist/esm/components/StorageBrowser/displayText/libraries/en/downloadView.mjs +2 -0
  27. package/dist/esm/components/StorageBrowser/displayText/libraries/en/locationDetailView.mjs +1 -0
  28. package/dist/esm/components/StorageBrowser/displayText/libraries/en/shared.mjs +3 -0
  29. package/dist/esm/components/StorageBrowser/locationItems/context.mjs +18 -14
  30. package/dist/esm/components/StorageBrowser/locationItems/utils.mjs +38 -0
  31. package/dist/esm/components/StorageBrowser/store/validateStoreProps.mjs +1 -1
  32. package/dist/esm/components/StorageBrowser/tasks/constants.mjs +2 -0
  33. package/dist/esm/components/StorageBrowser/tasks/useProcessTasks.mjs +14 -5
  34. package/dist/esm/components/StorageBrowser/tasks/utils.mjs +4 -1
  35. package/dist/esm/components/StorageBrowser/useAction/useHandler.mjs +1 -1
  36. package/dist/esm/components/StorageBrowser/useAction/utils.mjs +0 -4
  37. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyView.mjs +0 -3
  38. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyViewProvider.mjs +4 -3
  39. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/FoldersMessageControl.mjs +0 -3
  40. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/useCopyView.mjs +0 -3
  41. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/useFolders.mjs +0 -3
  42. package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/CreateFolderView.mjs +0 -3
  43. package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/useCreateFolderView.mjs +0 -3
  44. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteView.mjs +5 -5
  45. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteViewProvider.mjs +7 -6
  46. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/useDeleteView.mjs +69 -6
  47. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/utils.mjs +87 -0
  48. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadView.mjs +0 -3
  49. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadViewProvider.mjs +9 -0
  50. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/useDownloadView.mjs +0 -3
  51. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadView.mjs +1 -4
  52. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadViewProvider.mjs +4 -0
  53. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/useUploadView.mjs +0 -3
  54. package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailView.mjs +0 -3
  55. package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailViewProvider.mjs +2 -1
  56. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFolderRowContent.mjs +38 -27
  57. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.mjs +9 -1
  58. package/dist/esm/components/StorageBrowser/views/LocationDetailView/useLocationDetailView.mjs +11 -9
  59. package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsView.mjs +0 -3
  60. package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsViewProvider.mjs +0 -3
  61. package/dist/esm/components/StorageBrowser/views/LocationsView/useLocationsView.mjs +1 -0
  62. package/dist/esm/components/StorageBrowser/views/context/actionViews.mjs +7 -3
  63. package/dist/esm/components/StorageBrowser/views/context/primaryViews.mjs +8 -3
  64. package/dist/esm/components/StorageBrowser/views/hooks/useFilePreview/useFilePreview.mjs +1 -0
  65. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/constants.mjs +14 -1
  66. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.mjs +123 -13
  67. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/utils.mjs +4 -4
  68. package/dist/esm/version.mjs +1 -1
  69. package/dist/index.js +2 -1
  70. package/dist/styles.css +100 -1
  71. package/dist/types/components/StorageBrowser/actions/handlers/delete.d.ts +5 -3
  72. package/dist/types/components/StorageBrowser/actions/handlers/index.d.ts +1 -0
  73. package/dist/types/components/StorageBrowser/actions/handlers/types.d.ts +18 -2
  74. package/dist/types/components/StorageBrowser/actions/handlers/utils.d.ts +11 -0
  75. package/dist/types/components/StorageBrowser/actions/handlers/zipdownload.d.ts +3 -0
  76. package/dist/types/components/StorageBrowser/components/composables/ActionConfirmationModal.d.ts +12 -0
  77. package/dist/types/components/StorageBrowser/components/composables/types.d.ts +2 -0
  78. package/dist/types/components/StorageBrowser/controls/ActionConfirmationModalControl.d.ts +2 -0
  79. package/dist/types/components/StorageBrowser/controls/hooks/useActionConfirmationModal.d.ts +2 -0
  80. package/dist/types/components/StorageBrowser/controls/index.d.ts +1 -0
  81. package/dist/types/components/StorageBrowser/controls/types.d.ts +4 -0
  82. package/dist/types/components/StorageBrowser/displayText/types.d.ts +9 -0
  83. package/dist/types/components/StorageBrowser/locationItems/context.d.ts +12 -3
  84. package/dist/types/components/StorageBrowser/locationItems/index.d.ts +1 -0
  85. package/dist/types/components/StorageBrowser/locationItems/utils.d.ts +27 -0
  86. package/dist/types/components/StorageBrowser/tasks/types.d.ts +10 -5
  87. package/dist/types/components/StorageBrowser/tasks/useProcessTasks.d.ts +1 -1
  88. package/dist/types/components/StorageBrowser/useAction/useHandler.d.ts +1 -1
  89. package/dist/types/components/StorageBrowser/views/LocationActionView/DeleteView/types.d.ts +5 -0
  90. package/dist/types/components/StorageBrowser/views/LocationActionView/DeleteView/utils.d.ts +26 -0
  91. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFolderRowContent.d.ts +4 -1
  92. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.d.ts +3 -2
  93. package/dist/types/components/StorageBrowser/views/LocationDetailView/types.d.ts +8 -1
  94. package/dist/types/components/StorageBrowser/views/utils/index.d.ts +1 -1
  95. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/constants.d.ts +5 -0
  96. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.d.ts +5 -2
  97. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/index.d.ts +1 -1
  98. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/types.d.ts +4 -0
  99. package/dist/types/version.d.ts +1 -1
  100. package/package.json +12 -9
  101. 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 { content: 'All files deleted.', type: 'success' };
117
+ return {
118
+ content: `${formatCount(TOTAL, 'item')} deleted successfully.`,
119
+ type: 'success',
120
+ };
12
121
  }
13
122
  if (FAILED === TOTAL) {
14
- return { content: 'All files failed to delete.', type: 'error' };
123
+ return {
124
+ content: `Failed to delete ${formatCount(TOTAL, 'item')}.`,
125
+ type: 'error',
126
+ };
15
127
  }
16
128
  return {
17
- content: `${COMPLETE} files deleted, ${FAILED} files failed to delete.`,
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
- if (!prevState.fileDataItems?.length) {
20
- return { fileDataItems: items.map(createFileDataItem) };
21
- }
22
- const nextFileDataItems = items?.reduce((fileDataItems, data) => prevState.fileDataItems?.some(({ id }) => id === data.id)
23
- ? fileDataItems
24
- : fileDataItems.concat(createFileDataItem(data)), []);
25
- if (!nextFileDataItems?.length)
26
- return prevState;
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
- fileDataItems: prevState.fileDataItems.concat(nextFileDataItems),
31
+ dataItems: nextDataItems,
32
+ fileDataItems: nextFileDataItems,
29
33
  };
30
34
  }
31
35
  case 'REMOVE_LOCATION_ITEM': {
32
36
  const { id } = event;
33
- if (!prevState.fileDataItems)
34
- return prevState;
35
- const fileDataItems = prevState.fileDataItems.filter((item) => item.id !== id);
36
- if (fileDataItems.length === prevState.fileDataItems.length) {
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) => !location[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;
@@ -1,8 +1,10 @@
1
1
  const INITIAL_STATUS_COUNTS = {
2
2
  CANCELED: 0,
3
3
  COMPLETE: 0,
4
+ LOADED: 0,
4
5
  FAILED: 0,
5
6
  PENDING: 0,
7
+ FINISHING: 0,
6
8
  OVERWRITE_PREVENTED: 0,
7
9
  QUEUED: 0,
8
10
  TOTAL: 0,
@@ -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 }, progress) => {
100
- const task = updateTask(id, { progress });
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, progress);
111
+ onTaskProgress(task, progressDetails);
103
112
  }
104
113
  if (task && isFunction(_onProgress)) {
105
- _onProgress(data, progress);
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 && statusCounts.PENDING === 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';
@@ -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';
@@ -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
 
@@ -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 { FILE_DATA_ITEM_TABLE_KEYS } from '../../utils/tableResolvers/constants.mjs';
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: items, onActionCancel, onActionStart, onActionExit, onTaskRemove, } = props;
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(FILE_DATA_ITEM_TABLE_KEYS, DELETE_TABLE_RESOLVERS, {
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
- }, onActionStart: onActionStart, onActionExit: onActionExit, onActionCancel: onActionCancel }, children));
35
+ confirmationModal,
36
+ }, onActionStart: onActionStart, onActionExit: onActionExit, onActionCancel: onActionCancel, onConfirmationModalConfirm: onConfirmDelete, onConfirmationModalCancel: onCancelConfirmation }, children));
36
37
  }
37
38
 
38
39
  export { DeleteViewProvider };