@scality/data-browser-library 1.0.0-preview.9 → 1.0.1

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 (285) hide show
  1. package/dist/components/DataBrowserUI.d.ts +12 -0
  2. package/dist/components/DataBrowserUI.js +99 -0
  3. package/dist/components/Editor.d.ts +1 -1
  4. package/dist/components/Editor.js +3 -3
  5. package/dist/components/__tests__/BucketAccessor.test.js +214 -0
  6. package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
  7. package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
  8. package/dist/components/__tests__/BucketCreate.test.js +271 -105
  9. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  11. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
  13. package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
  14. package/dist/components/__tests__/BucketList.test.js +463 -239
  15. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  16. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  17. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  19. package/dist/components/__tests__/BucketOverview.test.js +281 -266
  20. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  21. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
  22. package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
  23. package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
  24. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  25. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  26. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
  27. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  28. package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
  29. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  30. package/dist/components/__tests__/ObjectList.test.js +741 -240
  31. package/dist/components/__tests__/UploadButton.test.js +45 -45
  32. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  33. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  34. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  35. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  36. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  37. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  38. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  39. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  40. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  41. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  42. package/dist/components/breadcrumb/index.d.ts +8 -0
  43. package/dist/components/breadcrumb/index.js +4 -0
  44. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  45. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  46. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  47. package/dist/components/buckets/BucketAccessor.js +125 -0
  48. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  49. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  50. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  51. package/dist/components/buckets/BucketCorsPage.js +234 -0
  52. package/dist/components/buckets/BucketCreate.d.ts +3 -2
  53. package/dist/components/buckets/BucketCreate.js +89 -47
  54. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  55. package/dist/components/buckets/BucketDetails.js +249 -85
  56. package/dist/components/buckets/BucketLifecycleFormPage.js +206 -190
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +47 -47
  59. package/dist/components/buckets/BucketList.d.ts +7 -8
  60. package/dist/components/buckets/BucketList.js +158 -101
  61. package/dist/components/buckets/BucketLocation.js +4 -4
  62. package/dist/components/buckets/BucketOverview.d.ts +22 -2
  63. package/dist/components/buckets/BucketOverview.js +394 -187
  64. package/dist/components/buckets/BucketPage.js +43 -21
  65. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  66. package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
  67. package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
  68. package/dist/components/buckets/BucketReplicationList.js +42 -42
  69. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  70. package/dist/components/buckets/BucketVersioning.js +76 -0
  71. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  72. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
  73. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
  74. package/dist/components/buckets/EmptyBucketButton.js +24 -24
  75. package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
  76. package/dist/components/buckets/EmptyBucketSummary.js +1 -1
  77. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
  78. package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
  79. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  80. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  81. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  82. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  83. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  84. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  85. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  86. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  87. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  88. package/dist/components/buckets/notifications/events.d.ts +71 -7
  89. package/dist/components/buckets/notifications/events.js +98 -16
  90. package/dist/components/index.d.ts +27 -20
  91. package/dist/components/index.js +17 -10
  92. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  93. package/dist/components/layouts/ArrowNavigation.js +28 -0
  94. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  95. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  96. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  97. package/dist/components/objects/CreateFolderButton.js +12 -12
  98. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  99. package/dist/components/objects/DeleteObjectButton.js +19 -21
  100. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  101. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  102. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  103. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  104. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  105. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  106. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  107. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  108. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  109. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  110. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  111. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  112. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  113. package/dist/components/objects/ObjectDetails/index.js +152 -40
  114. package/dist/components/objects/ObjectList.d.ts +12 -10
  115. package/dist/components/objects/ObjectList.js +590 -263
  116. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  117. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  118. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  119. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  120. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  122. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  123. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  124. package/dist/components/objects/ObjectPage.js +12 -8
  125. package/dist/components/objects/UploadButton.d.ts +3 -3
  126. package/dist/components/objects/UploadButton.js +10 -10
  127. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  128. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  129. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  130. package/dist/components/providers/DataBrowserProvider.js +60 -38
  131. package/dist/components/providers/QueryProvider.d.ts +9 -0
  132. package/dist/components/providers/QueryProvider.js +21 -0
  133. package/dist/components/search/MetadataSearch.js +29 -28
  134. package/dist/components/search/SearchHints.js +1 -1
  135. package/dist/components/ui/ArrayFieldActions.js +12 -7
  136. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  137. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  138. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  139. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  140. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  141. package/dist/components/ui/FilterFormSection.js +29 -29
  142. package/dist/components/ui/Search.elements.d.ts +2 -2
  143. package/dist/components/ui/Search.elements.js +7 -7
  144. package/dist/components/ui/Table.elements.d.ts +2 -1
  145. package/dist/components/ui/Table.elements.js +18 -12
  146. package/dist/config/__tests__/factory.test.d.ts +1 -0
  147. package/dist/config/__tests__/factory.test.js +311 -0
  148. package/dist/config/factory.d.ts +10 -56
  149. package/dist/config/factory.js +23 -71
  150. package/dist/config/types.d.ts +212 -34
  151. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  152. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  153. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  154. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  155. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  156. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  157. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  158. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  159. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  160. package/dist/hooks/bucketConfiguration.js +52 -51
  161. package/dist/hooks/bucketOperations.d.ts +10 -1
  162. package/dist/hooks/bucketOperations.js +10 -9
  163. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  164. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  165. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  166. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  167. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  168. package/dist/hooks/factories/index.d.ts +4 -4
  169. package/dist/hooks/factories/index.js +2 -2
  170. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  171. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  172. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  174. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  175. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  176. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  177. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  178. package/dist/hooks/index.d.ts +19 -12
  179. package/dist/hooks/index.js +16 -9
  180. package/dist/hooks/loginOperations.d.ts +1 -1
  181. package/dist/hooks/loginOperations.js +1 -1
  182. package/dist/hooks/objectOperations.d.ts +2 -2
  183. package/dist/hooks/objectOperations.js +50 -49
  184. package/dist/hooks/presignedOperations.d.ts +4 -4
  185. package/dist/hooks/presignedOperations.js +5 -5
  186. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  187. package/dist/hooks/useAccessibleBuckets.js +115 -0
  188. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  189. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  190. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  191. package/dist/hooks/useBucketConfigEditor.js +82 -0
  192. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  193. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  194. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  195. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  196. package/dist/hooks/useEmptyBucket.js +11 -11
  197. package/dist/hooks/useFeatures.d.ts +7 -0
  198. package/dist/hooks/useFeatures.js +8 -0
  199. package/dist/hooks/useISVBucketDetection.js +6 -6
  200. package/dist/hooks/useIsBucketEmpty.js +4 -4
  201. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  202. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  203. package/dist/hooks/useS3Client.d.ts +6 -0
  204. package/dist/hooks/useS3Client.js +3 -2
  205. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  206. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  207. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  208. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  209. package/dist/index.d.ts +6 -6
  210. package/dist/index.js +2 -2
  211. package/dist/schemas/bucketPolicySchema.json +3 -13
  212. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  213. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  214. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  215. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  216. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  218. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  220. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  221. package/dist/test/msw/handlers/headObject.js +31 -13
  222. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  223. package/dist/test/msw/handlers/listBuckets.js +5 -3
  224. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  225. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  226. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjects.js +35 -23
  228. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  229. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  230. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectRetention.js +31 -17
  232. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  234. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  235. package/dist/test/msw/handlers/putObject.js +27 -12
  236. package/dist/test/msw/handlers.d.ts +3 -3
  237. package/dist/test/msw/handlers.js +77 -54
  238. package/dist/test/msw/index.d.ts +2 -2
  239. package/dist/test/msw/index.js +1 -1
  240. package/dist/test/msw/server.d.ts +1 -1
  241. package/dist/test/msw/server.js +1 -1
  242. package/dist/test/msw/utils.js +2 -2
  243. package/dist/test/setup.d.ts +1 -1
  244. package/dist/test/setup.js +13 -30
  245. package/dist/test/testUtils.d.ts +85 -33
  246. package/dist/test/testUtils.js +176 -111
  247. package/dist/test/utils/errorHandling.test.js +119 -119
  248. package/dist/types/index.d.ts +49 -36
  249. package/dist/types/monaco.d.ts +13 -0
  250. package/dist/types/monaco.js +0 -0
  251. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  252. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  253. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  254. package/dist/utils/__tests__/s3Client.test.js +340 -0
  255. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  257. package/dist/utils/constants.d.ts +10 -0
  258. package/dist/utils/constants.js +19 -9
  259. package/dist/utils/deletion/index.d.ts +2 -2
  260. package/dist/utils/deletion/index.js +1 -1
  261. package/dist/utils/deletion/messages.d.ts +1 -1
  262. package/dist/utils/deletion/messages.js +4 -4
  263. package/dist/utils/errorHandling.d.ts +3 -3
  264. package/dist/utils/errorHandling.js +6 -6
  265. package/dist/utils/hooks.js +8 -8
  266. package/dist/utils/index.d.ts +5 -4
  267. package/dist/utils/index.js +4 -2
  268. package/dist/utils/proxyMiddleware.d.ts +32 -13
  269. package/dist/utils/proxyMiddleware.js +90 -36
  270. package/dist/utils/s3Client.d.ts +14 -4
  271. package/dist/utils/s3Client.js +5 -26
  272. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  273. package/dist/utils/s3ConfigIdentifier.js +57 -0
  274. package/dist/utils/s3RuleUtils.d.ts +5 -5
  275. package/dist/utils/s3RuleUtils.js +17 -17
  276. package/package.json +10 -8
  277. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  278. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  279. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  280. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  281. package/dist/hooks/useLoginMutation.d.ts +0 -21
  282. package/dist/hooks/useLoginMutation.js +0 -9
  283. package/dist/utils/useFeatures.d.ts +0 -1
  284. package/dist/utils/useFeatures.js +0 -7
  285. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
