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

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 (256) hide show
  1. package/dist/components/Editor.d.ts +12 -0
  2. package/dist/components/Editor.js +28 -0
  3. package/dist/components/__tests__/BucketCreate.test.d.ts +1 -0
  4. package/dist/components/__tests__/BucketCreate.test.js +408 -0
  5. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +1 -0
  6. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  7. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  8. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  9. package/dist/components/__tests__/BucketList.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketList.test.js +415 -0
  11. package/dist/components/__tests__/BucketNotificationCreatePage.test.d.ts +1 -0
  12. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +316 -0
  13. package/dist/components/__tests__/BucketOverview.test.d.ts +1 -0
  14. package/dist/components/__tests__/BucketOverview.test.js +769 -0
  15. package/dist/components/__tests__/BucketPolicyPage.test.d.ts +1 -0
  16. package/dist/components/__tests__/BucketPolicyPage.test.js +268 -0
  17. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  19. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  20. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  21. package/dist/components/__tests__/CreateFolderButton.test.d.ts +1 -0
  22. package/dist/components/__tests__/CreateFolderButton.test.js +147 -0
  23. package/dist/components/__tests__/DeleteBucketButton.test.d.ts +1 -0
  24. package/dist/components/__tests__/DeleteBucketButton.test.js +272 -0
  25. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  26. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  27. package/dist/components/__tests__/DeleteObjectButton.test.d.ts +1 -0
  28. package/dist/components/__tests__/DeleteObjectButton.test.js +302 -0
  29. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  30. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  31. package/dist/components/__tests__/MetadataSearch.test.d.ts +1 -0
  32. package/dist/components/__tests__/MetadataSearch.test.js +201 -0
  33. package/dist/components/__tests__/ObjectList.test.d.ts +1 -0
  34. package/dist/components/__tests__/ObjectList.test.js +283 -0
  35. package/dist/components/__tests__/UploadButton.test.d.ts +1 -0
  36. package/dist/components/__tests__/UploadButton.test.js +144 -0
  37. package/dist/components/buckets/BucketCreate.d.ts +49 -0
  38. package/dist/components/buckets/BucketCreate.js +237 -0
  39. package/dist/components/buckets/BucketDetails.d.ts +1 -0
  40. package/dist/components/buckets/BucketDetails.js +106 -0
  41. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  42. package/dist/components/buckets/BucketLifecycleFormPage.js +1085 -0
  43. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  44. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  45. package/dist/components/buckets/BucketList.d.ts +15 -0
  46. package/dist/components/buckets/BucketList.js +146 -0
  47. package/dist/components/buckets/BucketLocation.d.ts +3 -0
  48. package/dist/components/buckets/BucketLocation.js +16 -0
  49. package/dist/components/buckets/BucketOverview.d.ts +88 -0
  50. package/dist/components/buckets/BucketOverview.js +291 -0
  51. package/dist/components/buckets/BucketPage.d.ts +2 -0
  52. package/dist/components/buckets/BucketPage.js +47 -0
  53. package/dist/components/buckets/BucketPolicyButton.d.ts +7 -0
  54. package/dist/components/buckets/BucketPolicyButton.js +18 -0
  55. package/dist/components/buckets/BucketPolicyPage.d.ts +1 -0
  56. package/dist/components/buckets/BucketPolicyPage.js +236 -0
  57. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  58. package/dist/components/buckets/BucketReplicationFormPage.js +834 -0
  59. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  60. package/dist/components/buckets/BucketReplicationList.js +189 -0
  61. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  62. package/dist/components/buckets/BucketVersioning.js +73 -0
  63. package/dist/components/buckets/DeleteBucketButton.d.ts +8 -0
  64. package/dist/components/buckets/DeleteBucketButton.js +78 -0
  65. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  66. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  67. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  68. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  69. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  70. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  71. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  72. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  73. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  74. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  75. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +1 -0
  76. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +234 -0
  77. package/dist/components/buckets/notifications/EventsSection.d.ts +1 -0
  78. package/dist/components/buckets/notifications/EventsSection.js +123 -0
  79. package/dist/components/buckets/notifications/events.d.ts +12 -0
  80. package/dist/components/buckets/notifications/events.js +27 -0
  81. package/dist/components/index.d.ts +21 -0
  82. package/dist/components/index.js +22 -0
  83. package/dist/components/layouts/ArrowNavigation.d.ts +4 -0
  84. package/dist/components/layouts/ArrowNavigation.js +16 -0
  85. package/dist/components/layouts/BrowserPageLayout.d.ts +12 -0
  86. package/dist/components/layouts/BrowserPageLayout.js +51 -0
  87. package/dist/components/objects/CreateFolderButton.d.ts +29 -0
  88. package/dist/components/objects/CreateFolderButton.js +118 -0
  89. package/dist/components/objects/DeleteObjectButton.d.ts +8 -0
  90. package/dist/components/objects/DeleteObjectButton.js +191 -0
  91. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -0
  92. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +356 -0
  93. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +3 -0
  94. package/dist/components/objects/ObjectDetails/ObjectSummary.js +241 -0
  95. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +3 -0
  96. package/dist/components/objects/ObjectDetails/ObjectTags.js +272 -0
  97. package/dist/components/objects/ObjectDetails/index.d.ts +9 -0
  98. package/dist/components/objects/ObjectDetails/index.js +75 -0
  99. package/dist/components/objects/ObjectList.d.ts +40 -0
  100. package/dist/components/objects/ObjectList.js +453 -0
  101. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  102. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  103. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  104. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  105. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  106. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +158 -0
  107. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  108. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  109. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  110. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  111. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  112. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  113. package/dist/components/objects/ObjectPage.d.ts +1 -0
  114. package/dist/components/objects/ObjectPage.js +45 -0
  115. package/dist/components/objects/UploadButton.d.ts +34 -0
  116. package/dist/components/objects/UploadButton.js +229 -0
  117. package/dist/components/providers/DataBrowserProvider.d.ts +20 -0
  118. package/dist/components/providers/DataBrowserProvider.js +42 -0
  119. package/dist/components/search/MetadataSearch.d.ts +5 -0
  120. package/dist/components/search/MetadataSearch.js +162 -0
  121. package/dist/components/search/SearchHints.d.ts +8 -0
  122. package/dist/components/search/SearchHints.js +21 -0
  123. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  124. package/dist/components/ui/ArrayFieldActions.js +43 -0
  125. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  126. package/dist/components/ui/ConfirmDeleteRuleModal.js +43 -0
  127. package/dist/components/ui/DeleteObjectModalContent.d.ts +5 -0
  128. package/dist/components/ui/DeleteObjectModalContent.js +71 -0
  129. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  130. package/dist/components/ui/FilterFormSection.js +159 -0
  131. package/dist/components/ui/Search.elements.d.ts +17 -0
  132. package/dist/components/ui/Search.elements.js +59 -0
  133. package/dist/components/ui/Table.elements.d.ts +36 -0
  134. package/dist/components/ui/Table.elements.js +87 -0
  135. package/dist/config/factory.d.ts +63 -0
  136. package/dist/config/factory.js +74 -0
  137. package/dist/config/types.d.ts +46 -0
  138. package/dist/config/types.js +0 -0
  139. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  140. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  141. package/dist/hooks/__tests__/useIsBucketEmpty.test.d.ts +1 -0
  142. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +122 -0
  143. package/dist/hooks/bucketConfiguration.d.ts +168 -0
  144. package/dist/hooks/bucketConfiguration.js +67 -0
  145. package/dist/hooks/bucketOperations.d.ts +36 -0
  146. package/dist/hooks/bucketOperations.js +12 -0
  147. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.d.ts +1 -0
  148. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +276 -0
  149. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.d.ts +1 -0
  150. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +259 -0
  151. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.d.ts +1 -0
  152. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +166 -0
  153. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.d.ts +1 -0
  154. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +200 -0
  155. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.d.ts +1 -0
  156. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +179 -0
  157. package/dist/hooks/factories/index.d.ts +18 -0
  158. package/dist/hooks/factories/index.js +5 -0
  159. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +13 -0
  160. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +76 -0
  161. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +8 -0
  162. package/dist/hooks/factories/useCreateS3LoginHook.js +22 -0
  163. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +5 -0
  164. package/dist/hooks/factories/useCreateS3MutationHook.js +50 -0
  165. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +3 -0
  166. package/dist/hooks/factories/useCreateS3QueryHook.js +51 -0
  167. package/dist/hooks/index.d.ts +13 -0
  168. package/dist/hooks/index.js +13 -0
  169. package/dist/hooks/loginOperations.d.ts +21 -0
  170. package/dist/hooks/loginOperations.js +9 -0
  171. package/dist/hooks/objectOperations.d.ts +190 -0
  172. package/dist/hooks/objectOperations.js +67 -0
  173. package/dist/hooks/presignedOperations.d.ts +73 -0
  174. package/dist/hooks/presignedOperations.js +72 -0
  175. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  176. package/dist/hooks/useBatchObjectLegalHold.js +45 -0
  177. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  178. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  179. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  180. package/dist/hooks/useEmptyBucket.js +116 -0
  181. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  182. package/dist/hooks/useISVBucketDetection.js +27 -0
  183. package/dist/hooks/useIsBucketEmpty.d.ts +7 -0
  184. package/dist/hooks/useIsBucketEmpty.js +36 -0
  185. package/dist/hooks/useLoginMutation.d.ts +21 -0
  186. package/dist/hooks/useLoginMutation.js +9 -0
  187. package/dist/hooks/useS3Client.d.ts +1 -0
  188. package/dist/hooks/useS3Client.js +13 -0
  189. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  190. package/dist/hooks/useTableRowSelection.js +45 -0
  191. package/dist/index.d.ts +6 -0
  192. package/dist/index.js +6 -0
  193. package/dist/schemas/bucketPolicySchema.json +321 -0
  194. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -0
  195. package/dist/test/msw/handlers/deleteBucket.js +14 -0
  196. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -0
  197. package/dist/test/msw/handlers/getBucketAcl.js +96 -0
  198. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -0
  199. package/dist/test/msw/handlers/getBucketLocation.js +23 -0
  200. package/dist/test/msw/handlers/getBucketPolicy.d.ts +11 -0
  201. package/dist/test/msw/handlers/getBucketPolicy.js +72 -0
  202. package/dist/test/msw/handlers/headObject.d.ts +1 -0
  203. package/dist/test/msw/handlers/headObject.js +17 -0
  204. package/dist/test/msw/handlers/listBuckets.d.ts +1 -0
  205. package/dist/test/msw/handlers/listBuckets.js +24 -0
  206. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -0
  207. package/dist/test/msw/handlers/listObjectVersions.js +83 -0
  208. package/dist/test/msw/handlers/listObjects.d.ts +1 -0
  209. package/dist/test/msw/handlers/listObjects.js +66 -0
  210. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -0
  211. package/dist/test/msw/handlers/objectLegalHold.js +24 -0
  212. package/dist/test/msw/handlers/objectRetention.d.ts +1 -0
  213. package/dist/test/msw/handlers/objectRetention.js +27 -0
  214. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -0
  215. package/dist/test/msw/handlers/putBucketAcl.js +18 -0
  216. package/dist/test/msw/handlers/putObject.d.ts +1 -0
  217. package/dist/test/msw/handlers/putObject.js +16 -0
  218. package/dist/test/msw/handlers.d.ts +4 -0
  219. package/dist/test/msw/handlers.js +109 -0
  220. package/dist/test/msw/index.d.ts +2 -0
  221. package/dist/test/msw/index.js +3 -0
  222. package/dist/test/msw/server.d.ts +4 -0
  223. package/dist/test/msw/server.js +20 -0
  224. package/dist/test/msw/utils.d.ts +2 -0
  225. package/dist/test/msw/utils.js +13 -0
  226. package/dist/test/setup.d.ts +1 -0
  227. package/dist/test/setup.js +90 -0
  228. package/dist/test/testUtils.d.ts +181 -0
  229. package/dist/test/testUtils.js +310 -0
  230. package/dist/test/utils/errorHandling.test.d.ts +1 -0
  231. package/dist/test/utils/errorHandling.test.js +423 -0
  232. package/dist/types/index.d.ts +51 -0
  233. package/dist/types/index.js +0 -0
  234. package/dist/utils/constants.d.ts +12 -0
  235. package/dist/utils/constants.js +9 -0
  236. package/dist/utils/deletion/index.d.ts +2 -0
  237. package/dist/utils/deletion/index.js +2 -0
  238. package/dist/utils/deletion/messages.d.ts +5 -0
  239. package/dist/utils/deletion/messages.js +29 -0
  240. package/dist/utils/deletion/types.d.ts +11 -0
  241. package/dist/utils/deletion/types.js +0 -0
  242. package/dist/utils/errorHandling.d.ts +63 -0
  243. package/dist/utils/errorHandling.js +84 -0
  244. package/dist/utils/hooks.d.ts +2 -0
  245. package/dist/utils/hooks.js +26 -0
  246. package/dist/utils/index.d.ts +4 -0
  247. package/dist/utils/index.js +4 -0
  248. package/dist/utils/proxyMiddleware.d.ts +18 -0
  249. package/dist/utils/proxyMiddleware.js +56 -0
  250. package/dist/utils/s3Client.d.ts +5 -0
  251. package/dist/utils/s3Client.js +36 -0
  252. package/dist/utils/s3RuleUtils.d.ts +53 -0
  253. package/dist/utils/s3RuleUtils.js +101 -0
  254. package/dist/utils/useFeatures.d.ts +1 -0
  255. package/dist/utils/useFeatures.js +7 -0
  256. package/package.json +84 -0
