@scality/data-browser-library 1.0.0-preview.2

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 (176) hide show
  1. package/dist/components/Editor.d.ts +12 -0
  2. package/dist/components/Editor.js +28 -0
  3. package/dist/components/__tests__/BucketList.test.d.ts +1 -0
  4. package/dist/components/__tests__/BucketList.test.js +225 -0
  5. package/dist/components/__tests__/BucketOverview.test.d.ts +1 -0
  6. package/dist/components/__tests__/BucketOverview.test.js +479 -0
  7. package/dist/components/__tests__/BucketPolicyPage.test.d.ts +1 -0
  8. package/dist/components/__tests__/BucketPolicyPage.test.js +213 -0
  9. package/dist/components/__tests__/CreateFolderButton.test.d.ts +1 -0
  10. package/dist/components/__tests__/CreateFolderButton.test.js +147 -0
  11. package/dist/components/__tests__/DeleteBucketButton.test.d.ts +1 -0
  12. package/dist/components/__tests__/DeleteBucketButton.test.js +272 -0
  13. package/dist/components/__tests__/DeleteObjectButton.test.d.ts +1 -0
  14. package/dist/components/__tests__/DeleteObjectButton.test.js +302 -0
  15. package/dist/components/__tests__/MetadataSearch.test.d.ts +1 -0
  16. package/dist/components/__tests__/MetadataSearch.test.js +201 -0
  17. package/dist/components/__tests__/ObjectList.test.d.ts +1 -0
  18. package/dist/components/__tests__/ObjectList.test.js +283 -0
  19. package/dist/components/__tests__/UploadButton.test.d.ts +1 -0
  20. package/dist/components/__tests__/UploadButton.test.js +144 -0
  21. package/dist/components/buckets/BucketDetails.d.ts +1 -0
  22. package/dist/components/buckets/BucketDetails.js +51 -0
  23. package/dist/components/buckets/BucketList.d.ts +12 -0
  24. package/dist/components/buckets/BucketList.js +136 -0
  25. package/dist/components/buckets/BucketLocation.d.ts +3 -0
  26. package/dist/components/buckets/BucketLocation.js +16 -0
  27. package/dist/components/buckets/BucketOverview.d.ts +14 -0
  28. package/dist/components/buckets/BucketOverview.js +209 -0
  29. package/dist/components/buckets/BucketPage.d.ts +2 -0
  30. package/dist/components/buckets/BucketPage.js +47 -0
  31. package/dist/components/buckets/BucketPolicyButton.d.ts +7 -0
  32. package/dist/components/buckets/BucketPolicyButton.js +18 -0
  33. package/dist/components/buckets/BucketPolicyPage.d.ts +1 -0
  34. package/dist/components/buckets/BucketPolicyPage.js +205 -0
  35. package/dist/components/buckets/DeleteBucketButton.d.ts +8 -0
  36. package/dist/components/buckets/DeleteBucketButton.js +78 -0
  37. package/dist/components/index.d.ts +12 -0
  38. package/dist/components/index.js +13 -0
  39. package/dist/components/layouts/BrowserPageLayout.d.ts +9 -0
  40. package/dist/components/layouts/BrowserPageLayout.js +46 -0
  41. package/dist/components/objects/CreateFolderButton.d.ts +29 -0
  42. package/dist/components/objects/CreateFolderButton.js +118 -0
  43. package/dist/components/objects/DeleteObjectButton.d.ts +8 -0
  44. package/dist/components/objects/DeleteObjectButton.js +191 -0
  45. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -0
  46. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +323 -0
  47. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +3 -0
  48. package/dist/components/objects/ObjectDetails/ObjectSummary.js +193 -0
  49. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +3 -0
  50. package/dist/components/objects/ObjectDetails/ObjectTags.js +300 -0
  51. package/dist/components/objects/ObjectDetails/index.d.ts +9 -0
  52. package/dist/components/objects/ObjectDetails/index.js +49 -0
  53. package/dist/components/objects/ObjectList.d.ts +40 -0
  54. package/dist/components/objects/ObjectList.js +407 -0
  55. package/dist/components/objects/ObjectPage.d.ts +1 -0
  56. package/dist/components/objects/ObjectPage.js +43 -0
  57. package/dist/components/objects/UploadButton.d.ts +34 -0
  58. package/dist/components/objects/UploadButton.js +229 -0
  59. package/dist/components/providers/DataBrowserProvider.d.ts +20 -0
  60. package/dist/components/providers/DataBrowserProvider.js +42 -0
  61. package/dist/components/search/MetadataSearch.d.ts +5 -0
  62. package/dist/components/search/MetadataSearch.js +162 -0
  63. package/dist/components/search/SearchHints.d.ts +8 -0
  64. package/dist/components/search/SearchHints.js +21 -0
  65. package/dist/components/ui/DeleteObjectModalContent.d.ts +5 -0
  66. package/dist/components/ui/DeleteObjectModalContent.js +71 -0
  67. package/dist/components/ui/Search.elements.d.ts +17 -0
  68. package/dist/components/ui/Search.elements.js +59 -0
  69. package/dist/components/ui/Table.elements.d.ts +36 -0
  70. package/dist/components/ui/Table.elements.js +87 -0
  71. package/dist/config/factory.d.ts +52 -0
  72. package/dist/config/factory.js +70 -0
  73. package/dist/config/types.d.ts +46 -0
  74. package/dist/config/types.js +0 -0
  75. package/dist/hooks/__tests__/useIsBucketEmpty.test.d.ts +1 -0
  76. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +122 -0
  77. package/dist/hooks/bucketConfiguration.d.ts +147 -0
  78. package/dist/hooks/bucketConfiguration.js +59 -0
  79. package/dist/hooks/bucketOperations.d.ts +36 -0
  80. package/dist/hooks/bucketOperations.js +12 -0
  81. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.d.ts +1 -0
  82. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +276 -0
  83. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.d.ts +1 -0
  84. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +259 -0
  85. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.d.ts +1 -0
  86. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +166 -0
  87. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.d.ts +1 -0
  88. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +200 -0
  89. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.d.ts +1 -0
  90. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +136 -0
  91. package/dist/hooks/factories/index.d.ts +18 -0
  92. package/dist/hooks/factories/index.js +5 -0
  93. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +13 -0
  94. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +76 -0
  95. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +8 -0
  96. package/dist/hooks/factories/useCreateS3LoginHook.js +22 -0
  97. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +5 -0
  98. package/dist/hooks/factories/useCreateS3MutationHook.js +50 -0
  99. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +3 -0
  100. package/dist/hooks/factories/useCreateS3QueryHook.js +30 -0
  101. package/dist/hooks/index.d.ts +8 -0
  102. package/dist/hooks/index.js +8 -0
  103. package/dist/hooks/loginOperations.d.ts +21 -0
  104. package/dist/hooks/loginOperations.js +9 -0
  105. package/dist/hooks/objectOperations.d.ts +190 -0
  106. package/dist/hooks/objectOperations.js +66 -0
  107. package/dist/hooks/presignedOperations.d.ts +73 -0
  108. package/dist/hooks/presignedOperations.js +72 -0
  109. package/dist/hooks/useIsBucketEmpty.d.ts +7 -0
  110. package/dist/hooks/useIsBucketEmpty.js +36 -0
  111. package/dist/hooks/useLoginMutation.d.ts +21 -0
  112. package/dist/hooks/useLoginMutation.js +9 -0
  113. package/dist/hooks/useS3Client.d.ts +1 -0
  114. package/dist/hooks/useS3Client.js +13 -0
  115. package/dist/index.d.ts +6 -0
  116. package/dist/index.js +6 -0
  117. package/dist/schemas/bucketPolicySchema.json +321 -0
  118. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -0
  119. package/dist/test/msw/handlers/deleteBucket.js +14 -0
  120. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -0
  121. package/dist/test/msw/handlers/getBucketAcl.js +96 -0
  122. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -0
  123. package/dist/test/msw/handlers/getBucketLocation.js +23 -0
  124. package/dist/test/msw/handlers/getBucketPolicy.d.ts +11 -0
  125. package/dist/test/msw/handlers/getBucketPolicy.js +72 -0
  126. package/dist/test/msw/handlers/headObject.d.ts +1 -0
  127. package/dist/test/msw/handlers/headObject.js +17 -0
  128. package/dist/test/msw/handlers/listBuckets.d.ts +1 -0
  129. package/dist/test/msw/handlers/listBuckets.js +24 -0
  130. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -0
  131. package/dist/test/msw/handlers/listObjectVersions.js +83 -0
  132. package/dist/test/msw/handlers/listObjects.d.ts +1 -0
  133. package/dist/test/msw/handlers/listObjects.js +66 -0
  134. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -0
  135. package/dist/test/msw/handlers/objectLegalHold.js +24 -0
  136. package/dist/test/msw/handlers/objectRetention.d.ts +1 -0
  137. package/dist/test/msw/handlers/objectRetention.js +27 -0
  138. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -0
  139. package/dist/test/msw/handlers/putBucketAcl.js +18 -0
  140. package/dist/test/msw/handlers/putObject.d.ts +1 -0
  141. package/dist/test/msw/handlers/putObject.js +16 -0
  142. package/dist/test/msw/handlers.d.ts +4 -0
  143. package/dist/test/msw/handlers.js +109 -0
  144. package/dist/test/msw/index.d.ts +2 -0
  145. package/dist/test/msw/index.js +3 -0
  146. package/dist/test/msw/server.d.ts +4 -0
  147. package/dist/test/msw/server.js +20 -0
  148. package/dist/test/msw/utils.d.ts +2 -0
  149. package/dist/test/msw/utils.js +13 -0
  150. package/dist/test/setup.d.ts +1 -0
  151. package/dist/test/setup.js +82 -0
  152. package/dist/test/testUtils.d.ts +82 -0
  153. package/dist/test/testUtils.js +236 -0
  154. package/dist/test/utils/errorHandling.test.d.ts +1 -0
  155. package/dist/test/utils/errorHandling.test.js +385 -0
  156. package/dist/types/index.d.ts +48 -0
  157. package/dist/types/index.js +0 -0
  158. package/dist/utils/deletion/index.d.ts +2 -0
  159. package/dist/utils/deletion/index.js +2 -0
  160. package/dist/utils/deletion/messages.d.ts +5 -0
  161. package/dist/utils/deletion/messages.js +29 -0
  162. package/dist/utils/deletion/types.d.ts +11 -0
  163. package/dist/utils/deletion/types.js +0 -0
  164. package/dist/utils/errorHandling.d.ts +54 -0
  165. package/dist/utils/errorHandling.js +79 -0
  166. package/dist/utils/hooks.d.ts +2 -0
  167. package/dist/utils/hooks.js +26 -0
  168. package/dist/utils/index.d.ts +2 -0
  169. package/dist/utils/index.js +2 -0
  170. package/dist/utils/proxyMiddleware.d.ts +18 -0
  171. package/dist/utils/proxyMiddleware.js +56 -0
  172. package/dist/utils/s3Client.d.ts +5 -0
  173. package/dist/utils/s3Client.js +35 -0
  174. package/dist/utils/useFeatures.d.ts +1 -0
  175. package/dist/utils/useFeatures.js +7 -0
  176. package/package.json +79 -0