- import type { LifecycleRule } from "@aws-sdk/client-s3";
1
+ import type { LifecycleRule } from '@aws-sdk/client-s3';
2
2
  interface BucketLifecycleListProps {
3
3
  bucketName: string;
4
4
  lifecycleRules: LifecycleRule[];
5
- lifecycleStatus?: "idle" | "loading" | "error" | "success";
5
+ lifecycleStatus?: 'idle' | 'loading' | 'error' | 'success';
6
6
  onCreateRule?: () => void;
7
7
  onEditRule?: (ruleId: string) => void;
8
8
  }
@@ -3,8 +3,8 @@ import { ConstrainedText, FormattedDateTime, Icon, Stack, Tooltip, Wrap, spacing
3
3
  import { Box, Button, Table } from "@scality/core-ui/dist/next";
4
4
  import { useMemo } from "react";
5
5
  import { useDeleteBucketLifecycle, useSetBucketLifecycle } from "../../hooks/bucketConfiguration.js";
6
- import { DeleteBucketConfigRuleButton } from "./DeleteBucketConfigRuleButton.js";
7
6
  import { useTableRowSelection } from "../../hooks/useTableRowSelection.js";
7
+ import { DeleteBucketConfigRuleButton } from "./DeleteBucketConfigRuleButton.js";
8
8
  const pluralizeDays = (days)=>1 === days ? `${days} day` : `${days} days`;
9
9
  const formatActions = (rule)=>{
10
10
  const actions = [];
@@ -14,18 +14,18 @@ const formatActions = (rule)=>{
14
14
  description: `Expire current versions of objects after ${pluralizeDays(rule.Expiration.Days)}`
15
15
  });
16
16
  else if (rule.Expiration.Date) actions.push({
17
- text: "Expire current",
18
- description: "Expire current versions of objects on date",
17
+ text: 'Expire current',
18
+ description: 'Expire current versions of objects on date',
19
19
  date: rule.Expiration.Date
20
20
  });
21
21
  else if (rule.Expiration.ExpiredObjectDeleteMarker) actions.push({
22
- text: "Delete expired markers",
23
- description: "Delete expired object delete markers"
22
+ text: 'Delete expired markers',
23
+ description: 'Delete expired object delete markers'
24
24
  });
25
25
  }
