@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,316 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
- import user_event from "@testing-library/user-event";
4
- import { MemoryRouter, Route, Routes } from "react-router-dom";
5
- import { createTestWrapper } from "../../test/testUtils.js";
6
- import { BucketNotificationCreatePage } from "../buckets/notifications/BucketNotificationCreatePage.js";
7
- import { useGetBucketNotification, useSetBucketNotification } from "../../hooks/index.js";
8
- jest.mock("../../hooks", ()=>({
9
- useGetBucketNotification: jest.fn(),
10
- useSetBucketNotification: jest.fn()
11
- }));
12
- const mockUseGetBucketNotification = jest.mocked(useGetBucketNotification);
13
- const mockUseSetBucketNotification = jest.mocked(useSetBucketNotification);
14
- const mockNavigate = jest.fn();
15
- jest.mock("react-router-dom", ()=>({
16
- ...jest.requireActual("react-router-dom"),
17
- useNavigate: ()=>mockNavigate
18
- }));
19
- const renderBucketNotificationCreatePage = (bucketName = "test-bucket")=>{
20
- const Wrapper = createTestWrapper();
21
- return render(/*#__PURE__*/ jsx(MemoryRouter, {
22
- initialEntries: [
23
- `/buckets/${bucketName}/notifications/create`
24
- ],
25
- children: /*#__PURE__*/ jsx(Wrapper, {
26
- children: /*#__PURE__*/ jsx(Routes, {
27
- children: /*#__PURE__*/ jsx(Route, {
28
- path: "/buckets/:bucketName/notifications/create",
29
- element: /*#__PURE__*/ jsx(BucketNotificationCreatePage, {})
30
- })
31
- })
32
- })
33
- }));
34
- };
35
- describe("BucketNotificationCreatePage", ()=>{
36
- const mockMutate = jest.fn();
37
- beforeEach(()=>{
38
- jest.clearAllMocks();
39
- mockNavigate.mockClear();
40
- mockUseGetBucketNotification.mockReturnValue({
41
- data: void 0
42
- });
43
- mockUseSetBucketNotification.mockReturnValue({
44
- mutate: mockMutate,
45
- isPending: false
46
- });
47
- });
48
- it("renders create notification form with all fields", ()=>{
49
- renderBucketNotificationCreatePage();
50
- expect(screen.getByText("Create Bucket Notification")).toBeInTheDocument();
51
- expect(screen.getByLabelText(/rule name/i)).toBeInTheDocument();
52
- expect(screen.getByText("Events")).toBeInTheDocument();
53
- expect(screen.getByLabelText(/destination queue/i)).toBeInTheDocument();
54
- expect(screen.getByLabelText(/prefix/i)).toBeInTheDocument();
55
- expect(screen.getByLabelText(/suffix/i)).toBeInTheDocument();
56
- });
57
- it("disables create button when form is pristine", ()=>{
58
- renderBucketNotificationCreatePage();
59
- expect(screen.getByRole("button", {
60
- name: /create/i
61
- })).toBeDisabled();
62
- });
63
- it("shows validation error when rule name is empty", async ()=>{
64
- renderBucketNotificationCreatePage();
65
- const ruleNameInput = screen.getByLabelText(/rule name/i);
66
- await user_event.type(ruleNameInput, "a");
67
- await user_event.clear(ruleNameInput);
68
- await waitFor(()=>{
69
- expect(screen.getByText(/this field is required/i)).toBeInTheDocument();
70
- });
71
- });
72
- it("shows validation error when rule name already exists", async ()=>{
73
- const existingConfig = {
74
- QueueConfigurations: [
75
- {
76
- Id: "existing-rule",
77
- QueueArn: "arn:aws:sqs:us-east-1:123:queue",
78
- Events: [
79
- "s3:ObjectCreated:*"
80
- ]
81
- }
82
- ]
83
- };
84
- mockUseGetBucketNotification.mockReturnValue({
85
- data: existingConfig
86
- });
87
- renderBucketNotificationCreatePage();
88
- const ruleNameInput = screen.getByLabelText(/rule name/i);
89
- await user_event.type(ruleNameInput, "existing-rule");
90
- await waitFor(()=>{
91
- expect(screen.getByText(/a rule with this name already exists/i)).toBeInTheDocument();
92
- });
93
- });
94
- it("shows validation error when queue ARN is invalid", async ()=>{
95
- renderBucketNotificationCreatePage();
96
- const queueArnInput = screen.getByLabelText(/destination queue/i);
97
- await user_event.type(queueArnInput, "invalid-arn");
98
- await waitFor(()=>{
99
- expect(screen.getByText(/must be a valid arn/i)).toBeInTheDocument();
100
- });
101
- });
102
- it("shows validation error when no event is selected", async ()=>{
103
- renderBucketNotificationCreatePage();
104
- const ruleNameInput = screen.getByLabelText(/rule name/i);
105
- await user_event.type(ruleNameInput, "test-rule");
106
- const queueArnInput = screen.getByLabelText(/destination queue/i);
107
- await user_event.type(queueArnInput, "arn:aws:sqs:us-east-1:123:queue");
108
- await waitFor(()=>{
109
- expect(screen.getByRole("button", {
110
- name: /create/i
111
- })).toBeDisabled();
112
- });
113
- });
114
- it("enables create button when form is valid", async ()=>{
115
- renderBucketNotificationCreatePage();
116
- await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
117
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:queue");
118
- const checkbox = screen.getByRole("checkbox", {
119
- name: /s3:ObjectCreated:\*/i
120
- });
121
- fireEvent.click(checkbox);
122
- await waitFor(()=>{
123
- expect(screen.getByRole("button", {
124
- name: /create/i
125
- })).toBeEnabled();
126
- });
127
- });
128
- it("creates notification with all fields and navigates on success", async ()=>{
129
- renderBucketNotificationCreatePage();
130
- await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
131
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
132
- fireEvent.click(screen.getByRole("checkbox", {
133
- name: /s3:ObjectCreated:Put/i
134
- }));
135
- await user_event.type(screen.getByLabelText(/prefix/i), "uploads/");
136
- await user_event.type(screen.getByLabelText(/suffix/i), ".jpg");
137
- mockMutate.mockImplementation((_, options)=>{
138
- options?.onSuccess?.();
139
- });
140
- const createButton = screen.getByRole("button", {
141
- name: /create/i
142
- });
143
- await waitFor(()=>expect(createButton).toBeEnabled());
144
- fireEvent.click(createButton);
145
- await waitFor(()=>{
146
- expect(mockMutate).toHaveBeenCalledWith({
147
- Bucket: "test-bucket",
148
- NotificationConfiguration: {
149
- QueueConfigurations: [
150
- {
151
- Id: "test-rule",
152
- QueueArn: "arn:aws:sqs:us-east-1:123:my-queue",
153
- Events: [
154
- "s3:ObjectCreated:Put"
155
- ],
156
- Filter: {
157
- Key: {
158
- FilterRules: [
159
- {
160
- Name: "prefix",
161
- Value: "uploads/"
162
- },
163
- {
164
- Name: "suffix",
165
- Value: ".jpg"
166
- }
167
- ]
168
- }
169
- }
170
- }
171
- ]
172
- }
173
- }, expect.any(Object));
174
- expect(mockNavigate).toHaveBeenCalledWith("/buckets/test-bucket");
175
- });
176
- });
177
- it("creates notification without filters when not provided", async ()=>{
178
- renderBucketNotificationCreatePage();
179
- await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
180
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
181
- fireEvent.click(screen.getByRole("checkbox", {
182
- name: /s3:ObjectRemoved:\*/i
183
- }));
184
- mockMutate.mockImplementation((_, options)=>{
185
- options?.onSuccess?.();
186
- });
187
- const createButton = screen.getByRole("button", {
188
- name: /create/i
189
- });
190
- await waitFor(()=>expect(createButton).toBeEnabled());
191
- fireEvent.click(createButton);
192
- await waitFor(()=>{
193
- expect(mockMutate).toHaveBeenCalledWith({
194
- Bucket: "test-bucket",
195
- NotificationConfiguration: {
196
- QueueConfigurations: [
197
- {
198
- Id: "test-rule",
199
- QueueArn: "arn:aws:sqs:us-east-1:123:my-queue",
200
- Events: [
201
- "s3:ObjectRemoved:*"
202
- ]
203
- }
204
- ]
205
- }
206
- }, expect.any(Object));
207
- });
208
- });
209
- it("preserves existing queue configurations when creating new notification", async ()=>{
210
- const existingConfig = {
211
- QueueConfigurations: [
212
- {
213
- Id: "existing-rule",
214
- QueueArn: "arn:aws:sqs:us-east-1:123:existing-queue",
215
- Events: [
216
- "s3:ObjectCreated:*"
217
- ]
218
- }
219
- ]
220
- };
221
- mockUseGetBucketNotification.mockReturnValue({
222
- data: existingConfig
223
- });
224
- renderBucketNotificationCreatePage();
225
- await user_event.type(screen.getByLabelText(/rule name/i), "new-rule");
226
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:new-queue");
227
- fireEvent.click(screen.getByRole("checkbox", {
228
- name: /^s3:ObjectRemoved:Delete$/i
229
- }));
230
- mockMutate.mockImplementation((_, options)=>{
231
- options?.onSuccess?.();
232
- });
233
- const createButton = screen.getByRole("button", {
234
- name: /create/i
235
- });
236
- await waitFor(()=>expect(createButton).toBeEnabled());
237
- fireEvent.click(createButton);
238
- await waitFor(()=>{
239
- const call = mockMutate.mock.calls[0][0];
240
- expect(call.NotificationConfiguration.QueueConfigurations).toHaveLength(2);
241
- expect(call.NotificationConfiguration.QueueConfigurations[0]).toEqual(existingConfig.QueueConfigurations[0]);
242
- expect(call.NotificationConfiguration.QueueConfigurations[1]).toMatchObject({
243
- Id: "new-rule",
244
- QueueArn: "arn:aws:sqs:us-east-1:123:new-queue",
245
- Events: [
246
- "s3:ObjectRemoved:Delete"
247
- ]
248
- });
249
- });
250
- });
251
- it("displays error message when creation fails", async ()=>{
252
- renderBucketNotificationCreatePage();
253
- await user_event.type(screen.getByLabelText(/rule name/i), "test-rule");
254
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:my-queue");
255
- fireEvent.click(screen.getByRole("checkbox", {
256
- name: /s3:ObjectCreated:\*/i
257
- }));
258
- const error = new Error("Access Denied");
259
- mockMutate.mockImplementation((_, options)=>{
260
- options?.onError?.(error);
261
- });
262
- const createButton = screen.getByRole("button", {
263
- name: /create/i
264
- });
265
- await waitFor(()=>expect(createButton).toBeEnabled());
266
- fireEvent.click(createButton);
267
- await waitFor(()=>{
268
- expect(mockNavigate).not.toHaveBeenCalled();
269
- });
270
- });
271
- it("handles cancel button click and navigates back", ()=>{
272
- renderBucketNotificationCreatePage();
273
- const cancelButton = screen.getByRole("button", {
274
- name: /cancel/i
275
- });
276
- fireEvent.click(cancelButton);
277
- expect(mockNavigate).toHaveBeenCalledWith("/buckets/test-bucket");
278
- });
279
- it("allows selecting multiple events", async ()=>{
280
- renderBucketNotificationCreatePage();
281
- await user_event.type(screen.getByLabelText(/rule name/i), "multi-event");
282
- await user_event.type(screen.getByLabelText(/destination queue/i), "arn:aws:sqs:us-east-1:123:queue");
283
- fireEvent.click(screen.getByRole("checkbox", {
284
- name: /^s3:ObjectCreated:Put$/i
285
- }));
286
- fireEvent.click(screen.getByRole("checkbox", {
287
- name: /^s3:ObjectCreated:Copy$/i
288
- }));
289
- fireEvent.click(screen.getByRole("checkbox", {
290
- name: /^s3:ObjectRemoved:Delete$/i
291
- }));
292
- mockMutate.mockImplementation((_, options)=>{
293
- options?.onSuccess?.();
294
- });
295
- const createButton = screen.getByRole("button", {
296
- name: /create/i
297
- });
298
- await waitFor(()=>expect(createButton).toBeEnabled());
299
- fireEvent.click(createButton);
300
- await waitFor(()=>{
301
- expect(mockMutate).toHaveBeenCalledWith(expect.objectContaining({
302
- NotificationConfiguration: {
303
- QueueConfigurations: [
304
- expect.objectContaining({
305
- Events: expect.arrayContaining([
306
- "s3:ObjectCreated:Put",
307
- "s3:ObjectCreated:Copy",
308
- "s3:ObjectRemoved:Delete"
309
- ])
310
- })
311
- ]
312
- }
313
- }), expect.any(Object));
314
- });
315
- });
316
- });
@@ -1,7 +0,0 @@
1
- interface BucketPolicyButtonProps {
2
- hasPolicy: boolean;
3
- isLoading?: boolean;
4
- onEdit: () => void;
5
- }
6
- export declare const BucketPolicyButton: React.FC<BucketPolicyButtonProps>;
7
- export {};
@@ -1 +0,0 @@
1
- export declare function BucketNotificationCreatePage(): import("react/jsx-runtime").JSX.Element;
@@ -1,234 +0,0 @@
1
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { joiResolver } from "@hookform/resolvers/joi";
3
- import { Form, FormGroup, FormSection, Loader, Stack, Text, useToast } from "@scality/core-ui";
4
- import { convertRemToPixels } from "@scality/core-ui/dist/components/tablev2/TableUtils";
5
- import { Button, Input } from "@scality/core-ui/dist/next";
6
- import joi from "joi";
7
- import { useCallback } from "react";
8
- import { FormProvider, useForm } from "react-hook-form";
9
- import { useNavigate, useParams } from "react-router-dom";
10
- import { useGetBucketNotification, useSetBucketNotification } from "../../../hooks/index.js";
11
- import { EventsSection } from "./EventsSection.js";
12
- const schema = joi.object({
13
- ruleName: joi.string().required().messages({
14
- "string.empty": "This field is required"
15
- }),
16
- queueArn: joi.string().required().pattern(/^arn:aws:sqs:[a-z0-9-]+:\d+:.+$/).messages({
17
- "string.empty": "This field is required",
18
- "string.pattern.base": "Must be a valid ARN (e.g., arn:aws:sqs:region:account-id:queue-name)"
19
- }),
20
- events: joi.array().min(1).required().messages({
21
- "array.min": "At least one event must be selected"
22
- }),
23
- prefix: joi.string().allow("").optional(),
24
- suffix: joi.string().allow("").optional()
25
- });
26
- function BucketNotificationCreatePage() {
27
- const { bucketName } = useParams();
28
- const navigate = useNavigate();
29
- const { showToast } = useToast();
30
- const { data: existingNotificationData, status: notificationStatus } = useGetBucketNotification({
31
- Bucket: bucketName
32
- });
33
- const existingRuleNames = existingNotificationData?.QueueConfigurations?.map((config)=>config.Id) || [];
34
- const dynamicSchema = schema.keys({
35
- ruleName: joi.string().required().invalid(...existingRuleNames).messages({
36
- "string.empty": "This field is required",
37
- "any.invalid": "A rule with this name already exists"
38
- })
39
- });
40
- const methods = useForm({
41
- resolver: joiResolver(dynamicSchema),
42
- mode: "onChange",
43
- defaultValues: {
44
- ruleName: "",
45
- queueArn: "",
46
- events: [],
47
- prefix: "",
48
- suffix: ""
49
- }
50
- });
51
- const { mutate: setNotification, isPending: isSaving } = useSetBucketNotification();
52
- const { handleSubmit, register, formState: { isValid, isDirty, errors } } = methods;
53
- const handleCancel = useCallback(()=>{
54
- navigate(`/buckets/${bucketName}`);
55
- }, [
56
- navigate,
57
- bucketName
58
- ]);
59
- const onSubmit = useCallback((data)=>{
60
- if (!bucketName) return;
61
- const filterRules = [
62
- ...data.prefix ? [
63
- {
64
- Name: "prefix",
65
- Value: data.prefix
66
- }
67
- ] : [],
68
- ...data.suffix ? [
69
- {
70
- Name: "suffix",
71
- Value: data.suffix
72
- }
73
- ] : []
74
- ];
75
- const filteredEvents = data.events.filter((event)=>{
76
- if (event.endsWith("*")) return true;
77
- if (event.startsWith("s3:ObjectCreated:")) return !data.events.includes("s3:ObjectCreated:*");
78
- if (event.startsWith("s3:ObjectRemoved:")) return !data.events.includes("s3:ObjectRemoved:*");
79
- if (event.startsWith("s3:LifecycleExpiration:")) return !data.events.includes("s3:LifecycleExpiration:*");
80
- return true;
81
- });
82
- const newQueueConfiguration = {
83
- Id: data.ruleName,
84
- QueueArn: data.queueArn,
85
- Events: filteredEvents,
86
- ...filterRules.length > 0 && {
87
- Filter: {
88
- Key: {
89
- FilterRules: filterRules
90
- }
91
- }
92
- }
93
- };
94
- setNotification({
95
- Bucket: bucketName,
96
- NotificationConfiguration: {
97
- QueueConfigurations: [
98
- ...existingNotificationData?.QueueConfigurations || [],
99
- newQueueConfiguration
100
- ]
101
- }
102
- }, {
103
- onSuccess: ()=>{
104
- showToast({
105
- open: true,
106
- message: "Notification created successfully",
107
- status: "success"
108
- });
109
- navigate(`/buckets/${bucketName}`);
110
- },
111
- onError: (error)=>{
112
- const errorMessage = error instanceof Error ? error.message : "Failed to create notification";
113
- showToast({
114
- open: true,
115
- message: errorMessage,
116
- status: "error"
117
- });
118
- }
119
- });
120
- }, [
121
- bucketName,
122
- setNotification,
123
- navigate,
124
- showToast,
125
- existingNotificationData
126
- ]);
127
- if ("pending" === notificationStatus) return /*#__PURE__*/ jsx(Loader, {
128
- centered: true,
129
- children: /*#__PURE__*/ jsx(Text, {
130
- children: "Loading..."
131
- })
132
- });
133
- return /*#__PURE__*/ jsx(FormProvider, {
134
- ...methods,
135
- children: /*#__PURE__*/ jsxs(Form, {
136
- layout: {
137
- kind: "page",
138
- title: "Create Bucket Notification"
139
- },
140
- requireMode: "partial",
141
- onSubmit: handleSubmit(onSubmit),
142
- rightActions: /*#__PURE__*/ jsxs(Stack, {
143
- gap: "r16",
144
- children: [
145
- /*#__PURE__*/ jsx(Button, {
146
- id: "cancel-btn",
147
- variant: "outline",
148
- type: "button",
149
- label: "Cancel",
150
- onClick: handleCancel,
151
- disabled: isSaving
152
- }),
153
- /*#__PURE__*/ jsx(Button, {
154
- id: "create-notification-btn",
155
- type: "submit",
156
- variant: "primary",
157
- label: "Create",
158
- disabled: !isDirty || !isValid || isSaving
159
- })
160
- ]
161
- }),
162
- children: [
163
- /*#__PURE__*/ jsx(FormSection, {
164
- forceLabelWidth: convertRemToPixels(13),
165
- children: /*#__PURE__*/ jsx(FormGroup, {
166
- label: "Rule name",
167
- id: "ruleName",
168
- direction: "horizontal",
169
- error: errors?.ruleName?.message,
170
- helpErrorPosition: "bottom",
171
- labelHelpTooltip: /*#__PURE__*/ jsx(Fragment, {}),
172
- required: true,
173
- content: /*#__PURE__*/ jsx(Input, {
174
- id: "ruleName",
175
- ...register("ruleName")
176
- })
177
- })
178
- }),
179
- /*#__PURE__*/ jsx(EventsSection, {}),
180
- /*#__PURE__*/ jsx(FormSection, {
181
- forceLabelWidth: convertRemToPixels(13),
182
- children: /*#__PURE__*/ jsx(FormGroup, {
183
- label: "Destination Queue",
184
- id: "queueArn",
185
- direction: "horizontal",
186
- error: errors?.queueArn?.message,
187
- helpErrorPosition: "bottom",
188
- labelHelpTooltip: /*#__PURE__*/ jsx(Fragment, {}),
189
- required: true,
190
- content: /*#__PURE__*/ jsx(Input, {
191
- id: "queueArn",
192
- placeholder: "arn:aws:sqs:us-east-1:1xx:name",
193
- ...register("queueArn")
194
- })
195
- })
196
- }),
197
- /*#__PURE__*/ jsx(FormSection, {
198
- title: {
199
- name: "Filters"
200
- },
201
- children: /*#__PURE__*/ jsxs(Stack, {
202
- direction: "horizontal",
203
- gap: "r16",
204
- children: [
205
- /*#__PURE__*/ jsx(FormGroup, {
206
- label: "Prefix",
207
- id: "prefix",
208
- direction: "horizontal",
209
- content: /*#__PURE__*/ jsx(Input, {
210
- id: "prefix",
211
- placeholder: "",
212
- size: "2/3",
213
- ...register("prefix")
214
- })
215
- }),
216
- /*#__PURE__*/ jsx(FormGroup, {
217
- label: "Suffix",
218
- id: "suffix",
219
- direction: "horizontal",
220
- content: /*#__PURE__*/ jsx(Input, {
221
- id: "suffix",
222
- placeholder: "",
223
- size: "2/3",
224
- ...register("suffix")
225
- })
226
- })
227
- ]
228
- })
229
- })
230
- ]
231
- })
232
- });
233
- }
234
- export { BucketNotificationCreatePage };
@@ -1,21 +0,0 @@
1
- /**
2
- * S3 Login Authentication Hook
3
- *
4
- * This file contains the login authentication hook using the factory pattern
5
- * for consistency with other S3 operations.
6
- */
7
- import { S3BrowserConfig, S3Credentials } from "../types";
8
- export type LoginConfig = S3BrowserConfig & {
9
- credentials: S3Credentials;
10
- };
11
- export interface LoginMutationResult {
12
- config: LoginConfig;
13
- authenticated: boolean;
14
- }
15
- /**
16
- * Hook for S3 authentication using react-query mutation.
17
- * Validates credentials and establishes S3 session.
18
- *
19
- * Uses the specialized login factory pattern for consistency with other S3 operations.
20
- */
21
- export declare const useLoginMutation: (options?: Omit<import("@tanstack/react-query").UseMutationOptions<LoginMutationResult, import("..").EnhancedS3Error, LoginConfig, unknown>, "mutationFn"> | undefined) => import("@tanstack/react-query").UseMutationResult<LoginMutationResult, import("..").EnhancedS3Error, LoginConfig>;
@@ -1,9 +0,0 @@
1
- import { useCreateS3LoginHook } from "./factories/index.js";
2
- class LoginAuthenticationCommand {
3
- input;
4
- constructor(input){
5
- this.input = input;
6
- }
7
- }
8
- const useLoginMutation = useCreateS3LoginHook(LoginAuthenticationCommand, "S3 Authentication");
9
- export { useLoginMutation };
@@ -1 +0,0 @@
1
- export declare function useFeatures(feature: string): boolean | undefined;
@@ -1,7 +0,0 @@
1
- import { useDataBrowserContext } from "../components/index.js";
2
- function useFeatures(feature) {
3
- const { getS3Config } = useDataBrowserContext();
4
- const config = getS3Config();
5
- return config?.credentials?.features?.includes(feature);
6
- }
7
- export { useFeatures };