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

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 (287) 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 +93 -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 +225 -191
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +59 -61
  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 +48 -45
  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 +289 -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 +103 -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/formUtils.d.ts +15 -0
  113. package/dist/components/objects/ObjectDetails/formUtils.js +7 -0
  114. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  115. package/dist/components/objects/ObjectDetails/index.js +152 -40
  116. package/dist/components/objects/ObjectList.d.ts +12 -10
  117. package/dist/components/objects/ObjectList.js +590 -263
  118. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  119. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  120. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  122. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  123. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  124. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  125. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  126. package/dist/components/objects/ObjectPage.js +12 -8
  127. package/dist/components/objects/UploadButton.d.ts +3 -3
  128. package/dist/components/objects/UploadButton.js +10 -10
  129. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  130. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  131. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  132. package/dist/components/providers/DataBrowserProvider.js +60 -38
  133. package/dist/components/providers/QueryProvider.d.ts +9 -0
  134. package/dist/components/providers/QueryProvider.js +21 -0
  135. package/dist/components/search/MetadataSearch.js +29 -28
  136. package/dist/components/search/SearchHints.js +1 -1
  137. package/dist/components/ui/ArrayFieldActions.js +12 -7
  138. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  139. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  140. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  141. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  142. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  143. package/dist/components/ui/FilterFormSection.js +29 -29
  144. package/dist/components/ui/Search.elements.d.ts +2 -2
  145. package/dist/components/ui/Search.elements.js +7 -7
  146. package/dist/components/ui/Table.elements.d.ts +2 -1
  147. package/dist/components/ui/Table.elements.js +18 -12
  148. package/dist/config/__tests__/factory.test.d.ts +1 -0
  149. package/dist/config/__tests__/factory.test.js +311 -0
  150. package/dist/config/factory.d.ts +10 -56
  151. package/dist/config/factory.js +23 -71
  152. package/dist/config/types.d.ts +212 -34
  153. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  154. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  155. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  156. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  157. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  158. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  159. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  160. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  161. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  162. package/dist/hooks/bucketConfiguration.js +52 -51
  163. package/dist/hooks/bucketOperations.d.ts +10 -1
  164. package/dist/hooks/bucketOperations.js +10 -9
  165. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  166. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  167. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  168. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  169. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  170. package/dist/hooks/factories/index.d.ts +4 -4
  171. package/dist/hooks/factories/index.js +2 -2
  172. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  174. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  175. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  176. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  177. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  178. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  179. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  180. package/dist/hooks/index.d.ts +19 -12
  181. package/dist/hooks/index.js +16 -9
  182. package/dist/hooks/loginOperations.d.ts +1 -1
  183. package/dist/hooks/loginOperations.js +1 -1
  184. package/dist/hooks/objectOperations.d.ts +2 -2
  185. package/dist/hooks/objectOperations.js +50 -49
  186. package/dist/hooks/presignedOperations.d.ts +4 -4
  187. package/dist/hooks/presignedOperations.js +5 -5
  188. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  189. package/dist/hooks/useAccessibleBuckets.js +115 -0
  190. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  191. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  192. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  193. package/dist/hooks/useBucketConfigEditor.js +82 -0
  194. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  195. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  196. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  197. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  198. package/dist/hooks/useEmptyBucket.js +11 -11
  199. package/dist/hooks/useFeatures.d.ts +7 -0
  200. package/dist/hooks/useFeatures.js +8 -0
  201. package/dist/hooks/useISVBucketDetection.js +6 -6
  202. package/dist/hooks/useIsBucketEmpty.js +4 -4
  203. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  204. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  205. package/dist/hooks/useS3Client.d.ts +6 -0
  206. package/dist/hooks/useS3Client.js +3 -2
  207. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  208. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  209. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  210. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  211. package/dist/index.d.ts +6 -6
  212. package/dist/index.js +2 -2
  213. package/dist/schemas/bucketPolicySchema.json +3 -13
  214. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  215. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  216. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  218. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  220. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  221. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  222. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  223. package/dist/test/msw/handlers/headObject.js +31 -13
  224. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  225. package/dist/test/msw/handlers/listBuckets.js +5 -3
  226. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  228. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  229. package/dist/test/msw/handlers/listObjects.js +35 -23
  230. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  232. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  233. package/dist/test/msw/handlers/objectRetention.js +31 -17
  234. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  235. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  236. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  237. package/dist/test/msw/handlers/putObject.js +27 -12
  238. package/dist/test/msw/handlers.d.ts +3 -3
  239. package/dist/test/msw/handlers.js +77 -54
  240. package/dist/test/msw/index.d.ts +2 -2
  241. package/dist/test/msw/index.js +1 -1
  242. package/dist/test/msw/server.d.ts +1 -1
  243. package/dist/test/msw/server.js +1 -1
  244. package/dist/test/msw/utils.js +2 -2
  245. package/dist/test/setup.d.ts +1 -1
  246. package/dist/test/setup.js +13 -30
  247. package/dist/test/testUtils.d.ts +85 -33
  248. package/dist/test/testUtils.js +176 -111
  249. package/dist/test/utils/errorHandling.test.js +119 -119
  250. package/dist/types/index.d.ts +50 -37
  251. package/dist/types/monaco.d.ts +13 -0
  252. package/dist/types/monaco.js +0 -0
  253. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  254. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  255. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3Client.test.js +340 -0
  257. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  258. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  259. package/dist/utils/constants.d.ts +10 -0
  260. package/dist/utils/constants.js +19 -9
  261. package/dist/utils/deletion/index.d.ts +2 -2
  262. package/dist/utils/deletion/index.js +1 -1
  263. package/dist/utils/deletion/messages.d.ts +1 -1
  264. package/dist/utils/deletion/messages.js +4 -4
  265. package/dist/utils/errorHandling.d.ts +3 -3
  266. package/dist/utils/errorHandling.js +6 -6
  267. package/dist/utils/hooks.js +8 -8
  268. package/dist/utils/index.d.ts +5 -4
  269. package/dist/utils/index.js +4 -2
  270. package/dist/utils/proxyMiddleware.d.ts +32 -13
  271. package/dist/utils/proxyMiddleware.js +90 -36
  272. package/dist/utils/s3Client.d.ts +14 -4
  273. package/dist/utils/s3Client.js +5 -26
  274. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  275. package/dist/utils/s3ConfigIdentifier.js +57 -0
  276. package/dist/utils/s3RuleUtils.d.ts +5 -5
  277. package/dist/utils/s3RuleUtils.js +17 -17
  278. package/package.json +10 -8
  279. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  280. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  281. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  282. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  283. package/dist/hooks/useLoginMutation.d.ts +0 -21
  284. package/dist/hooks/useLoginMutation.js +0 -9
  285. package/dist/utils/useFeatures.d.ts +0 -1
  286. package/dist/utils/useFeatures.js +0 -7
  287. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,28 +1,53 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { useBuckets } from "../../hooks/index.js";