26
26
  if (rule.NoncurrentVersionExpiration?.NoncurrentDays) {
27
- const keepText = rule.NoncurrentVersionExpiration.NewerNoncurrentVersions ? `, keep ${rule.NoncurrentVersionExpiration.NewerNoncurrentVersions}` : "";
28
- const keepDescription = rule.NoncurrentVersionExpiration.NewerNoncurrentVersions ? `, keep ${rule.NoncurrentVersionExpiration.NewerNoncurrentVersions} newest versions` : "";
27
+ const keepText = rule.NoncurrentVersionExpiration.NewerNoncurrentVersions ? `, keep ${rule.NoncurrentVersionExpiration.NewerNoncurrentVersions}` : '';
28
+ const keepDescription = rule.NoncurrentVersionExpiration.NewerNoncurrentVersions ? `, keep ${rule.NoncurrentVersionExpiration.NewerNoncurrentVersions} newest versions` : '';
29
29
  actions.push({
30
30
  text: `Expire noncurrent (${pluralizeDays(rule.NoncurrentVersionExpiration.NoncurrentDays)}${keepText})`,
31
31
  description: `Permanently delete noncurrent versions of objects after ${pluralizeDays(rule.NoncurrentVersionExpiration.NoncurrentDays)}${keepDescription}`
@@ -37,15 +37,15 @@ const formatActions = (rule)=>{
37
37
  description: `Transition current versions of objects after ${pluralizeDays(transition.Days)}`
38
38
  });
39
39
  else if (transition.Date) actions.push({
40
- text: "Transition current",
41
- description: "Transition current versions of objects on date",
40
+ text: 'Transition current',
41
+ description: 'Transition current versions of objects on date',
42
42
  date: transition.Date
43
43
  });
44
44
  });