@@ -0,0 +1,407 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { ConstrainedText, FormattedDateTime, Icon, Link, PrettyBytes, Text, Toggle, Wrap, spacing } from "@scality/core-ui";
3
+ import { Box, Table } from "@scality/core-ui/dist/next";
4
+ import { useCallback, useEffect, useMemo, useState } from "react";
5
+ import { useSearchObjects, useSearchObjectsVersions } from "../../hooks/index.js";
6
+ import { useQueryParams } from "../../utils/hooks.js";
7
+ import { useFeatures } from "../../utils/useFeatures.js";
8
+ import CreateFolderButton from "./CreateFolderButton.js";
9
+ import MetadataSearch from "../search/MetadataSearch.js";
10
+ import UploadButton from "./UploadButton.js";
11
+ import DeleteObjectButton from "./DeleteObjectButton.js";
12
+ const DEFAULT_PAGE_SIZE = 20;
13
+ const getVersionTextColor = (row)=>{
14
+ const isLatest = row.original.IsLatest;
15
+ const isVersion = "version" === row.original.type;
16
+ return !isLatest && isVersion ? "infoPrimary" : "textPrimary";
17
+ };
18
+ const ObjectList = ({ bucketName, prefix, onObjectSelect, onPrefixChange })=>{
19
+ const [showVersions, setShowVersions] = useState(false);
20
+ const isMetadataSearchEnabled = useFeatures("metadatasearch");
21
+ const metadataSearchQuery = useQueryParams().get("metadatasearch");
22
+ const [selectedObjects, setSelectedObjects] = useState([]);
23
+ const searchParams = useMemo(()=>{
24
+ const baseParams = {
25
+ Bucket: bucketName,
26
+ Prefix: prefix,
27
+ MaxKeys: DEFAULT_PAGE_SIZE,
28
+ Delimiter: "/"
29
+ };
30
+ if (isMetadataSearchEnabled && metadataSearchQuery) return {
31
+ ...baseParams,
32
+ Search: metadataSearchQuery
33
+ };
34
+ return baseParams;
35
+ }, [
36
+ bucketName,
37
+ prefix,
38
+ isMetadataSearchEnabled,
39
+ metadataSearchQuery
40
+ ]);
41
+ const listObjectsQuery = useSearchObjects(searchParams, {
42
+ enabled: !showVersions
43
+ });
44
+ const listVersionsQuery = useSearchObjectsVersions(searchParams, {
45
+ enabled: showVersions
46
+ });
47
+ const activeQuery = showVersions ? listVersionsQuery : listObjectsQuery;
48
+ useEffect(()=>{
49
+ setSelectedObjects([]);
50
+ }, [
51
+ prefix,
52
+ showVersions
53
+ ]);
54
+ const { data, error, hasNextPage, fetchNextPage, isFetchingNextPage, isLoading } = activeQuery;
55
+ const tableData = useMemo(()=>{
56
+ const folders = [];
57
+ const items = [];
58
+ if (showVersions) {
59
+ if (listObjectsQuery.data?.pages) listObjectsQuery.data.pages.forEach((page)=>{
60
+ if (page.CommonPrefixes) page.CommonPrefixes.forEach((cp)=>{
61
+ if (cp.Prefix) {
62
+ const folderName = cp.Prefix.replace(prefix, "").replace(/\/$/, "");
63
+ folders.push({
64
+ Key: cp.Prefix,
65
+ displayName: folderName + "/",
66
+ type: "folder",
67
+ LastModified: void 0,
68
+ Size: void 0
69
+ });
70
+ }
71
+ });
72
+ });
73
+ if (listVersionsQuery.data?.pages) {
74
+ const itemsByKey = {};
75
+ listVersionsQuery.data.pages.forEach((page)=>{
76
+ if (page.Versions) page.Versions.forEach((version)=>{
77
+ if (version.Key) {
78
+ if (!itemsByKey[version.Key]) itemsByKey[version.Key] = [];
79
+ itemsByKey[version.Key].push(version);
80
+ }
81
+ });
82
+ if (page.DeleteMarkers) page.DeleteMarkers.forEach((marker)=>{
83
+ if (marker.Key) {
84
+ if (!itemsByKey[marker.Key]) itemsByKey[marker.Key] = [];
85
+ itemsByKey[marker.Key].push({
86
+ ...marker,
87
+ isDeleteMarker: true
88
+ });
89
+ }
90
+ });
91
+ });
92
+ Object.keys(itemsByKey).sort().forEach((key)=>{
93
+ const allItems = itemsByKey[key];
94
+ allItems.sort((a, b)=>{
95
+ if (a.IsLatest) return -1;
96
+ if (b.IsLatest) return 1;
97
+ const aDate = a.LastModified ? new Date(a.LastModified).getTime() : 0;
98
+ const bDate = b.LastModified ? new Date(b.LastModified).getTime() : 0;
99
+ return bDate - aDate;
100
+ });
101
+ allItems.forEach((item)=>{
102
+ const baseName = item.Key.replace(prefix, "");
103
+ const isLatest = item.IsLatest;
104
+ const isDeleteMarker = "isDeleteMarker" in item && item.isDeleteMarker;
105
+ if (isDeleteMarker) items.push({
106
+ ...item,
107
+ displayName: baseName,
108
+ type: "deleteMarker",
109
+ IsLatest: isLatest,
110
+ isDeleteMarker: true
111
+ });
112
+ else items.push({
113
+ ...item,
114
+ displayName: baseName,
115
+ type: "version",
116
+ IsLatest: isLatest
117
+ });
118
+ });
119
+ });
120
+ }
121
+ } else if (data?.pages) data.pages.forEach((page)=>{
122
+ if (page.CommonPrefixes) page.CommonPrefixes.forEach((cp)=>{
123
+ if (cp.Prefix) {
124
+ const folderName = cp.Prefix.replace(prefix, "").replace(/\/$/, "");
125
+ folders.push({
126
+ Key: cp.Prefix,
127
+ displayName: folderName + "/",
128
+ type: "folder",
129
+ LastModified: void 0,
130
+ Size: void 0
131
+ });
132
+ }
133
+ });
134
+ if (page.Contents) page.Contents.forEach((obj)=>{
135
+ if (obj.Key) items.push({
136
+ ...obj,
137
+ displayName: obj.Key.replace(prefix, ""),
138
+ type: "object"
139
+ });
140
+ });
141
+ });
142
+ const allItems = [
143
+ ...folders,
144
+ ...items
145
+ ];
146
+ return allItems;
147
+ }, [
148
+ data,
149
+ prefix,
150
+ showVersions,
151
+ listObjectsQuery.data,
152
+ listVersionsQuery.data
153
+ ]);
154
+ const columns = useMemo(()=>{
155
+ const cols = [
156
+ {
157
+ Header: "Name",
158
+ accessor: "displayName",
159
+ id: "name",
160
+ sortType: (rowA, rowB)=>{
161
+ const aIsFolder = "folder" === rowA.original.type;
162
+ const bIsFolder = "folder" === rowB.original.type;
163
+ if (aIsFolder && !bIsFolder) return -1;
164
+ if (!aIsFolder && bIsFolder) return 1;
165
+ const aName = String(rowA.values.displayName || "");
166
+ const bName = String(rowB.values.displayName || "");
167
+ return aName.localeCompare(bName);
168
+ },
169
+ Cell: ({ value, row })=>{
170
+ const displayValue = value;
171
+ const isFolder = "folder" === row.original.type;
172
+ const isVersion = "version" === row.original.type;
173
+ const isDeleteMarker = "deleteMarker" === row.original.type;
174
+ const isLatest = row.original.IsLatest;
175
+ let iconName;
176
+ iconName = isFolder ? "Folder" : isDeleteMarker ? "Deletion-marker" : "File";
177
+ const shouldIndent = isVersion && !isLatest;
178
+ return /*#__PURE__*/ jsx(ConstrainedText, {
179
+ text: /*#__PURE__*/ jsxs("div", {
180
+ style: {
181
+ display: "flex",
182
+ alignItems: "center",
183
+ gap: spacing.r8,
184
+ paddingLeft: shouldIndent ? spacing.r24 : 0
185
+ },
186
+ children: [
187
+ /*#__PURE__*/ jsx(Icon, {
188
+ name: iconName,
189
+ size: "sm"
190
+ }),
191
+ isDeleteMarker ? /*#__PURE__*/ jsx(Text, {
192
+ children: displayValue
193
+ }) : /*#__PURE__*/ jsx(Link, {
194
+ onClick: (e)=>{
195
+ e.stopPropagation();
196
+ if (isFolder) onPrefixChange?.(row.original.Key || "");
197
+ else onObjectSelect(row.original);
198
+ },
199
+ children: displayValue
200
+ })
201
+ ]
202
+ }),
203
+ lineClamp: 2
204
+ });
205
+ },
206
+ cellStyle: {
207
+ flex: "2",
208
+ width: "unset"
209
+ }
210
+ }
211
+ ];
212
+ if (showVersions) cols.push({
213
+ Header: "Version ID",
214
+ accessor: "VersionId",
215
+ id: "versionId",
216
+ Cell: ({ row })=>{
217
+ const isFolder = "folder" === row.original.type;
218
+ const isDeleteMarker = "deleteMarker" === row.original.type;
219
+ const isLatest = row.original.IsLatest;
220
+ if (isFolder || isDeleteMarker) return /*#__PURE__*/ jsx(Text, {
221
+ children: "-"
222
+ });
223
+ const versionId = "version" === row.original.type ? row.original.VersionId || "-" : "-";
224
+ const textColor = isLatest ? void 0 : "infoPrimary";
225
+ return /*#__PURE__*/ jsx(ConstrainedText, {
226
+ text: versionId,
227
+ lineClamp: 1,
228
+ color: textColor
229
+ });
230
+ },
231
+ cellStyle: {
232
+ flex: "1.5",
233
+ textAlign: "left",
234
+ paddingRight: spacing.r16,
235
+ width: "unset",
236
+ maxWidth: "8rem"
237
+ }
238
+ });
239
+ cols.push({
240
+ Header: "Modified on",
241
+ accessor: "LastModified",
242
+ id: "lastModified",
243
+ Cell: ({ value, row })=>{
244
+ if ("folder" === row.original.type || !value) return /*#__PURE__*/ jsx(Text, {
245
+ children: "-"
246
+ });
247
+ const dateValue = value;
248
+ return /*#__PURE__*/ jsx(Text, {
249
+ color: getVersionTextColor(row),
250
+ children: /*#__PURE__*/ jsx(FormattedDateTime, {
251
+ format: "date-time-second",
252
+ value: new Date(dateValue)
253
+ })
254
+ });
255
+ },
256
+ cellStyle: {
257
+ flex: "1",
258
+ textAlign: "right",
259
+ paddingRight: spacing.r16,
260
+ width: "unset",
261
+ minWidth: "10rem"
262
+ }
263
+ }, {
264
+ Header: "Size",
265
+ accessor: "Size",
266
+ id: "size",
267
+ Cell: ({ value, row })=>{
268
+ if ("folder" === row.original.type || null == value) return /*#__PURE__*/ jsx(Text, {
269
+ children: "-"
270
+ });
271
+ const sizeValue = value;
272
+ return /*#__PURE__*/ jsx(Wrap, {
273
+ style: {
274
+ justifyContent: "flex-end"
275
+ },
276
+ children: /*#__PURE__*/ jsx(Text, {
277
+ color: getVersionTextColor(row),
278
+ children: /*#__PURE__*/ jsx(PrettyBytes, {
279
+ bytes: sizeValue,
280
+ decimals: 2
281
+ })
282
+ })
283
+ });
284
+ },
285
+ cellStyle: {
286
+ flex: "1",
287
+ textAlign: "right",
288
+ paddingRight: spacing.r16,
289
+ width: "unset"
290
+ }
291
+ }, {
292
+ Header: "Storage Location",
293
+ accessor: "StorageClass",
294
+ id: "storageClass",
295
+ Cell: ({ value, row })=>{
296
+ if (!value) return /*#__PURE__*/ jsx(Text, {
297
+ children: "-"
298
+ });
299
+ const storageClass = value;
300
+ return /*#__PURE__*/ jsx(Wrap, {
301
+ style: {
302
+ justifyContent: "flex-end"
303
+ },
304
+ children: /*#__PURE__*/ jsx(Text, {
305
+ color: getVersionTextColor(row),
306
+ children: "STANDARD" === storageClass ? "default" : storageClass
307
+ })
308
+ });
309
+ },
310
+ cellStyle: {
311
+ flex: "1",
312
+ textAlign: "right",
313
+ paddingRight: spacing.r16,
314
+ width: "unset"
315
+ }
316
+ });
317
+ return cols;
318
+ }, [
319
+ onObjectSelect,
320
+ onPrefixChange,
321
+ showVersions
322
+ ]);
323
+ const handleReachBottom = useCallback(()=>{
324
+ if (hasNextPage && !isFetchingNextPage) fetchNextPage();
325
+ }, [
326
+ hasNextPage,
327
+ isFetchingNextPage,
328
+ fetchNextPage
329
+ ]);
330
+ const tableStatus = isLoading ? "loading" : error ? "error" : "success";
331
+ return /*#__PURE__*/ jsxs(Table, {
332
+ columns: columns,
333
+ data: tableData,
334
+ status: tableStatus,
335
+ onBottom: handleReachBottom,
336
+ entityName: {
337
+ en: {
338
+ singular: "object",
339
+ plural: "objects"
340
+ }
341
+ },
342
+ children: [
343
+ /*#__PURE__*/ jsxs(Wrap, {
344
+ padding: spacing.r16,
345
+ children: [
346
+ isMetadataSearchEnabled ? /*#__PURE__*/ jsx(MetadataSearch, {
347
+ isError: !!error
348
+ }) : /*#__PURE__*/ jsx(Table.SearchWithQueryParams, {
349
+ queryParams: "search"
350
+ }),
351
+ /*#__PURE__*/ jsxs(Box, {
352
+ display: "flex",
353
+ justifyContent: "space-between",
354
+ alignItems: "center",
355
+ gap: spacing.r8,
356
+ children: [
357
+ /*#__PURE__*/ jsxs(Box, {
358
+ display: "flex",
359
+ alignItems: "center",
360
+ gap: spacing.r8,
361
+ children: [
362
+ /*#__PURE__*/ jsx(UploadButton, {
363
+ bucket: bucketName,
364
+ prefix: prefix,
365
+ onUploadSuccess: ()=>{},
366
+ onUploadError: ()=>{}
367
+ }),
368
+ /*#__PURE__*/ jsx(CreateFolderButton, {
369
+ bucket: bucketName,
370
+ prefix: prefix,
371
+ onFolderSuccess: ()=>{},
372
+ onFolderError: ()=>{}
373
+ }),
374
+ /*#__PURE__*/ jsx(DeleteObjectButton, {
375
+ objects: selectedObjects,
376
+ bucketName: bucketName
377
+ })
378
+ ]
379
+ }),
380
+ /*#__PURE__*/ jsx(Toggle, {
381
+ toggle: showVersions,
382
+ onChange: (e)=>setShowVersions(e.target.checked),
383
+ label: "List Versions"
384
+ })
385
+ ]
386
+ })
387
+ ]
388
+ }),
389
+ /*#__PURE__*/ jsx(Table.MultiSelectableContent, {
390
+ rowHeight: "h40",
391
+ onMultiSelectionChanged: (rows)=>{
392
+ const objects = rows.map((row)=>row.original);
393
+ setSelectedObjects(objects);
394
+ },
395
+ onSingleRowSelected: (row)=>{
396
+ onObjectSelect(row.original);
397
+ },
398
+ onToggleAll: (selected)=>{
399
+ console.log("Toggle all", selected);
400
+ },
401
+ separationLineVariant: "backgroundLevel1",
402
+ isLoadingMoreItems: isFetchingNextPage
403
+ })
404
+ ]
405
+ });
406
+ };
407
+ export { ObjectList };
@@ -0,0 +1 @@
1
+ export declare const ObjectPage: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,43 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useNavigate, useParams, useSearchParams } from "react-router-dom";
3
+ import { useCallback, useState } from "react";
4
+ import { ObjectList } from "./ObjectList.js";
5
+ import { ObjectDetails } from "./ObjectDetails/index.js";
6
+ import { BrowserPageLayout } from "../layouts/BrowserPageLayout.js";
7
+ const ObjectPage = ()=>{
8
+ const { bucketName } = useParams();
9
+ const navigate = useNavigate();
10
+ const [searchParams] = useSearchParams();
11
+ const [item, setItem] = useState(null);
12
+ const prefix = searchParams.get("prefix") || "";
13
+ const handlePrefixChange = useCallback((newPrefix)=>{
14
+ const newSearchParams = new URLSearchParams(searchParams);
15
+ newSearchParams.set("prefix", newPrefix);
16
+ setItem(null);
17
+ navigate(`?${newSearchParams.toString()}`, {
18
+ replace: true
19
+ });
20
+ }, [
21
+ navigate,
22
+ searchParams
23
+ ]);
24
+ if (!bucketName) return /*#__PURE__*/ jsx("div", {
25
+ children: "Bucket name is required"
26
+ });
27
+ const handleObjectSelect = (object)=>{
28
+ setItem(object);
29
+ };
30
+ return /*#__PURE__*/ jsx(BrowserPageLayout, {
31
+ title: bucketName,
32
+ leftPanel: /*#__PURE__*/ jsx(ObjectList, {
33
+ bucketName: bucketName,
34
+ prefix: prefix,
35
+ onObjectSelect: handleObjectSelect,
36
+ onPrefixChange: handlePrefixChange
37
+ }),
38
+ rightPanel: item ? /*#__PURE__*/ jsx(ObjectDetails, {
39
+ item: item
40
+ }) : "Select an object to view details"
41
+ });
42
+ };
43
+ export { ObjectPage };
@@ -0,0 +1,34 @@
1
+ import React from "react";
2
+ import type { PutObjectCommandInput } from "@aws-sdk/client-s3";
3
+ interface UploadButtonProps {
4
+ /**
5
+ * The S3 bucket name where files will be uploaded
6
+ */
7
+ bucket: string;
8
+ /**
9
+ * The prefix/path where files will be uploaded within the bucket
10
+ */
11
+ prefix?: string;
12
+ /**
13
+ * Button label text
14
+ */
15
+ label?: string;
16
+ /**
17
+ * Button variant
18
+ */
19
+ variant?: "primary" | "secondary" | "outline";
20
+ /**
21
+ * Upload options to configure metadata, encryption, etc.
22
+ */
23
+ uploadOptions?: Partial<PutObjectCommandInput>;
24
+ /**
25
+ * Called when upload is successful
26
+ */
27
+ onUploadSuccess?: (files: File[]) => void;
28
+ /**
29
+ * Called when upload fails
30
+ */
31
+ onUploadError?: (error: Error, files: File[]) => void;
32
+ }
33
+ export declare const UploadButton: React.FC<UploadButtonProps>;
34
+ export default UploadButton;