@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
@@ -0,0 +1,163 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import { useGetBucketObjectLockConfiguration, useGetBucketVersioning, useISVBucketStatus, useSetBucketVersioning } from "../../../hooks/index.js";
4
+ import { createMockMutationResult, createTestWrapper, findToggleByLabel } from "../../../test/testUtils.js";
5
+ import { BucketOverviewContext } from "../BucketOverview.js";
6
+ import { BucketVersioning } from "../BucketVersioning.js";
7
+ const mockShowToast = jest.fn();
8
+ jest.mock('@scality/core-ui', ()=>({
9
+ ...jest.requireActual('@scality/core-ui'),
10
+ useToast: ()=>({
11
+ showToast: mockShowToast
12
+ })
13
+ }));
14
+ jest.mock('../../../hooks');
15
+ const mockUseGetBucketVersioning = jest.mocked(useGetBucketVersioning);
16
+ const mockUseGetBucketObjectLockConfiguration = jest.mocked(useGetBucketObjectLockConfiguration);
17
+ const mockUseISVBucketStatus = jest.mocked(useISVBucketStatus);
18
+ const mockUseSetBucketVersioning = jest.mocked(useSetBucketVersioning);
19
+ const renderBucketVersioning = (props = {})=>{
20
+ const mockMutate = jest.fn();
21
+ mockUseSetBucketVersioning.mockReturnValue(createMockMutationResult(mockMutate));
22
+ const Wrapper = createTestWrapper();
23
+ return {
24
+ ...render(/*#__PURE__*/ jsx(Wrapper, {
25
+ children: /*#__PURE__*/ jsx(BucketOverviewContext.Provider, {
26
+ value: {
27
+ bucketName: 'test-bucket'
28
+ },
29
+ children: /*#__PURE__*/ jsx(BucketVersioning, {
30
+ ...props
31
+ })
32
+ })
33
+ })),
34
+ mutate: mockMutate
35
+ };
36
+ };
37
+ const mockHookDefaults = ()=>{
38
+ mockUseGetBucketVersioning.mockReturnValue({
39
+ data: {
40
+ Status: 'Enabled'
41
+ },
42
+ status: 'success',
43
+ error: null
44
+ });
45
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
46
+ data: {
47
+ ObjectLockConfiguration: {
48
+ ObjectLockEnabled: 'Disabled'
49
+ }
50
+ },
51
+ status: 'success',
52
+ error: null
53
+ });
54
+ mockUseISVBucketStatus.mockReturnValue({
55
+ isVeeamBucket: false,
56
+ isCommvaultBucket: false,
57
+ isISVManaged: false,
58
+ isvApplication: void 0,
59
+ isLoading: false,
60
+ bucketTagsStatus: 'success'
61
+ });
62
+ };
63
+ describe('BucketVersioning', ()=>{
64
+ beforeEach(()=>{
65
+ jest.clearAllMocks();
66
+ mockHookDefaults();
67
+ });
68
+ it('renders toggle with Active label when versioning is enabled', ()=>{
69
+ renderBucketVersioning();
70
+ const toggle = findToggleByLabel('Active');
71
+ expect(toggle).toBeInTheDocument();
72
+ expect(toggle).toBeChecked();
73
+ });
74
+ it('renders toggle with Inactive label when versioning is suspended', ()=>{
75
+ mockUseGetBucketVersioning.mockReturnValue({
76
+ data: {
77
+ Status: 'Suspended'
78
+ },
79
+ status: 'success',
80
+ error: null
81
+ });
82
+ renderBucketVersioning();
83
+ const toggle = findToggleByLabel('Inactive');
84
+ expect(toggle).toBeInTheDocument();
85
+ expect(toggle).not.toBeChecked();
86
+ });
87
+ it('calls mutation with Suspended status when disabling versioning', ()=>{
88
+ const { mutate } = renderBucketVersioning();
89
+ const toggle = findToggleByLabel('Active');
90
+ fireEvent.click(toggle);
91
+ expect(mutate).toHaveBeenCalledWith({
92
+ Bucket: 'test-bucket',
93
+ VersioningConfiguration: {
94
+ Status: 'Suspended'
95
+ }
96
+ }, expect.any(Object));
97
+ });
98
+ it('calls mutation with Enabled status when enabling versioning', ()=>{
99
+ mockUseGetBucketVersioning.mockReturnValue({
100
+ data: {
101
+ Status: 'Suspended'
102
+ },
103
+ status: 'success',
104
+ error: null
105
+ });
106
+ const { mutate } = renderBucketVersioning();
107
+ const toggle = findToggleByLabel('Inactive');
108
+ fireEvent.click(toggle);
109
+ expect(mutate).toHaveBeenCalledWith({
110
+ Bucket: 'test-bucket',
111
+ VersioningConfiguration: {
112
+ Status: 'Enabled'
113
+ }
114
+ }, expect.any(Object));
115
+ });
116
+ it('disables toggle when versioning data is loading', ()=>{
117
+ mockUseGetBucketVersioning.mockReturnValue({
118
+ data: void 0,
119
+ status: 'pending',
120
+ error: null
121
+ });
122
+ renderBucketVersioning();
123
+ const toggle = screen.getByRole('checkbox');
124
+ expect(toggle).toHaveAttribute('aria-disabled', 'true');
125
+ });
126
+ it('renders static Enabled text when Object Lock is enabled', ()=>{
127
+ mockUseGetBucketObjectLockConfiguration.mockReturnValue({
128
+ data: {
129
+ ObjectLockConfiguration: {
130
+ ObjectLockEnabled: 'Enabled'
131
+ }
132
+ },
133
+ status: 'success'
134
+ });
135
+ renderBucketVersioning();
136
+ expect(screen.getByText('Enabled')).toBeInTheDocument();
137
+ expect(screen.getByText(/Versioning cannot be suspended because Object-lock is enabled/i)).toBeInTheDocument();
138
+ expect(screen.queryByRole('checkbox')).not.toBeInTheDocument();
139
+ });
140
+ it('disables toggle when bucket is managed by Veeam', ()=>{
141
+ mockUseISVBucketStatus.mockReturnValue({
142
+ isVeeamBucket: true,
143
+ isCommvaultBucket: false,
144
+ isISVManaged: true,
145
+ isvApplication: 'Veeam',
146
+ isLoading: false,
147
+ bucketTagsStatus: 'success'
148
+ });
149
+ renderBucketVersioning();
150
+ const toggle = screen.getByRole('checkbox');
151
+ expect(toggle).toHaveAttribute('aria-disabled', 'true');
152
+ });
153
+ it('disables toggle when versioning query errors', ()=>{
154
+ mockUseGetBucketVersioning.mockReturnValue({
155
+ data: void 0,
156
+ status: 'error',
157
+ error: new Error('Failed to fetch versioning')
158
+ });
159
+ renderBucketVersioning();
160
+ const toggle = screen.getByRole('checkbox');
161
+ expect(toggle).toHaveAttribute('aria-disabled', 'true');
162
+ });
163
+ });
@@ -0,0 +1 @@
1
+ export declare function BucketNotificationFormPage(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,316 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { joiResolver } from "@hookform/resolvers/joi";
3
+ import { Form, FormGroup, FormSection, Icon, Loader, Stack, Text, spacing, useToast } from "@scality/core-ui";
4
+ import { convertRemToPixels } from "@scality/core-ui/dist/components/tablev2/TableUtils";
5
+ import { Box, Button, Input } from "@scality/core-ui/dist/next";
6
+ import joi from "joi";
7
+ import { useCallback, useEffect, useMemo } from "react";
8
+ import { FormProvider, useForm } from "react-hook-form";
9
+ import { useParams } from "react-router";
10
+ import { useGetBucketNotification, useSetBucketNotification } from "../../../hooks/index.js";
11
+ import { useDataBrowserNavigate } from "../../../hooks/useDataBrowserNavigate.js";
12
+ import { EventsSection } from "./EventsSection.js";
13
+ const baseSchema = joi.object({
14
+ ruleName: joi.string().required().messages({
15
+ 'string.empty': 'This field is required'
16
+ }),
17
+ queueArn: joi.string().required().pattern(/^arn:aws:sqs:[a-z0-9-]+:\d+:.+$/).messages({
18
+ 'string.empty': 'This field is required',
19
+ 'string.pattern.base': 'Must be a valid ARN (e.g., arn:aws:sqs:region:account-id:queue-name)'
20
+ }),
21
+ events: joi.array().min(1).required().messages({
22
+ 'array.min': 'At least one event must be selected'
23
+ }),
24
+ prefix: joi.string().allow('').optional(),
25
+ suffix: joi.string().allow('').optional()
26
+ });
27
+ function BucketNotificationFormPage() {
28
+ const { bucketName, ruleId } = useParams();
29
+ const navigate = useDataBrowserNavigate();
30
+ const { showToast } = useToast();
31
+ const isEditMode = !!ruleId;
32
+ const { data: existingNotificationData, status: notificationStatus, error: notificationError } = useGetBucketNotification({
33
+ Bucket: bucketName
34
+ });
35
+ const existingRule = useMemo(()=>{
36
+ if (!isEditMode || !existingNotificationData?.QueueConfigurations || !ruleId) return null;
37
+ return existingNotificationData.QueueConfigurations.find((config)=>config.Id === decodeURIComponent(ruleId));
38
+ }, [
39
+ isEditMode,
40
+ existingNotificationData,
41
+ ruleId
42
+ ]);
43
+ const existingRuleNames = useMemo(()=>existingNotificationData?.QueueConfigurations?.map((config)=>config.Id)?.filter((id)=>!!id)?.filter((id)=>!isEditMode || id !== existingRule?.Id) || [], [
44
+ existingNotificationData,
45
+ isEditMode,
46
+ existingRule
47
+ ]);
48
+ const dynamicSchema = useMemo(()=>baseSchema.keys({
49
+ ruleName: joi.string().required().invalid(...existingRuleNames).messages({
50
+ 'string.empty': 'This field is required',
51
+ 'any.invalid': 'A rule with this name already exists'
52
+ })
53
+ }), [
54
+ existingRuleNames
55
+ ]);
56
+ const methods = useForm({
57
+ resolver: joiResolver(dynamicSchema),
58
+ mode: 'onChange',
59
+ defaultValues: {
60
+ ruleName: '',
61
+ queueArn: '',
62
+ events: [],
63
+ prefix: '',
64
+ suffix: ''
65
+ }
66
+ });
67
+ const { mutate: setNotification, isPending: isSaving } = useSetBucketNotification();
68
+ const { handleSubmit, register, reset, formState: { isValid, isDirty, errors } } = methods;
69
+ useEffect(()=>{
70
+ if (isEditMode && existingRule) {
71
+ const prefixRule = existingRule.Filter?.Key?.FilterRules?.find((r)=>'prefix' === r.Name);
72
+ const suffixRule = existingRule.Filter?.Key?.FilterRules?.find((r)=>'suffix' === r.Name);
73
+ reset({
74
+ ruleName: existingRule.Id || '',
75
+ queueArn: existingRule.QueueArn || '',
76
+ events: existingRule.Events || [],
77
+ prefix: prefixRule?.Value || '',
78
+ suffix: suffixRule?.Value || ''
79
+ });
80
+ }
81
+ }, [
82
+ isEditMode,
83
+ existingRule,
84
+ reset
85
+ ]);
86
+ const handleCancel = useCallback(()=>{
87
+ navigate(`/buckets/${bucketName}?tab=notification`);
88
+ }, [
89
+ navigate,
90
+ bucketName
91
+ ]);
92
+ const onSubmit = useCallback((data)=>{
93
+ const filterRules = [
94
+ ...data.prefix ? [
95
+ {
96
+ Name: 'prefix',
97
+ Value: data.prefix
98
+ }
99
+ ] : [],
100
+ ...data.suffix ? [
101
+ {
102
+ Name: 'suffix',
103
+ Value: data.suffix
104
+ }
105
+ ] : []
106
+ ];
107
+ const wildcardPrefixes = [
108
+ 's3:ObjectCreated:',
109
+ 's3:ObjectRemoved:',
110
+ 's3:ObjectRestore:',
111
+ 's3:LifecycleExpiration:',
112
+ 's3:Replication:',
113
+ 's3:ObjectTagging:'
114
+ ];
115
+ const filteredEvents = data.events.filter((event)=>{
116
+ if (event.endsWith('*')) return true;
117
+ for (const prefix of wildcardPrefixes)if (event.startsWith(prefix)) return !data.events.includes(`${prefix}*`);
118
+ return true;
119
+ });
120
+ const newQueueConfiguration = {
121
+ Id: data.ruleName,
122
+ QueueArn: data.queueArn,
123
+ Events: filteredEvents,
124
+ ...filterRules.length > 0 && {
125
+ Filter: {
126
+ Key: {
127
+ FilterRules: filterRules
128
+ }
129
+ }
130
+ }
131
+ };
132
+ const existingConfigurations = existingNotificationData?.QueueConfigurations || [];
133
+ const updatedConfigurations = isEditMode ? existingConfigurations.map((config)=>config.Id === existingRule?.Id ? newQueueConfiguration : config) : [
134
+ ...existingConfigurations,
135
+ newQueueConfiguration
136
+ ];
137
+ setNotification({
138
+ Bucket: bucketName,
139
+ NotificationConfiguration: {
140
+ QueueConfigurations: updatedConfigurations
141
+ }
142
+ }, {
143
+ onSuccess: ()=>{
144
+ showToast({
145
+ open: true,
146
+ message: `Notification rule ${isEditMode ? 'updated' : 'created'} successfully`,
147
+ status: 'success'
148
+ });
149
+ navigate(`/buckets/${bucketName}?tab=notification`);
150
+ },
151
+ onError: (error)=>{
152
+ const errorMessage = error instanceof Error ? error.message : `Failed to ${isEditMode ? 'update' : 'create'} notification rule`;
153
+ showToast({
154
+ open: true,
155
+ message: errorMessage,
156
+ status: 'error'
157
+ });
158
+ }
159
+ });
160
+ }, [
161
+ bucketName,
162
+ setNotification,
163
+ navigate,
164
+ showToast,
165
+ existingNotificationData,
166
+ isEditMode,
167
+ existingRule
168
+ ]);
169
+ if ('pending' === notificationStatus) return /*#__PURE__*/ jsx(Loader, {
170
+ centered: true,
171
+ children: /*#__PURE__*/ jsx(Text, {
172
+ children: "Loading..."
173
+ })
174
+ });
175
+ if ('error' === notificationStatus && notificationError) {
176
+ const errorMessage = notificationError instanceof Error ? notificationError.message : 'Failed to load notification configuration';
177
+ return /*#__PURE__*/ jsx(Form, {
178
+ layout: {
179
+ kind: 'page',
180
+ title: isEditMode ? 'Edit Bucket Notification' : 'Create Bucket Notification'
181
+ },
182
+ children: /*#__PURE__*/ jsx(Box, {
183
+ display: "flex",
184
+ justifyContent: "center",
185
+ alignItems: "center",
186
+ padding: spacing.r16,
187
+ children: /*#__PURE__*/ jsx(Text, {
188
+ color: "statusCritical",
189
+ children: errorMessage
190
+ })
191
+ })
192
+ });
193
+ }
194
+ if (isEditMode && (!existingRule || !existingRule.Id)) return /*#__PURE__*/ jsx(Form, {
195
+ layout: {
196
+ kind: 'page',
197
+ title: 'Edit Bucket Notification'
198
+ },
199
+ children: /*#__PURE__*/ jsx(Box, {
200
+ display: "flex",
201
+ justifyContent: "center",
202
+ alignItems: "center",
203
+ padding: spacing.r16,
204
+ children: /*#__PURE__*/ jsx(Text, {
205
+ color: "statusCritical",
206
+ children: "Notification rule not found"
207
+ })
208
+ })
209
+ });
210
+ return /*#__PURE__*/ jsx(FormProvider, {
211
+ ...methods,
212
+ children: /*#__PURE__*/ jsxs(Form, {
213
+ layout: {
214
+ kind: 'page',
215
+ title: isEditMode ? 'Edit Bucket Notification' : 'Create Bucket Notification'
216
+ },
217
+ requireMode: "partial",
218
+ onSubmit: handleSubmit(onSubmit),
219
+ rightActions: /*#__PURE__*/ jsxs(Stack, {
220
+ gap: "r16",
221
+ children: [
222
+ /*#__PURE__*/ jsx(Button, {
223
+ id: "cancel-btn",
224
+ variant: "outline",
225
+ type: "button",
226
+ label: "Cancel",
227
+ onClick: handleCancel,
228
+ disabled: isSaving
229
+ }),
230
+ /*#__PURE__*/ jsx(Button, {
231
+ id: isEditMode ? 'save-notification-btn' : 'create-notification-btn',
232
+ type: "submit",
233
+ variant: "primary",
234
+ label: isEditMode ? 'Save' : 'Create',
235
+ icon: isEditMode ? /*#__PURE__*/ jsx(Icon, {
236
+ name: "Save"
237
+ }) : void 0,
238
+ disabled: isEditMode ? !isDirty || !isValid || isSaving : !isValid || isSaving
239
+ })
240
+ ]
241
+ }),
242
+ children: [
243
+ /*#__PURE__*/ jsx(FormSection, {
244
+ forceLabelWidth: convertRemToPixels(13),
245
+ children: /*#__PURE__*/ jsx(FormGroup, {
246
+ label: "Rule name",
247
+ id: "ruleName",
248
+ direction: "horizontal",
249
+ error: errors?.ruleName?.message,
250
+ helpErrorPosition: "bottom",
251
+ labelHelpTooltip: /*#__PURE__*/ jsx(Fragment, {}),
252
+ required: true,
253
+ content: isEditMode ? /*#__PURE__*/ jsx(Text, {
254
+ children: existingRule?.Id
255
+ }) : /*#__PURE__*/ jsx(Input, {
256
+ id: "ruleName",
257
+ ...register('ruleName')
258
+ })
259
+ })
260
+ }),
261
+ /*#__PURE__*/ jsx(EventsSection, {}),
262
+ /*#__PURE__*/ jsx(FormSection, {
263
+ forceLabelWidth: convertRemToPixels(13),
264
+ children: /*#__PURE__*/ jsx(FormGroup, {
265
+ label: "Destination Queue",
266
+ id: "queueArn",
267
+ direction: "horizontal",
268
+ error: errors?.queueArn?.message,
269
+ helpErrorPosition: "bottom",
270
+ labelHelpTooltip: /*#__PURE__*/ jsx(Fragment, {}),
271
+ required: true,
272
+ content: /*#__PURE__*/ jsx(Input, {
273
+ id: "queueArn",
274
+ placeholder: "arn:aws:sqs:us-east-1:1xx:name",
275
+ ...register('queueArn')
276
+ })
277
+ })
278
+ }),
279
+ /*#__PURE__*/ jsx(FormSection, {
280
+ title: {
281
+ name: 'Filters'
282
+ },
283
+ children: /*#__PURE__*/ jsxs(Stack, {
284
+ direction: "horizontal",
285
+ gap: "r16",
286
+ children: [
287
+ /*#__PURE__*/ jsx(FormGroup, {
288
+ label: "Prefix",
289
+ id: "prefix",
290
+ direction: "horizontal",
291
+ content: /*#__PURE__*/ jsx(Input, {
292
+ id: "prefix",
293
+ placeholder: "",
294
+ size: "2/3",
295
+ ...register('prefix')
296
+ })
297
+ }),
298
+ /*#__PURE__*/ jsx(FormGroup, {
299
+ label: "Suffix",
300
+ id: "suffix",
301
+ direction: "horizontal",
302
+ content: /*#__PURE__*/ jsx(Input, {
303
+ id: "suffix",
304
+ placeholder: "",
305
+ size: "2/3",
306
+ ...register('suffix')
307
+ })
308
+ })
309
+ ]
310
+ })
311
+ })
312
+ ]
313
+ })
314
+ });
315
+ }
316
+ export { BucketNotificationFormPage };
@@ -0,0 +1,10 @@
1
+ import type { QueueConfiguration } from '@aws-sdk/client-s3';
2
+ interface BucketNotificationListProps {
3
+ bucketName: string;
4
+ notificationRules: QueueConfiguration[];
5
+ notificationStatus?: 'idle' | 'loading' | 'error' | 'success';
6
+ onCreateRule?: () => void;
7
+ onEditRule?: (ruleId: string) => void;
8
+ }
9
+ export declare function BucketNotificationList({ bucketName, notificationRules, notificationStatus, onCreateRule, onEditRule, }: BucketNotificationListProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};