45
45
  if (rule.NoncurrentVersionTransitions && rule.NoncurrentVersionTransitions.length > 0) rule.NoncurrentVersionTransitions.forEach((transition)=>{
46
46
  if (transition.NoncurrentDays) {
47
- const keepText = transition.NewerNoncurrentVersions ? `, keep ${transition.NewerNoncurrentVersions}` : "";
48
- const keepDescription = transition.NewerNoncurrentVersions ? `, keep ${transition.NewerNoncurrentVersions} newest versions` : "";
47
+ const keepText = transition.NewerNoncurrentVersions ? `, keep ${transition.NewerNoncurrentVersions}` : '';
48
+ const keepDescription = transition.NewerNoncurrentVersions ? `, keep ${transition.NewerNoncurrentVersions} newest versions` : '';
49
49
  actions.push({
50
50
  text: `Transition noncurrent (${pluralizeDays(transition.NoncurrentDays)}${keepText})`,
51
51
  description: `Transition noncurrent versions of objects after ${pluralizeDays(transition.NoncurrentDays)}${keepDescription}`
@@ -58,8 +58,8 @@ const formatActions = (rule)=>{
58
58
  });
59
59
  return actions.length > 0 ? actions : [
60
60
  {
61
- text: "-",
62
- description: "-"
61
+ text: '-',
62
+ description: '-'
63
63
  }
64
64
  ];
65
65
  };
@@ -68,39 +68,39 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
68
68
  const deleteLifecycleMutation = useDeleteBucketLifecycle();
69
69
  const columns = useMemo(()=>[
70
70
  {
71
- Header: "Rule ID",
72
- accessor: "ID",
73
- id: "id",
71
+ Header: 'Rule ID',
72
+ accessor: 'ID',
73
+ id: 'id',
74
74
  Cell: ({ value })=>/*#__PURE__*/ jsx(ConstrainedText, {
75
- text: value || "-",
75
+ text: value || '-',
76
76
  lineClamp: 2
77
77
  }),
78
78
  cellStyle: {
79
- flex: "1",
80
- width: "unset"
79
+ flex: '1',
80
+ width: 'unset'
81
81
  }
82
82
  },
83
83
  {
84
- Header: "Status",
85
- accessor: "Status",
86
- id: "status",
84
+ Header: 'Status',
85
+ accessor: 'Status',
86
+ id: 'status',
87
87
  Cell: ({ value })=>{
88
- const statusText = "Enabled" === value ? "Active" : "Disabled" === value ? "Inactive" : value;
88
+ const statusText = 'Enabled' === value ? 'Active' : 'Disabled' === value ? 'Inactive' : value;
89
89
  return /*#__PURE__*/ jsx("span", {
90
- children: statusText || "-"
90
+ children: statusText || '-'
91
91
  });
92
92
  },
93
93
  cellStyle: {
94
- width: "unset",
95
- flex: "0.5"
94
+ width: 'unset',
95
+ flex: '0.5'
96
96
  }
97
97
  },
98
98
  {
99
- Header: "Actions",
100
- accessor: "Actions",
101
- id: "actions",
99
+ Header: 'Actions',
100
+ accessor: 'Actions',
101
+ id: 'actions',
102
102
  Cell: ({ value })=>{
103
- if (!value || 0 === value.length || 1 === value.length && "-" === value[0].text) return /*#__PURE__*/ jsx("span", {
103
+ if (!value || 0 === value.length || 1 === value.length && '-' === value[0].text) return /*#__PURE__*/ jsx("span", {
104
104
  children: "-"
105
105
  });
106
106
  const firstAction = value[0];
@@ -112,7 +112,7 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
112
112
  " (",
113
113
  /*#__PURE__*/ jsx(FormattedDateTime, {
114
114
  format: "date",
115
- value: "string" == typeof date ? new Date(date) : date
115
+ value: 'string' == typeof date ? new Date(date) : date
116
116
  }),
117
117
  ")"
118
118
  ]
@@ -124,7 +124,7 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
124
124
  const multiActionTooltip = /*#__PURE__*/ jsx("ul", {
125
125
  style: {
126
126
  margin: 0,
127
- paddingLeft: "1.5rem"
127
+ paddingLeft: '1.5rem'
128
128
  },
129
129
  children: value.map((action, index)=>/*#__PURE__*/ jsx("li", {
130
130
  children: renderDescription(action)
@@ -145,11 +145,11 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
145
145
  overlay: multiActionTooltip,
146
146
  placement: "top",
147
147
  overlayStyle: {
148
- maxWidth: "30rem"
148
+ maxWidth: '30rem'
149
149
  },
150
150
  children: /*#__PURE__*/ jsx("span", {
151
151
  style: {
152
- cursor: "help"
152
+ cursor: 'help'
153
153
  },
154
154
  children: /*#__PURE__*/ jsx(Icon, {
155
155
  name: "Info",
@@ -164,19 +164,19 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
164
164
  });
165
165
  },
166
166
  cellStyle: {
167
- width: "unset",
168
- flex: "1.5"
167
+ width: 'unset',
168
+ flex: '1.5'
169
169
  }
170
170
  },
171
171
  {
172
- Header: "",
173
- accessor: "ID",
174
- id: "operations",
172
+ Header: '',
173
+ accessor: 'ID',
174
+ id: 'operations',
175
175
  cellStyle: {
176
- flex: "0.5",
177
- textAlign: "right",
176
+ flex: '0.5',
177
+ textAlign: 'right',
178
178
  paddingRight: spacing.r16,
179
- width: "unset"
179
+ width: 'unset'
180
180
  },
181
181
  Cell: ({ value })=>/*#__PURE__*/ jsxs(Box, {
182
182
  display: "flex",
@@ -195,7 +195,7 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
195
195
  },
196
196
  "aria-label": "Edit rule",
197
197
  tooltip: {
198
- overlay: "Edit rule"
198
+ overlay: 'Edit rule'
199
199
  }
200
200
  }),
201
201
  /*#__PURE__*/ jsx(DeleteBucketConfigRuleButton, {
@@ -222,8 +222,8 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
222
222
  onEditRule
223
223
  ]);
224
224
  const tableData = useMemo(()=>lifecycleRules.map((rule)=>({
225
- ID: rule.ID || "-",
226
- Status: rule.Status || "Disabled",
225
+ ID: rule.ID || '-',
226
+ Status: rule.Status || 'Disabled',
227
227
  Actions: formatActions(rule),
228
228
  rule
229
229
  })), [
@@ -237,8 +237,8 @@ function BucketLifecycleList({ bucketName, lifecycleRules, lifecycleStatus, onCr
237
237
  defaultSortingKey: "id",
238
238
  entityName: {
239
239
  en: {
240
- singular: "lifecycle rule",
241
- plural: "lifecycle rules"
240
+ singular: 'lifecycle rule',
241
+ plural: 'lifecycle rules'
242
242
  }
243
243
  },
244
244
  children: [
@@ -1,15 +1,14 @@
1
- import type { Bucket } from "@aws-sdk/client-s3";
2
- import type { Column } from "@scality/core-ui/dist/components/tablev2/Tablev2.component";
3
- interface BucketListProps<TData extends Bucket & Record<string, unknown> = Bucket & Record<string, unknown>> {
1
+ import type { Bucket } from '@aws-sdk/client-s3';
2
+ interface BucketListProps {
4
3
  buckets: Bucket[];
5
- bucketStatus?: "idle" | "loading" | "error" | "success";
4
+ bucketStatus?: 'idle' | 'loading' | 'error' | 'success';
6
5
  selectedBucketName?: string | null;
7
6
  onBucketSelect?: (bucketName: string) => void;
8
7
  onCreateBucket?: () => void;
9
8
  onNavigateToBucket?: (bucketName: string) => void;
10
- renderBucketLocation?: (bucketName: string) => React.ReactNode;
11
- additionalColumns?: Column<TData>[];
12
- transformBucketData?: (bucket: Bucket) => TData;
13
9
  }
14
- export declare function BucketList<TData extends Bucket & Record<string, unknown> = Bucket & Record<string, unknown>>({ buckets, bucketStatus, selectedBucketName, onBucketSelect, onCreateBucket, onNavigateToBucket, renderBucketLocation, additionalColumns, transformBucketData, }: BucketListProps<TData>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function BucketList({ buckets, bucketStatus, selectedBucketName, onBucketSelect, onCreateBucket, onNavigateToBucket, }: BucketListProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare namespace BucketList {
12
+ var displayName: string;
13
+ }
15
14
  export {};
@@ -1,107 +1,169 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { ConstrainedText, FormattedDateTime, Icon, Link, Wrap, spacing } from "@scality/core-ui";
3
3
  import { Box, Button, Table } from "@scality/core-ui/dist/next";
4
- import { useMemo } from "react";
5
- const SEARCH_QUERY_PARAM = "search";
6
- function BucketList({ buckets, bucketStatus, selectedBucketName, onBucketSelect, onCreateBucket, onNavigateToBucket, renderBucketLocation, additionalColumns, transformBucketData }) {
4
+ import { Fragment, useCallback, useMemo } from "react";
5
+ import { useDataBrowserUICustomization } from "../../contexts/DataBrowserUICustomizationContext.js";
6
+ import { BucketLocation } from "./BucketLocation.js";
7
+ const SEARCH_QUERY_PARAM = 'search';
8
+ const LOCATION_COLUMN_FLEX = '1.2';
9
+ const createBucketNameColumn = (onNavigateToBucket)=>({
10
+ Header: 'Bucket Name',
11
+ accessor: 'Name',
12
+ id: 'name',
13
+ Cell: ({ value })=>{
14
+ if (!value) return /*#__PURE__*/ jsx("span", {
15
+ children: "-"
16
+ });
17
+ return /*#__PURE__*/ jsx(ConstrainedText, {
18
+ text: /*#__PURE__*/ jsx(Link, {
19
+ onClick: (e)=>{
20
+ e.stopPropagation();
21
+ onNavigateToBucket?.(value);
22
+ },
23
+ children: value
24
+ }),
25
+ lineClamp: 2
26
+ });
27
+ },
28
+ cellStyle: {
29
+ flex: '1',
30
+ width: 'unset'
31
+ }
32
+ });
33
+ const createLocationColumn = ()=>({
34
+ Header: 'Storage Location',
35
+ accessor: 'Name',
36
+ id: 'location',
37
+ Cell: ({ value })=>{
38
+ if (!value) return /*#__PURE__*/ jsx("span", {
39
+ children: "-"
40
+ });
41
+ return /*#__PURE__*/ jsx(BucketLocation, {
42
+ bucketName: value
43
+ });
44
+ },
45
+ cellStyle: {
46
+ width: 'unset',
47
+ flex: LOCATION_COLUMN_FLEX
48
+ }
49
+ });
50
+ const createDateColumn = ()=>({
51
+ Header: 'Created on',
52
+ accessor: 'CreationDate',
53
+ id: 'date',
54
+ cellStyle: {
55
+ flex: '1',
56
+ textAlign: 'right',
57
+ paddingRight: spacing.r16,
58
+ width: 'unset'
59
+ },
60
+ Cell: ({ value })=>{
61
+ if (!value) return /*#__PURE__*/ jsx("span", {
62
+ children: "-"
63
+ });
64
+ return /*#__PURE__*/ jsx(FormattedDateTime, {
65
+ format: "date-time-second",
66
+ value: new Date(value)
67
+ });
68
+ }
69
+ });
70
+ const buildCustomColumn = (columnConfig)=>({
71
+ Header: columnConfig.header,
72
+ id: String(columnConfig.id),
73
+ Cell: ({ row })=>{
74
+ const RenderComponent = columnConfig.render;
75
+ return /*#__PURE__*/ jsx(RenderComponent, {
76
+ data: row.original
77
+ });
78
+ },
79
+ cellStyle: {
80
+ width: columnConfig.width ?? 'unset',
81
+ flex: columnConfig.width ? void 0 : '1',
82
+ ...columnConfig.cellStyle
83
+ }
84
+ });
85
+ function createOverrideMap(customItems) {
86
+ return new Map(customItems.filter((item)=>item.id).map((item)=>[
87
+ String(item.id),
88
+ item
89
+ ]));
90
+ }
91
+ function BucketList({ buckets, bucketStatus, selectedBucketName, onBucketSelect, onCreateBucket, onNavigateToBucket }) {
92
+ const { extraBucketListColumns, extraBucketListActions } = useDataBrowserUICustomization();
7
93
  const columns = useMemo(()=>{
8
- const baseColumns = [
9
- {
10
- Header: "Bucket Name",
11
- accessor: "Name",
12
- id: "name",
13
- Cell: ({ value, row })=>{
14
- const name = value || row.original?.Name;
15
- if (!name) return /*#__PURE__*/ jsx("span", {
16
- children: "-"
17
- });
18
- return /*#__PURE__*/ jsx(ConstrainedText, {
19
- text: /*#__PURE__*/ jsx(Link, {
20
- onClick: (e)=>{
21
- e.stopPropagation();
22
- onNavigateToBucket?.(name);
23
- },
24
- children: name
25
- }),
26
- lineClamp: 2
27
- });
28
- },
29
- cellStyle: {
30
- flex: "1",
31
- width: "unset"
32
- }
33
- },
34
- {
35
- Header: "Storage Location",
36
- accessor: "Name",
37
- id: "location",
38
- Cell ({ value }) {
39
- return renderBucketLocation ? renderBucketLocation(value) : /*#__PURE__*/ jsx("span", {
40
- children: "-"
41
- });
42
- },
43
- cellStyle: {
44
- width: "unset",
45
- flex: "1.2"
46
- }
47
- }
94
+ const defaultColumnsMap = {
95
+ name: createBucketNameColumn(onNavigateToBucket),
96
+ location: createLocationColumn(),
97
+ date: createDateColumn()
98
+ };
99
+ const customColumns = (extraBucketListColumns || []).map((config)=>buildCustomColumn(config));
100
+ const customColumnsMap = createOverrideMap(customColumns);
101
+ const getColumn = (id)=>customColumnsMap.get(id) || defaultColumnsMap[id];
102
+ const extraColumns = customColumns.filter((col)=>col.id && !(col.id in defaultColumnsMap));
103
+ return [
104
+ getColumn('name'),
105
+ getColumn('location'),
106
+ ...extraColumns,
107
+ getColumn('date')
48
108
  ];
49
- if (additionalColumns) baseColumns.push(...additionalColumns);
50
- baseColumns.push({
51
- Header: "Created on",
52
- accessor: "CreationDate",
53
- id: "date",
54
- cellStyle: {
55
- flex: "1",
56
- textAlign: "right",
57
- paddingRight: spacing.r16,
58
- width: "unset"
59
- },
60
- Cell: ({ value, row })=>{
61
- const date = value || row.original?.CreationDate;
62
- if (!date) return /*#__PURE__*/ jsx("span", {
63
- children: "-"
64
- });
65
- return /*#__PURE__*/ jsx(FormattedDateTime, {
66
- format: "date-time-second",
67
- value: new Date(date)
68
- });
69
- }
70
- });
71
- return baseColumns;
72
109
  }, [
73
110
  onNavigateToBucket,
74
- renderBucketLocation,
75
- additionalColumns
76
- ]);
77
- const tableData = useMemo(()=>buckets.map((bucket)=>{
78
- if (transformBucketData) return transformBucketData(bucket);
79
- const { Name, CreationDate, ...rest } = bucket;
80
- return {
81
- Name,
82
- CreationDate,
83
- ...rest
84
- };
85
- }), [
86
- buckets,
87
- transformBucketData
111
+ extraBucketListColumns
88
112
  ]);
89
113
  const selectedId = useMemo(()=>{
90
- if (buckets && selectedBucketName) return buckets.findIndex((bucket)=>bucket.Name === selectedBucketName);
91
- return null;
114
+ if (!buckets || !selectedBucketName) return;
115
+ const index = buckets.findIndex((bucket)=>bucket.Name === selectedBucketName);
116
+ return index >= 0 ? String(index) : void 0;
92
117
  }, [
93
118
  selectedBucketName,
94
119
  buckets
95
120
  ]);
121
+ const actions = useMemo(()=>{
122
+ const defaultActionsMap = {
123
+ createBucket: {
124
+ id: 'createBucket',
125
+ render: ()=>/*#__PURE__*/ jsx(Button, {
126
+ icon: /*#__PURE__*/ jsx(Icon, {
127
+ name: "Create-add"
128
+ }),
129
+ label: "Create Bucket",
130
+ variant: "primary",
131
+ onClick: onCreateBucket,
132
+ type: "submit"
133
+ })
134
+ }
135
+ };
136
+ const customActions = (extraBucketListActions || []).map((config)=>({
137
+ id: config.id,
138
+ render: config.render
139
+ }));
140
+ const customActionsMap = createOverrideMap(customActions);
141
+ const getAction = (id)=>customActionsMap.get(id) || defaultActionsMap[id];
142
+ const extraActions = customActions.filter((action)=>!(action.id in defaultActionsMap));
143
+ return [
144
+ getAction('createBucket'),
145
+ ...extraActions
146
+ ];
147
+ }, [
148
+ onCreateBucket,
149
+ extraBucketListActions
150
+ ]);
151
+ const handleRowSelected = useCallback((row)=>{
152
+ const isSelected = selectedBucketName === row.original.Name;
153
+ if (!isSelected && row.original.Name) onBucketSelect?.(row.original.Name);
154
+ }, [
155
+ selectedBucketName,
156
+ onBucketSelect
157
+ ]);
96
158
  return /*#__PURE__*/ jsxs(Table, {
97
159
  columns: columns,
98
- data: tableData,
160
+ data: buckets,
99
161
  status: bucketStatus,
100
162
  defaultSortingKey: "CreationDate",
101
163
  entityName: {
102
164
  en: {
103
- singular: "bucket",
104
- plural: "buckets"
165
+ singular: 'bucket',
166
+ plural: 'buckets'
105
167
  }
106
168
  },
107
169
  children: [
@@ -118,29 +180,24 @@ function BucketList({ buckets, bucketStatus, selectedBucketName, onBucketSelect,
118
180
  })
119
181
  }),
120
182
  /*#__PURE__*/ jsx(Box, {
121
- gap: "r16",
122
- children: /*#__PURE__*/ jsx(Button, {
123
- icon: /*#__PURE__*/ jsx(Icon, {
124
- name: "Create-add"
125
- }),
126
- label: "Create Bucket",
127
- variant: "primary",
128
- onClick: onCreateBucket,
129
- type: "submit"
130
- })
183
+ display: "flex",
184
+ gap: spacing.r16,
185
+ alignItems: "center",
186
+ children: actions.map((action)=>/*#__PURE__*/ jsx(Fragment, {
187
+ children: action.render()
188
+ }, action.id))
131
189
  })
132
190
  ]
133
191
  }),
134
192
  /*#__PURE__*/ jsx(Table.SingleSelectableContent, {
135
193
  rowHeight: "h40",
136
- selectedId: selectedId?.toString(),
137
- onRowSelected: (row)=>{
138
- const isSelected = selectedBucketName === row.original.Name;
139
- if (!isSelected && row.original.Name) onBucketSelect?.(row.original.Name);
140
- },
141
- separationLineVariant: "backgroundLevel1"
194
+ selectedId: selectedId,
195
+ onRowSelected: handleRowSelected,
196
+ separationLineVariant: "backgroundLevel1",
197
+ autoScrollToSelected: true
142
198
  })
143
199
  ]
144
200
  });
145
201
  }
202
+ BucketList.displayName = 'BucketList';
146
203
  export { BucketList };
@@ -1,16 +1,16 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useGetBucketLocation } from "../../hooks/index.js";
3
2
  import { Loader } from "@scality/core-ui";
3
+ import { useGetBucketLocation } from "../../hooks/index.js";
4
4
  const BucketLocation = ({ bucketName })=>{
5
5
  const { data: bucketLocation, status } = useGetBucketLocation({
6
6
  Bucket: bucketName
7
7
  });
8
- if ("pending" === status) return /*#__PURE__*/ jsx(Loader, {});
9
- if ("error" === status) return /*#__PURE__*/ jsx("div", {
8
+ if ('pending' === status) return /*#__PURE__*/ jsx(Loader, {});
9
+ if ('error' === status) return /*#__PURE__*/ jsx("div", {
10
10
  children: "Error"
11
11
  });
12
12
  return /*#__PURE__*/ jsx("div", {
13
- children: bucketLocation?.LocationConstraint || "us-east-1"
13
+ children: bucketLocation?.LocationConstraint || 'us-east-1'
14
14
  });
15
15
  };
16
16
  export { BucketLocation };
@@ -1,4 +1,23 @@
1
- import React from "react";
1
+ import type React from 'react';
2
+ export type FieldItem = {
3
+ id: string;
4
+ label: string;
5
+ value: React.ReactNode;
6
+ actions?: React.ReactNode;
7
+ };
8
+ interface BucketOverviewContextValue {
9
+ bucketName: string;
10
+ }
11
+ /**
12
+ * Context for BucketOverview component.
13
+ *
14
+ * **Important**: Always use `useBucketOverviewContext()` hook instead of accessing this context directly.
15
+ * The hook provides proper error handling if the context is not available.
16
+ *
17
+ * This context is exported for testing purposes only.
18
+ */
19
+ export declare const BucketOverviewContext: React.Context<BucketOverviewContextValue | null>;
20
+ export declare function useBucketOverviewContext(): BucketOverviewContextValue;
2
21
  interface BucketOverviewProps {
3
22
  bucketName: string;
4
23
  children: React.ReactNode;
@@ -49,6 +68,7 @@ interface DataProtectionSectionProps {
49
68
  declare const DataProtectionSection: React.FC<DataProtectionSectionProps>;
50
69
  interface PermissionsSectionProps {
51
70
  onEditPolicy?: (bucketName: string) => void;
71
+ onEditCors?: (bucketName: string) => void;
52
72
  ownerField?: React.ReactNode;
53
73
  aclField?: React.ReactNode;
54
74
  corsField?: React.ReactNode;
@@ -56,7 +76,7 @@ interface PermissionsSectionProps {
56
76
  bucketPolicyField?: React.ReactNode;
57
77
  renderOwner?: (bucketName: string) => React.ReactNode;
58
78
  renderAcl?: (bucketName: string) => React.ReactNode;
59
- renderCors?: (bucketName: string) => React.ReactNode;
79
+ renderCors?: (bucketName: string, onEditCors?: (name: string) => void) => React.ReactNode;
60
80
  renderPublic?: (bucketName: string) => React.ReactNode;
61
81
  renderBucketPolicy?: (bucketName: string, onEditPolicy?: (name: string) => void) => React.ReactNode;
62
82
  }