3
2
  import { TextBadge } from "@scality/core-ui";
4
- import { Navigate, useNavigate, useParams } from "react-router-dom";
3
+ import { useEffect, useMemo } from "react";
4
+ import { useParams } from "react-router";
5
+ import { useAccessibleBuckets, useBuckets } from "../../hooks/index.js";
6
+ import { useDataBrowserNavigate } from "../../hooks/useDataBrowserNavigate.js";
5
7
  import { BrowserPageLayout } from "../layouts/BrowserPageLayout.js";
6
8
  import { BucketDetails } from "./BucketDetails.js";
7
9
  import { BucketList } from "./BucketList.js";
8
- import { BucketLocation } from "./BucketLocation.js";
9
- const BucketPage_BucketPage = ()=>{
10
+ const BucketPage = ()=>{
10
11
  const { data, status } = useBuckets();
11
12
  const { bucketName } = useParams();
12
- const navigate = useNavigate();
13
- const buckets = data?.Buckets || [];
13
+ const navigate = useDataBrowserNavigate();
14
+ const { hasLimitedAccess, accessibleBuckets } = useAccessibleBuckets();
15
+ const buckets = useMemo(()=>{
16
+ if (hasLimitedAccess) return accessibleBuckets;
17
+ return data?.Buckets || [];
18
+ }, [
19
+ hasLimitedAccess,
20
+ accessibleBuckets,
21
+ data?.Buckets
22
+ ]);
14
23
  const numInstance = buckets.length;
15
- if (!bucketName && buckets.length > 0 && "success" === status) {
16
- const firstBucketName = buckets[0]?.Name;
17
- if (firstBucketName) return /*#__PURE__*/ jsx(Navigate, {
18
- to: `/buckets/${firstBucketName}`,
19
- replace: true
20
- });
21
- }
24
+ const bucketStatus = useMemo(()=>{
25
+ if (hasLimitedAccess) return 'success';
26
+ if ('pending' === status) return 'loading';
27
+ if ('error' === status) return 'error';
28
+ return 'success';
29
+ }, [
30
+ hasLimitedAccess,
31
+ status
32
+ ]);
33
+ useEffect(()=>{
34
+ if (!bucketName && buckets.length > 0 && ('success' === status || hasLimitedAccess)) {
35
+ const firstBucketName = buckets[0]?.Name;
36
+ if (firstBucketName) navigate(`/buckets/${firstBucketName}`, {
37
+ replace: true
38
+ });
39
+ }
40
+ }, [
41
+ bucketName,
42
+ buckets.length,
43
+ status,
44
+ hasLimitedAccess,
45
+ navigate
46
+ ]);
22
47
  return /*#__PURE__*/ jsx(BrowserPageLayout, {
23
48
  title: /*#__PURE__*/ jsxs(Fragment, {
24
49
  children: [
25
- "All Buckets",
50
+ 'All Buckets',
26
51
  /*#__PURE__*/ jsx(TextBadge, {
27
52
  text: numInstance.toString(),
28
53
  variant: "infoPrimary"
@@ -31,17 +56,14 @@ const BucketPage_BucketPage = ()=>{
31
56
  }),
32
57
  leftPanel: /*#__PURE__*/ jsx(BucketList, {
33
58
  buckets: buckets,
34
- bucketStatus: "pending" === status ? "loading" : "error" === status ? "error" : "success",
59
+ bucketStatus: bucketStatus,
35
60
  selectedBucketName: bucketName,
36
61
  onBucketSelect: (bucketName)=>navigate(`/buckets/${bucketName}`),
37
62
  onCreateBucket: ()=>navigate("/buckets/-/create"),
38
- onNavigateToBucket: (bucketName)=>navigate(`/buckets/${bucketName}/objects`),
39
- renderBucketLocation: (bucketName)=>/*#__PURE__*/ jsx(BucketLocation, {
40
- bucketName: bucketName
41
- })
63
+ onNavigateToBucket: (bucketName)=>navigate(`/buckets/${bucketName}/objects`)
42
64
  }),
43
65
  rightPanel: /*#__PURE__*/ jsx(BucketDetails, {})
44
66
  });
45
67
  };
46
- const BucketPage = BucketPage_BucketPage;
47
- export { BucketPage_BucketPage as BucketPage, BucketPage as default };
68
+ const buckets_BucketPage = BucketPage;
69
+ export { BucketPage, buckets_BucketPage as default };
@@ -1,12 +1,12 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo } from "react";
3
- import { useNavigate, useParams } from "react-router-dom";
4
- import { Form, FormGroup, FormSection, Icon, Loader, Stack, Text } from "@scality/core-ui";
2
+ import { Banner, Form, FormGroup, FormSection, Icon, Loader, Stack, Text, useToast } from "@scality/core-ui";
5
3
  import { Box, Button, CopyButton } from "@scality/core-ui/dist/next";
6
- import { Controller, useForm } from "react-hook-form";
7
- import { Editor } from "../Editor.js";
8
- import { useGetBucketPolicy, useSetBucketPolicy } from "../../hooks/index.js";
4
+ import { useCallback, useMemo } from "react";
5
+ import { Controller } from "react-hook-form";
6
+ import { useParams } from "react-router";
7
+ import { useBucketConfigEditor, useGetBucketPolicy, useISVBucketStatus, useSetBucketPolicy } from "../../hooks/index.js";
9
8
  import bucketPolicySchema from "../../schemas/bucketPolicySchema.json";
9
+ import { Editor } from "../Editor.js";
10
10
  const getDefaultPolicyTemplate = (bucketName)=>`{
11
11
  "Version": "2012-10-17",
12
12
  "Statement": [
@@ -19,116 +19,125 @@ const getDefaultPolicyTemplate = (bucketName)=>`{
19
19
  }
20
20
  ]
21
21
  }`;
22
+ const validatePolicyConfig = (content)=>{
23
+ try {
24
+ JSON.parse(content);
25
+ return {
26
+ isValid: true
27
+ };
28
+ } catch {
29
+ return {
30
+ isValid: false,
31
+ error: 'Invalid JSON format'
32
+ };
33
+ }
34
+ };
22
35
  const BucketPolicyPage = ()=>{
23
36
  const { bucketName } = useParams();
24
- const navigate = useNavigate();
25
- const { mutate: savePolicy, isPending: isSaving } = useSetBucketPolicy();
26
- const { control, handleSubmit, watch, setValue, setError, formState: { isDirty, isValid, errors } } = useForm({
27
- mode: "onChange",
28
- defaultValues: {
29
- policyDocument: ""
30
- }
31
- });
32
- const policyDocument = watch("policyDocument");
37
+ const { showToast } = useToast();
38
+ const { isISVManaged, isvApplication, isLoading: isISVLoading } = useISVBucketStatus(bucketName);
33
39
  const { data: policyData, status: policyStatus, error: policyError } = useGetBucketPolicy({
34
40
  Bucket: bucketName
35
41
  });
36
- const isCreateMode = useMemo(()=>policyError && ("NoSuchBucketPolicy" === policyError.name || policyError.message?.includes("does not exist")), [
37
- policyError
38
- ]);
39
- const initialPolicy = useMemo(()=>{
40
- const policyString = policyData?.Policy;
41
- if (policyString) try {
42
- const parsed = JSON.parse(policyString);
43
- return JSON.stringify(parsed, null, 2);
44
- } catch {
45
- return policyString;
46
- }
47
- return getDefaultPolicyTemplate(bucketName);
48
- }, [
49
- policyData,
50
- bucketName
51
- ]);
52
- useEffect(()=>{
53
- setValue("policyDocument", initialPolicy);
42
+ const initialContent = useMemo(()=>{
43
+ if (policyData?.Policy) return policyData.Policy;
54
44
  }, [
55
- initialPolicy,
56
- setValue
57
- ]);
58
- const handleBeforeMount = useCallback((monaco)=>{
59
- monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
60
- validate: true,
61
- schemas: [
62
- {
63
- uri: "http://myserver/bucket-policy-schema.json",
64
- fileMatch: [
65
- "*"
66
- ],
67
- schema: bucketPolicySchema
68
- }
69
- ]
70
- });
71
- }, []);
72
- const handleCancel = useCallback(()=>{
73
- navigate(`/buckets/${bucketName}`);
74
- }, [
75
- navigate,
76
- bucketName
45
+ policyData
77
46
  ]);
47
+ const { form, content, isCreateMode, isValidFormat, handleBeforeMount, navigateToBucket } = useBucketConfigEditor({
48
+ bucketName: bucketName,
49
+ initialContent,
50
+ defaultTemplate: getDefaultPolicyTemplate(bucketName),
51
+ isLoading: 'pending' === policyStatus,
52
+ notFoundErrorNames: [
53
+ 'NoSuchBucketPolicy'
54
+ ],
55
+ errorInstance: policyError,
56
+ validate: validatePolicyConfig,
57
+ monacoSchema: bucketPolicySchema
58
+ });
59
+ const { control, handleSubmit, setError, clearErrors, formState: { isDirty, errors } } = form;
60
+ const { mutate: savePolicy, isPending: isSaving } = useSetBucketPolicy();
78
61
  const onSubmit = useCallback((data)=>{
79
- try {
80
- JSON.parse(data.policyDocument);
81
- } catch (error) {
82
- const errorMessage = "Invalid JSON format";
83
- setError("policyDocument", {
84
- type: "custom",
85
- message: errorMessage
86
- });
87
- return;
88
- }
89
- const minifiedPolicy = JSON.stringify(JSON.parse(data.policyDocument));
62
+ const result = validatePolicyConfig(data.content);
63
+ if (!result.isValid) return;
64
+ const minifiedPolicy = JSON.stringify(JSON.parse(data.content));
90
65
  savePolicy({
91
66
  Bucket: bucketName,
92
67
  Policy: minifiedPolicy
93
68
  }, {
94
69
  onSuccess: ()=>{
95
- navigate(`/buckets/${bucketName}`);
70
+ showToast({
71
+ open: true,
72
+ message: 'Bucket policy saved',
73
+ status: 'success'
74
+ });
75
+ navigateToBucket();
96
76
  },
97
77
  onError: (error)=>{
98
- const errorMessage = error instanceof Error ? error.message : "Failed to save policy";
99
- setError("policyDocument", {
100
- type: "custom",
101
- message: `Save policy error: ${errorMessage}`
78
+ setError('content', {
79
+ type: 'server',
80
+ message: error instanceof Error ? error.message : 'Failed to save'
102
81
  });
103
82
  }
104
83
  });
105
84
  }, [
106
85
  bucketName,
107
86
  savePolicy,
108
- navigate,
87
+ navigateToBucket,
88
+ showToast,
109
89
  setError
110
90
  ]);
111
- if ("pending" === policyStatus) return /*#__PURE__*/ jsx(Loader, {
91
+ const hasUnexpectedError = policyError && 'NoSuchBucketPolicy' !== policyError.name;
92
+ if ('pending' === policyStatus || isISVLoading) return /*#__PURE__*/ jsx(Loader, {
112
93
  centered: true,
113
94
  size: "massive",
114
95
  children: /*#__PURE__*/ jsx(Fragment, {
115
96
  children: "Loading policy..."
116
97
  })
117
98
  });
99
+ if (hasUnexpectedError) return /*#__PURE__*/ jsx(Box, {
100
+ display: "flex",
101
+ flexDirection: "column",
102
+ justifyContent: "center",
103
+ alignItems: "center",
104
+ height: "100%",
105
+ gap: "1.5rem",
106
+ children: /*#__PURE__*/ jsxs(Stack, {
107
+ gap: "r8",
108
+ style: {
109
+ alignItems: 'center'
110
+ },
111
+ children: [
112
+ /*#__PURE__*/ jsx(Icon, {
113
+ name: "Exclamation-circle",
114
+ size: "2x",
115
+ color: "statusWarning"
116
+ }),
117
+ /*#__PURE__*/ jsxs(Text, {
118
+ variant: "Large",
119
+ children: [
120
+ "Failed to load bucket policy: ",
121
+ policyError.message || 'Unknown error'
122
+ ]
123
+ })
124
+ ]
125
+ })
126
+ });
118
127
  return /*#__PURE__*/ jsx(Form, {
119
128
  onSubmit: handleSubmit(onSubmit),
120
129
  layout: {
121
- kind: "page",
122
- title: `Bucket Policy ${isCreateMode ? "Creation" : "Edition"}`
130
+ kind: 'page',
131
+ title: `${isCreateMode ? 'Create' : 'Edit'} Bucket Policy`
123
132
  },
124
- requireMode: isCreateMode ? "partial" : "all",
133
+ requireMode: isCreateMode ? 'partial' : 'all',
125
134
  rightActions: /*#__PURE__*/ jsxs(Stack, {
126
135
  gap: "r16",
127
136
  children: [
128
137
  /*#__PURE__*/ jsx(Button, {
129
138
  variant: "outline",
130
139
  label: "Cancel",
131
- onClick: handleCancel,
140
+ onClick: navigateToBucket,
132
141
  type: "button",
133
142
  disabled: isSaving
134
143
  }),
@@ -139,64 +148,83 @@ const BucketPolicyPage = ()=>{
139
148
  name: "Save"
140
149
  }),
141
150
  type: "submit",
142
- disabled: !isDirty || !isValid || isSaving
151
+ disabled: !isDirty && !isCreateMode || isSaving || !isValidFormat
143
152
  })
144
153
  ]
145
154
  }),
146
- children: /*#__PURE__*/ jsxs(FormSection, {
155
+ children: /*#__PURE__*/ jsxs(Fragment, {
147
156
  children: [
148
- /*#__PURE__*/ jsx(FormGroup, {
149
- id: "bucketName",
150
- label: "Bucket Name",
151
- required: true,
152
- direction: "horizontal",
153
- content: /*#__PURE__*/ jsx(Text, {
154
- children: bucketName
155
- })
156
- }),
157
- /*#__PURE__*/ jsx(FormGroup, {
158
- id: "policyDocument",
159
- label: "Policy Document",
160
- required: true,
161
- direction: "vertical",
162
- help: "AWS Bucket policy standards are supported.",
163
- helpErrorPosition: "bottom",
164
- error: errors?.policyDocument?.message,
165
- content: /*#__PURE__*/ jsxs(Stack, {
157
+ isISVManaged && /*#__PURE__*/ jsx(Banner, {
158
+ variant: "warning",
159
+ icon: /*#__PURE__*/ jsx(Icon, {
160
+ color: "statusWarning",
161
+ name: "Exclamation-circle"
162
+ }),
163
+ children: /*#__PURE__*/ jsxs(Text, {
166
164
  children: [
167
- /*#__PURE__*/ jsx(Controller, {
168
- control: control,
169
- name: "policyDocument",
170
- rules: {
171
- required: "The policy document is required",
172
- validate: (value)=>{
173
- try {
174
- JSON.parse(value);
175
- return true;
176
- } catch {
177
- return "Invalid JSON format";
178
- }
179
- }
180
- },
181
- render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Editor, {
182
- value: value,
183
- onChange: onChange,
184
- language: "json",
185
- height: "60vh",
186
- width: "33rem",
187
- beforeMount: handleBeforeMount
188
- })
165
+ /*#__PURE__*/ jsx("strong", {
166
+ children: "Warning:"
189
167
  }),
190
- /*#__PURE__*/ jsx(Box, {
191
- alignSelf: "baseline",
192
- children: /*#__PURE__*/ jsx(CopyButton, {
193
- textToCopy: policyDocument,
194
- label: "Policy",
195
- variant: "outline"
196
- })
197
- })
168
+ " This bucket is managed by ",
169
+ isvApplication,
170
+ ". Adding a Bucket Policy may conflict with IAM policies created by ",
171
+ isvApplication,
172
+ ", potentially disrupting ",
173
+ isvApplication,
174
+ " operations (e.g., backup cleanup). Ensure your Bucket Policy does not deny actions that ",
175
+ isvApplication,
176
+ " requires."
198
177
  ]
199
178
  })
179
+ }),
180
+ /*#__PURE__*/ jsxs(FormSection, {
181
+ children: [
182
+ /*#__PURE__*/ jsx(FormGroup, {
183
+ id: "bucketName",
184
+ label: "Bucket Name",
185
+ required: true,
186
+ direction: "horizontal",
187
+ content: /*#__PURE__*/ jsx(Text, {
188
+ children: bucketName
189
+ })
190
+ }),
191
+ /*#__PURE__*/ jsx(FormGroup, {
192
+ id: "policyDocument",
193
+ label: "Policy Document",
194
+ required: true,
195
+ direction: "vertical",
196
+ help: "AWS Bucket policy standards are supported.",
197
+ helpErrorPosition: "bottom",
198
+ error: errors.content?.message,
199
+ content: /*#__PURE__*/ jsxs(Stack, {
200
+ children: [
201
+ /*#__PURE__*/ jsx(Controller, {
202
+ control: control,
203
+ name: "content",
204
+ render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Editor, {
205
+ value: value,
206
+ onChange: (newValue)=>{
207
+ onChange(newValue);
208
+ if (errors.content) clearErrors('content');
209
+ },
210
+ language: "json",
211
+ height: "60vh",
212
+ width: "33rem",
213
+ beforeMount: handleBeforeMount
214
+ })
215
+ }),
216
+ /*#__PURE__*/ jsx(Box, {
217
+ alignSelf: "baseline",
218
+ children: /*#__PURE__*/ jsx(CopyButton, {
219
+ textToCopy: content,
220
+ label: "Policy",
221
+ variant: "outline"
222
+ })
223
+ })
224
+ ]
225
+ })
226
+ })
227
+ ]
200
228
  })
201
229
  ]
202
230
  })