@@ -0,0 +1,201 @@
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 } from "react-router-dom";
5
+ import { createQueryWrapper } from "../../test/testUtils.js";
6
+ import { MetadataSearch } from "../search/MetadataSearch.js";
7
+ const renderMetadataSearch = (props = {}, initialEntries = [
8
+ "/bucket/test-bucket"
9
+ ])=>{
10
+ const QueryWrapper = createQueryWrapper();
11
+ return render(/*#__PURE__*/ jsx(QueryWrapper, {
12
+ children: /*#__PURE__*/ jsx(MemoryRouter, {
13
+ initialEntries: initialEntries,
14
+ children: /*#__PURE__*/ jsx(MetadataSearch, {
15
+ isError: false,
16
+ ...props
17
+ })
18
+ })
19
+ }));
20
+ };
21
+ describe("MetadataSearch", ()=>{
22
+ const getInput = ()=>screen.getByPlaceholderText(/Metadata Search/i);
23
+ it("renders search input with placeholder", ()=>{
24
+ renderMetadataSearch();
25
+ expect(getInput()).toBeInTheDocument();
26
+ expect(screen.getByPlaceholderText(/Metadata Search/i)).toBeInTheDocument();
27
+ });
28
+ it("renders search button", ()=>{
29
+ renderMetadataSearch();
30
+ expect(screen.getByRole("button", {
31
+ name: /execute metadata search/i
32
+ })).toBeInTheDocument();
33
+ });
34
+ it("search button is disabled when input is empty", ()=>{
35
+ renderMetadataSearch();
36
+ const searchButton = screen.getByRole("button", {
37
+ name: /execute metadata search/i
38
+ });
39
+ expect(searchButton).toBeDisabled();
40
+ });
41
+ it("search button is enabled when input has text", async ()=>{
42
+ renderMetadataSearch();
43
+ const input = getInput();
44
+ const searchButton = screen.getByRole("button", {
45
+ name: /execute metadata search/i
46
+ });
47
+ await user_event.type(input, "test query");
48
+ expect(searchButton).toBeEnabled();
49
+ });
50
+ it("shows search icon by default", ()=>{
51
+ renderMetadataSearch();
52
+ const input = getInput();
53
+ const searchIcon = input.parentElement?.querySelector('[aria-label*="Search"]');
54
+ expect(searchIcon).toBeInTheDocument();
55
+ });
56
+ it("shows check icon when metadata search is active", ()=>{
57
+ renderMetadataSearch({}, [
58
+ "/bucket/test-bucket?metadatasearch=test"
59
+ ]);
60
+ const input = getInput();
61
+ const checkIcon = input.parentElement?.querySelector('[aria-label*="Check"]');
62
+ expect(checkIcon).toBeInTheDocument();
63
+ });
64
+ it("shows error icon when error prop is true", ()=>{
65
+ renderMetadataSearch({
66
+ isError: true
67
+ });
68
+ const input = getInput();
69
+ const errorIcon = input.parentElement?.querySelector('[aria-label*="Close"]');
70
+ expect(errorIcon).toBeInTheDocument();
71
+ });
72
+ it("populates input with existing search query from URL", ()=>{
73
+ renderMetadataSearch({}, [
74
+ "/bucket/test-bucket?metadatasearch=existing+query"
75
+ ]);
76
+ const input = getInput();
77
+ expect(input).toHaveValue("existing query");
78
+ });
79
+ it("shows reset button when input has text", async ()=>{
80
+ renderMetadataSearch();
81
+ const input = getInput();
82
+ await user_event.type(input, "test query");
83
+ expect(screen.getByRole("button", {
84
+ name: /clear search input/i
85
+ })).toBeInTheDocument();
86
+ });
87
+ it("clears input when reset button is clicked", async ()=>{
88
+ renderMetadataSearch();
89
+ const input = getInput();
90
+ await user_event.type(input, "test query");
91
+ const resetButton = screen.getByRole("button", {
92
+ name: /clear search input/i
93
+ });
94
+ fireEvent.click(resetButton);
95
+ expect(input).toHaveValue("");
96
+ });
97
+ it("shows hints when input is clicked and empty", async ()=>{
98
+ renderMetadataSearch();
99
+ const input = getInput();
100
+ fireEvent.click(input);
101
+ await waitFor(()=>{
102
+ expect(screen.getByText("Suggestions")).toBeInTheDocument();
103
+ });
104
+ });
105
+ it("does not show hints when input has text", async ()=>{
106
+ renderMetadataSearch();
107
+ const input = getInput();
108
+ await user_event.type(input, "test");
109
+ fireEvent.click(input);
110
+ expect(screen.queryByText("Suggestions")).not.toBeInTheDocument();
111
+ });
112
+ it("hides hints when clicking outside", async ()=>{
113
+ renderMetadataSearch();
114
+ const input = getInput();
115
+ fireEvent.click(input);
116
+ await waitFor(()=>{
117
+ expect(screen.getByText("Suggestions")).toBeInTheDocument();
118
+ });
119
+ fireEvent.mouseDown(document.body);
120
+ await waitFor(()=>{
121
+ expect(screen.queryByText("Suggestions")).not.toBeInTheDocument();
122
+ });
123
+ });
124
+ it("displays search hint examples", async ()=>{
125
+ renderMetadataSearch();
126
+ const input = getInput();
127
+ fireEvent.click(input);
128
+ await waitFor(()=>{
129
+ expect(screen.getByText('files with extension ".pdf"')).toBeInTheDocument();
130
+ expect(screen.getByText("files bigger than 1MB")).toBeInTheDocument();
131
+ expect(screen.getByText("files tagged with color blue")).toBeInTheDocument();
132
+ });
133
+ });
134
+ it("applies hint to input when hint is clicked", async ()=>{
135
+ renderMetadataSearch();
136
+ const input = getInput();
137
+ fireEvent.click(input);
138
+ await waitFor(()=>{
139
+ expect(screen.getByText("Suggestions")).toBeInTheDocument();
140
+ });
141
+ const pdfHint = screen.getByText('files with extension ".pdf"');
142
+ fireEvent.click(pdfHint);
143
+ expect(input).toHaveValue("key like /pdf$/");
144
+ expect(screen.queryByText("Suggestions")).not.toBeInTheDocument();
145
+ });
146
+ it("focuses input after hint is selected", async ()=>{
147
+ renderMetadataSearch();
148
+ const input = getInput();
149
+ fireEvent.click(input);
150
+ await waitFor(()=>{
151
+ expect(screen.getByText("Suggestions")).toBeInTheDocument();
152
+ });
153
+ const hint = screen.getByText("files bigger than 1MB");
154
+ fireEvent.click(hint);
155
+ expect(input).toHaveFocus();
156
+ });
157
+ it("submits search when form is submitted", async ()=>{
158
+ renderMetadataSearch();
159
+ const input = getInput();
160
+ const searchButton = screen.getByRole("button", {
161
+ name: /execute metadata search/i
162
+ });
163
+ await user_event.type(input, "content-type=application/pdf");
164
+ fireEvent.click(searchButton);
165
+ expect(input).toHaveValue("content-type=application/pdf");
166
+ });
167
+ it("submits search when Enter key is pressed", async ()=>{
168
+ renderMetadataSearch();
169
+ const input = getInput();
170
+ await user_event.type(input, "key like /test$/");
171
+ fireEvent.submit(input.closest("form"));
172
+ expect(input).toHaveValue("key like /test$/");
173
+ });
174
+ it("is hidden when prefix points to a file", ()=>{
175
+ const { container } = renderMetadataSearch({}, [
176
+ "/bucket/test-bucket?prefix=folder/file.txt"
177
+ ]);
178
+ const form = container.querySelector("form");
179
+ expect(form).toHaveStyle({
180
+ visibility: "hidden"
181
+ });
182
+ });
183
+ it("is hidden when prefix is a folder", ()=>{
184
+ const { container } = renderMetadataSearch({}, [
185
+ "/bucket/test-bucket?prefix=folder/"
186
+ ]);
187
+ const form = container.querySelector("form");
188
+ expect(form).toHaveStyle({
189
+ visibility: "hidden"
190
+ });
191
+ });
192
+ it("prevents search submission when prefix points to a file", async ()=>{
193
+ const { container } = renderMetadataSearch({}, [
194
+ "/bucket/test-bucket?prefix=folder/file.txt"
195
+ ]);
196
+ const input = getInput();
197
+ const searchButton = container.querySelector('button[type="submit"]');
198
+ await user_event.type(input, "test query");
199
+ expect(searchButton).toBeDisabled();
200
+ });
201
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,283 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { fireEvent, render, renderHook, screen, waitFor } from "@testing-library/react";
3
+ import { MemoryRouter } from "react-router";
4
+ import { createTestWrapper, mockOffsetSize, setupMswServer } from "../../test/testUtils.js";
5
+ import { useListObjectVersions, useListObjects } from "../../hooks/index.js";
6
+ import { ObjectList } from "../objects/ObjectList.js";
7
+ import * as __WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__ from "../../utils/useFeatures.js";
8
+ setupMswServer();
9
+ const renderObjectList = (props = {})=>{
10
+ const Wrapper = createTestWrapper();
11
+ return render(/*#__PURE__*/ jsx(MemoryRouter, {
12
+ children: /*#__PURE__*/ jsx(Wrapper, {
13
+ children: /*#__PURE__*/ jsx(ObjectList, {
14
+ bucketName: "test-bucket",
15
+ prefix: "",
16
+ onObjectSelect: jest.fn(),
17
+ onPrefixChange: jest.fn(),
18
+ ...props
19
+ })
20
+ })
21
+ }));
22
+ };
23
+ describe("ObjectList", ()=>{
24
+ beforeEach(()=>{
25
+ jest.clearAllMocks();
26
+ mockOffsetSize(800, 600);
27
+ jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, "useFeatures").mockReturnValue(false);
28
+ });
29
+ afterEach(()=>{
30
+ jest.restoreAllMocks();
31
+ });
32
+ it("shows a table with proper headers", async ()=>{
33
+ renderObjectList();
34
+ await waitFor(()=>{
35
+ expect(screen.getByRole("grid")).toBeInTheDocument();
36
+ });
37
+ expect(screen.getByText("Name")).toBeInTheDocument();
38
+ expect(screen.getByText("Modified on")).toBeInTheDocument();
39
+ expect(screen.getByText("Size")).toBeInTheDocument();
40
+ expect(screen.getByText("Storage Location")).toBeInTheDocument();
41
+ });
42
+ it("renders content and handles interactions", async ()=>{
43
+ const onObjectSelect = jest.fn();
44
+ const onPrefixChange = jest.fn();
45
+ renderObjectList({
46
+ onObjectSelect,
47
+ onPrefixChange
48
+ });
49
+ await waitFor(()=>{
50
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
51
+ });
52
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
53
+ expect(screen.getByText("file2.txt")).toBeInTheDocument();
54
+ expect(screen.getByText("folder1/")).toBeInTheDocument();
55
+ fireEvent.click(screen.getByText("file1.txt"));
56
+ expect(onObjectSelect).toHaveBeenCalledWith(expect.objectContaining({
57
+ Key: "file1.txt",
58
+ type: "object"
59
+ }));
60
+ fireEvent.click(screen.getByText("folder1/"));
61
+ expect(onPrefixChange).toHaveBeenCalledWith("folder1/");
62
+ const rows = screen.getAllByRole("row");
63
+ expect(rows.length).toBe(4);
64
+ });
65
+ it("displays data formatting correctly", async ()=>{
66
+ renderObjectList();
67
+ await waitFor(()=>{
68
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
69
+ });
70
+ const gridElement = screen.getByRole("grid");
71
+ expect(gridElement).toHaveTextContent("2023");
72
+ const dateElements = screen.getAllByText(/2023/);
73
+ expect(dateElements.length).toBeGreaterThanOrEqual(2);
74
+ expect(screen.getByText("1 KB")).toBeInTheDocument();
75
+ expect(screen.getByText("512 B")).toBeInTheDocument();
76
+ const defaultElements = screen.getAllByText("default");
77
+ expect(defaultElements.length).toBeGreaterThan(0);
78
+ const dashes = screen.getAllByText("-");
79
+ expect(dashes.length).toBeGreaterThanOrEqual(2);
80
+ });
81
+ it("handles edge cases gracefully", async ()=>{
82
+ renderObjectList({
83
+ bucketName: "empty-bucket"
84
+ });
85
+ await waitFor(()=>{
86
+ expect(screen.getByRole("grid")).toBeInTheDocument();
87
+ });
88
+ expect(screen.getByText("Name")).toBeInTheDocument();
89
+ const mockOnObjectSelect = jest.fn();
90
+ const mockOnPrefixChange = jest.fn();
91
+ renderObjectList({
92
+ onObjectSelect: mockOnObjectSelect,
93
+ onPrefixChange: mockOnPrefixChange
94
+ });
95
+ await waitFor(()=>{
96
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
97
+ });
98
+ expect(()=>{
99
+ fireEvent.click(screen.getByText("file1.txt"));
100
+ fireEvent.click(screen.getByText("folder1/"));
101
+ }).not.toThrow();
102
+ expect(mockOnObjectSelect).toHaveBeenCalled();
103
+ expect(mockOnPrefixChange).toHaveBeenCalled();
104
+ });
105
+ it("handles loading states", async ()=>{
106
+ renderObjectList();
107
+ expect(screen.getByRole("grid")).toBeInTheDocument();
108
+ await waitFor(()=>{
109
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
110
+ });
111
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
112
+ expect(screen.getByText("file2.txt")).toBeInTheDocument();
113
+ expect(screen.getByText("folder1/")).toBeInTheDocument();
114
+ });
115
+ it("prevents event propagation when clicking links", async ()=>{
116
+ const onObjectSelect = jest.fn();
117
+ const onPrefixChange = jest.fn();
118
+ renderObjectList({
119
+ onObjectSelect,
120
+ onPrefixChange
121
+ });
122
+ await waitFor(()=>{
123
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
124
+ });
125
+ fireEvent.click(screen.getByText("file1.txt"));
126
+ expect(onObjectSelect).toHaveBeenCalledWith(expect.objectContaining({
127
+ Key: "file1.txt",
128
+ type: "object"
129
+ }));
130
+ expect(onPrefixChange).not.toHaveBeenCalled();
131
+ });
132
+ it("supports prefix-based navigation", async ()=>{
133
+ renderObjectList({
134
+ prefix: "folder1/"
135
+ });
136
+ await waitFor(()=>{
137
+ expect(screen.getByRole("grid")).toBeInTheDocument();
138
+ });
139
+ expect(screen.getByText("Name")).toBeInTheDocument();
140
+ });
141
+ it("displays correct icons for folders and files", async ()=>{
142
+ renderObjectList();
143
+ await waitFor(()=>{
144
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
145
+ });
146
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
147
+ expect(screen.getByText("file2.txt")).toBeInTheDocument();
148
+ expect(screen.getByText("folder1/")).toBeInTheDocument();
149
+ const nameCells = screen.getAllByRole("gridcell").filter((cell)=>cell.textContent?.includes("folder1/") || cell.textContent?.includes("file1.txt") || cell.textContent?.includes("file2.txt"));
150
+ expect(nameCells.length).toBe(3);
151
+ nameCells.forEach((cell)=>{
152
+ const iconElement = cell.querySelector("svg, img, i");
153
+ const linkElement = cell.querySelector("a");
154
+ expect(iconElement).toBeInTheDocument();
155
+ expect(linkElement).toBeInTheDocument();
156
+ });
157
+ });
158
+ it("integrates with MultiSelectableContent", async ()=>{
159
+ renderObjectList();
160
+ await waitFor(()=>{
161
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
162
+ });
163
+ expect(screen.getByRole("grid")).toBeInTheDocument();
164
+ const rows = screen.getAllByRole("row");
165
+ expect(rows.length).toBe(4);
166
+ });
167
+ it("handles infinite scroll pagination correctly", async ()=>{
168
+ renderObjectList({
169
+ bucketName: "paginated-bucket"
170
+ });
171
+ await waitFor(()=>{
172
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
173
+ });
174
+ expect(screen.getByText("file1.txt")).toBeInTheDocument();
175
+ expect(screen.getByText("file2.txt")).toBeInTheDocument();
176
+ expect(screen.getByText("folder1/")).toBeInTheDocument();
177
+ expect(screen.queryByText("file3.txt")).not.toBeInTheDocument();
178
+ const table = screen.getByRole("grid");
179
+ expect(table).toBeInTheDocument();
180
+ const tableContent = table.querySelector('[role="rowgroup"]') || table.querySelector('[data-testid*="multi-selectable"]');
181
+ expect(tableContent).toBeInTheDocument();
182
+ const rows = screen.getAllByRole("row");
183
+ expect(rows.length).toBe(4);
184
+ expect(()=>{
185
+ screen.getByText("Name");
186
+ screen.getByText("Modified on");
187
+ screen.getByText("Size");
188
+ screen.getByText("Storage Location");
189
+ }).not.toThrow();
190
+ expect(screen.getByText("1 KB")).toBeInTheDocument();
191
+ expect(screen.getByText("512 B")).toBeInTheDocument();
192
+ });
193
+ it("integrates with infinite query hook for data loading", async ()=>{
194
+ const { result } = renderHook(()=>useListObjects({
195
+ Bucket: "paginated-bucket",
196
+ MaxKeys: 20,
197
+ Delimiter: "/"
198
+ }), {
199
+ wrapper: createTestWrapper()
200
+ });
201
+ await waitFor(()=>{
202
+ expect(result.current.isSuccess).toBe(true);
203
+ });
204
+ expect(result.current.data).toBeDefined();
205
+ expect(result.current.hasNextPage).toBe(true);
206
+ expect(typeof result.current.fetchNextPage).toBe("function");
207
+ expect(result.current.isFetchingNextPage).toBe(false);
208
+ const firstPage = result.current.data?.pages[0];
209
+ expect(firstPage).toBeDefined();
210
+ expect(firstPage?.Contents).toHaveLength(2);
211
+ expect(firstPage?.CommonPrefixes).toHaveLength(1);
212
+ result.current.fetchNextPage();
213
+ await waitFor(()=>{
214
+ const updatedData = result.current.data;
215
+ expect(updatedData?.pages).toHaveLength(2);
216
+ });
217
+ const secondPage = result.current.data?.pages[1];
218
+ expect(secondPage).toBeDefined();
219
+ expect(secondPage?.Contents).toHaveLength(1);
220
+ expect(result.current.hasNextPage).toBe(false);
221
+ });
222
+ it("renders List Versions toggle", async ()=>{
223
+ renderObjectList();
224
+ await waitFor(()=>{
225
+ expect(screen.getByText("List Versions")).toBeInTheDocument();
226
+ });
227
+ const toggleLabel = screen.getByText(/list versions/i);
228
+ const toggle = toggleLabel.closest("label")?.querySelector('input[type="checkbox"]');
229
+ expect(toggle).toBeInTheDocument();
230
+ expect(toggle).not.toBeChecked();
231
+ });
232
+ it("shows Version ID column when toggle is enabled", async ()=>{
233
+ renderObjectList();
234
+ await waitFor(()=>{
235
+ expect(screen.getByText("List Versions")).toBeInTheDocument();
236
+ });
237
+ const toggleLabel = screen.getByText(/list versions/i);
238
+ const toggle = toggleLabel.closest("label")?.querySelector('input[type="checkbox"]');
239
+ fireEvent.click(toggle);
240
+ await waitFor(()=>{
241
+ expect(screen.getByText("Version ID")).toBeInTheDocument();
242
+ });
243
+ });
244
+ it("does not show Version ID column by default", async ()=>{
245
+ renderObjectList();
246
+ await waitFor(()=>{
247
+ expect(screen.getByText("Name")).toBeInTheDocument();
248
+ });
249
+ expect(screen.queryByText("Version ID")).not.toBeInTheDocument();
250
+ });
251
+ it("integrates with version listing hook", async ()=>{
252
+ const { result } = renderHook(()=>useListObjectVersions({
253
+ Bucket: "test-bucket",
254
+ MaxKeys: 20,
255
+ Delimiter: "/"
256
+ }), {
257
+ wrapper: createTestWrapper()
258
+ });
259
+ await waitFor(()=>{
260
+ expect(result.current.isSuccess).toBe(true);
261
+ });
262
+ expect(result.current.data).toBeDefined();
263
+ expect(typeof result.current.fetchNextPage).toBe("function");
264
+ const firstPage = result.current.data?.pages[0];
265
+ expect(firstPage).toBeDefined();
266
+ });
267
+ it("renders table search when metadata-search feature is disabled", async ()=>{
268
+ jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, "useFeatures").mockReturnValue(false);
269
+ renderObjectList();
270
+ await waitFor(()=>{
271
+ expect(screen.getByRole("grid")).toBeInTheDocument();
272
+ });
273
+ expect(screen.queryByPlaceholderText(/Metadata Search/i)).not.toBeInTheDocument();
274
+ });
275
+ it("renders MetadataSearch component when metadata-search feature is enabled", async ()=>{
276
+ jest.spyOn(__WEBPACK_EXTERNAL_MODULE__utils_useFeatures_js_1facdd0d__, "useFeatures").mockReturnValue(true);
277
+ renderObjectList();
278
+ await waitFor(()=>{
279
+ expect(screen.getByRole("grid")).toBeInTheDocument();
280
+ });
281
+ expect(screen.getByPlaceholderText(/Metadata Search/i)).toBeInTheDocument();
282
+ });
283
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
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 { createTestWrapper } from "../../test/testUtils.js";
5
+ import { UploadButton } from "../objects/UploadButton.js";
6
+ describe("UploadButton - Core Functionality", ()=>{
7
+ const defaultProps = {
8
+ bucket: "test-bucket",
9
+ prefix: "test-prefix"
10
+ };
11
+ const renderUploadButton = (props = {})=>{
12
+ const Wrapper = createTestWrapper();
13
+ return render(/*#__PURE__*/ jsx(Wrapper, {
14
+ children: /*#__PURE__*/ jsx(UploadButton, {
15
+ ...defaultProps,
16
+ ...props
17
+ })
18
+ }));
19
+ };
20
+ it("renders upload button with default label", ()=>{
21
+ renderUploadButton();
22
+ expect(screen.getByRole("button", {
23
+ name: /upload/i
24
+ })).toBeInTheDocument();
25
+ });
26
+ it("renders upload button", ()=>{
27
+ renderUploadButton();
28
+ expect(screen.getByRole("button", {
29
+ name: /upload/i
30
+ })).toBeInTheDocument();
31
+ });
32
+ it("opens modal when upload button is clicked", async ()=>{
33
+ renderUploadButton();
34
+ const uploadButton = screen.getByRole("button", {
35
+ name: /upload/i
36
+ });
37
+ fireEvent.click(uploadButton);
38
+ await waitFor(()=>{
39
+ expect(screen.getByText("Upload Files")).toBeInTheDocument();
40
+ });
41
+ });
42
+ it("closes modal when cancel button is clicked", async ()=>{
43
+ renderUploadButton();
44
+ const uploadButton = screen.getByRole("button", {
45
+ name: /upload/i
46
+ });
47
+ fireEvent.click(uploadButton);
48
+ await waitFor(()=>{
49
+ expect(screen.getByText("Upload Files")).toBeInTheDocument();
50
+ });
51
+ const cancelButton = screen.getByRole("button", {
52
+ name: /cancel/i
53
+ });
54
+ fireEvent.click(cancelButton);
55
+ await waitFor(()=>{
56
+ expect(screen.queryByText("Upload Files")).not.toBeInTheDocument();
57
+ });
58
+ });
59
+ it("displays empty state initially", async ()=>{
60
+ renderUploadButton();
61
+ const uploadButton = screen.getByRole("button", {
62
+ name: /upload/i
63
+ });
64
+ fireEvent.click(uploadButton);
65
+ await waitFor(()=>{
66
+ expect(screen.getByText("Drag and drop files and folders here")).toBeInTheDocument();
67
+ expect(screen.getByRole("button", {
68
+ name: /add files/i
69
+ })).toBeInTheDocument();
70
+ });
71
+ });
72
+ it("can add files and shows upload button enabled", async ()=>{
73
+ const onUploadSuccess = jest.fn();
74
+ renderUploadButton({
75
+ onUploadSuccess
76
+ });
77
+ const uploadButton = screen.getByRole("button", {
78
+ name: /upload/i
79
+ });
80
+ fireEvent.click(uploadButton);
81
+ await waitFor(()=>{
82
+ expect(screen.getByText("Upload Files")).toBeInTheDocument();
83
+ });
84
+ const uploadButtons = screen.getAllByRole("button", {
85
+ name: "Upload"
86
+ });
87
+ const modalUploadButton = uploadButtons.find((button)=>!button.querySelector("svg"));
88
+ expect(modalUploadButton).toBeDisabled();
89
+ const fileInput = screen.getByRole("presentation").querySelector('input[type="file"]');
90
+ const testFile = new File([
91
+ "test content"
92
+ ], "test.txt", {
93
+ type: "text/plain"
94
+ });
95
+ await user_event.upload(fileInput, testFile);
96
+ await waitFor(()=>{
97
+ expect(screen.getByText("test.txt")).toBeInTheDocument();
98
+ expect(screen.getByText("12 B")).toBeInTheDocument();
99
+ });
100
+ expect(modalUploadButton).toBeEnabled();
101
+ });
102
+ it("displays correct bucket and prefix information", ()=>{
103
+ const customBucket = "custom-bucket";
104
+ const customPrefix = "custom/prefix";
105
+ renderUploadButton({
106
+ bucket: customBucket,
107
+ prefix: customPrefix
108
+ });
109
+ expect(screen.getByRole("button", {
110
+ name: /upload/i
111
+ })).toBeInTheDocument();
112
+ });
113
+ it("handles different button variants", ()=>{
114
+ renderUploadButton({
115
+ variant: "primary"
116
+ });
117
+ const button = screen.getByRole("button", {
118
+ name: /upload/i
119
+ });
120
+ expect(button).toBeInTheDocument();
121
+ });
122
+ it("resets state when modal is closed", async ()=>{
123
+ renderUploadButton();
124
+ const uploadButton = screen.getByRole("button", {
125
+ name: /upload/i
126
+ });
127
+ fireEvent.click(uploadButton);
128
+ await waitFor(()=>{
129
+ expect(screen.getByText("Upload Files")).toBeInTheDocument();
130
+ });
131
+ const cancelButton = screen.getByRole("button", {
132
+ name: /cancel/i
133
+ });
134
+ fireEvent.click(cancelButton);
135
+ await waitFor(()=>{
136
+ expect(screen.queryByText("Upload Files")).not.toBeInTheDocument();
137
+ });
138
+ fireEvent.click(uploadButton);
139
+ await waitFor(()=>{
140
+ expect(screen.getByText("Upload Files")).toBeInTheDocument();
141
+ expect(screen.getByText("Drag and drop files and folders here")).toBeInTheDocument();
142
+ });
143
+ });
144
+ });
@@ -0,0 +1,49 @@
1
+ import Joi from "joi";
2
+ import { ObjectLockRetentionMode } from "@aws-sdk/client-s3";
3
+ export declare const bucketErrorMessage = "Bucket names can include only lowercase letters, numbers, dots (.), and hyphens (-)";
4
+ export declare const bucketNameValidationSchema: Joi.StringSchema<string>;
5
+ export declare const baseBucketCreateSchema: Joi.ObjectSchema<any>;
6
+ export type BucketCreateFormData = {
7
+ name: string;
8
+ isVersioning: boolean;
9
+ isObjectLockEnabled: boolean;
10
+ isDefaultRetentionEnabled: boolean;
11
+ retentionMode: ObjectLockRetentionMode;
12
+ retentionPeriod: number;
13
+ retentionPeriodFrequencyChoice: string;
14
+ [key: string]: unknown;
15
+ };
16
+ type BucketCreateProps = {
17
+ subTitle?: string;
18
+ /**
19
+ * Custom validation schema - if not provided, uses baseBucketCreateSchema
20
+ *
21
+ * To enable uniqueness validation, provide context with existing bucket names:
22
+ * ```ts
23
+ * const schema = baseBucketCreateSchema.append({...});
24
+ * <BucketCreate
25
+ * validationSchema={schema}
26
+ * validationContext={{ existingBuckets: ['bucket1', 'bucket2'] }}
27
+ * />
28
+ * ```
29
+ */
30
+ validationSchema?: Joi.ObjectSchema;
31
+ /**
32
+ * Validation context passed to Joi schema
33
+ * Use this to provide existing bucket names for uniqueness validation
34
+ */
35
+ validationContext?: {
36
+ existingBuckets?: string[];
37
+ [key: string]: unknown;
38
+ };
39
+ /** Default form values - merged with base defaults */
40
+ defaultValues?: Partial<BucketCreateFormData>;
41
+ /** Children rendered between bucket name and versioning sections */
42
+ children?: React.ReactNode;
43
+ /** Callback when form is submitted with valid data */
44
+ onSubmit?: (data: BucketCreateFormData) => void;
45
+ /** Callback when cancel is clicked */
46
+ onCancel?: () => void;
47
+ };
48
+ export declare const BucketCreate: ({ subTitle, validationSchema, validationContext, defaultValues: customDefaultValues, children, onSubmit: onSubmitProp, onCancel: onCancelProp, }: BucketCreateProps) => import("react/jsx-runtime").JSX.Element;
49
+ export default BucketCreate;