@scality/data-browser-library 1.0.0-preview.8 → 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 (303) 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.d.ts +1 -0
  9. package/dist/components/__tests__/BucketCreate.test.js +574 -0
  10. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  11. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +14 -0
  13. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  14. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  15. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  16. package/dist/components/__tests__/BucketList.test.js +495 -81
  17. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  19. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  20. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  21. package/dist/components/__tests__/BucketOverview.test.js +484 -179
  22. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  23. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +16 -0
  24. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  25. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  26. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  27. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  28. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  29. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  30. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  31. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  32. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  33. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  34. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  35. package/dist/components/__tests__/ObjectList.test.js +741 -240
  36. package/dist/components/__tests__/UploadButton.test.js +45 -45
  37. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  38. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  39. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  40. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  41. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  42. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  43. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  44. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  45. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  46. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  47. package/dist/components/breadcrumb/index.d.ts +8 -0
  48. package/dist/components/breadcrumb/index.js +4 -0
  49. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  50. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  51. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  52. package/dist/components/buckets/BucketAccessor.js +125 -0
  53. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  54. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  55. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  56. package/dist/components/buckets/BucketCorsPage.js +234 -0
  57. package/dist/components/buckets/BucketCreate.d.ts +50 -0
  58. package/dist/components/buckets/BucketCreate.js +279 -0
  59. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  60. package/dist/components/buckets/BucketDetails.js +256 -40
  61. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  62. package/dist/components/buckets/BucketLifecycleFormPage.js +1086 -0
  63. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  64. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  65. package/dist/components/buckets/BucketList.d.ts +6 -4
  66. package/dist/components/buckets/BucketList.js +161 -94
  67. package/dist/components/buckets/BucketLocation.js +4 -4
  68. package/dist/components/buckets/BucketOverview.d.ts +86 -5
  69. package/dist/components/buckets/BucketOverview.js +481 -192
  70. package/dist/components/buckets/BucketPage.js +44 -22
  71. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  72. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  73. package/dist/components/buckets/BucketReplicationFormPage.js +835 -0
  74. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  75. package/dist/components/buckets/BucketReplicationList.js +189 -0
  76. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  77. package/dist/components/buckets/BucketVersioning.js +76 -0
  78. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  79. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  80. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  81. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  82. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  83. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  84. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  85. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  86. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  87. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  88. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  89. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  90. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  91. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  92. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  93. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  94. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  95. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  96. package/dist/components/buckets/notifications/events.d.ts +71 -7
  97. package/dist/components/buckets/notifications/events.js +98 -16
  98. package/dist/components/index.d.ts +27 -13
  99. package/dist/components/index.js +20 -6
  100. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  101. package/dist/components/layouts/ArrowNavigation.js +28 -0
  102. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  103. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  104. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  105. package/dist/components/objects/CreateFolderButton.js +12 -12
  106. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  107. package/dist/components/objects/DeleteObjectButton.js +19 -21
  108. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  109. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  110. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  111. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  112. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  113. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  114. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  115. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  116. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  117. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  118. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  119. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  120. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  121. package/dist/components/objects/ObjectDetails/index.js +152 -40
  122. package/dist/components/objects/ObjectList.d.ts +12 -10
  123. package/dist/components/objects/ObjectList.js +590 -263
  124. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  125. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  126. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  127. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  128. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  129. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +159 -0
  130. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  131. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  132. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  133. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  134. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  135. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  136. package/dist/components/objects/ObjectPage.js +12 -8
  137. package/dist/components/objects/UploadButton.d.ts +3 -3
  138. package/dist/components/objects/UploadButton.js +10 -10
  139. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  140. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  141. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  142. package/dist/components/providers/DataBrowserProvider.js +60 -38
  143. package/dist/components/providers/QueryProvider.d.ts +9 -0
  144. package/dist/components/providers/QueryProvider.js +21 -0
  145. package/dist/components/search/MetadataSearch.js +29 -28
  146. package/dist/components/search/SearchHints.js +1 -1
  147. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  148. package/dist/components/ui/ArrayFieldActions.js +43 -0
  149. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  150. package/dist/components/ui/ConfirmDeleteRuleModal.js +48 -0
  151. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  152. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  153. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  154. package/dist/components/ui/FilterFormSection.js +159 -0
  155. package/dist/components/ui/Search.elements.d.ts +2 -2
  156. package/dist/components/ui/Search.elements.js +7 -7
  157. package/dist/components/ui/Table.elements.d.ts +2 -1
  158. package/dist/components/ui/Table.elements.js +18 -12
  159. package/dist/config/__tests__/factory.test.d.ts +1 -0
  160. package/dist/config/__tests__/factory.test.js +311 -0
  161. package/dist/config/factory.d.ts +14 -49
  162. package/dist/config/factory.js +23 -68
  163. package/dist/config/types.d.ts +212 -34
  164. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  165. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  166. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  167. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  168. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  169. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  170. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  171. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  172. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  173. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  174. package/dist/hooks/bucketConfiguration.js +52 -51
  175. package/dist/hooks/bucketOperations.d.ts +10 -1
  176. package/dist/hooks/bucketOperations.js +10 -9
  177. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  178. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  179. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  180. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  181. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +95 -52
  182. package/dist/hooks/factories/index.d.ts +4 -4
  183. package/dist/hooks/factories/index.js +2 -2
  184. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  185. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  186. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  187. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  188. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  189. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  190. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  191. package/dist/hooks/factories/useCreateS3QueryHook.js +29 -3
  192. package/dist/hooks/index.d.ts +19 -8
  193. package/dist/hooks/index.js +16 -5
  194. package/dist/hooks/loginOperations.d.ts +1 -1
  195. package/dist/hooks/loginOperations.js +1 -1
  196. package/dist/hooks/objectOperations.d.ts +2 -2
  197. package/dist/hooks/objectOperations.js +50 -49
  198. package/dist/hooks/presignedOperations.d.ts +4 -4
  199. package/dist/hooks/presignedOperations.js +5 -5
  200. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  201. package/dist/hooks/useAccessibleBuckets.js +115 -0
  202. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  203. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  204. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  205. package/dist/hooks/useBucketConfigEditor.js +82 -0
  206. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  207. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  208. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  209. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  210. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  211. package/dist/hooks/useEmptyBucket.js +116 -0
  212. package/dist/hooks/useFeatures.d.ts +7 -0
  213. package/dist/hooks/useFeatures.js +8 -0
  214. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  215. package/dist/hooks/useISVBucketDetection.js +27 -0
  216. package/dist/hooks/useIsBucketEmpty.js +4 -4
  217. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  218. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  219. package/dist/hooks/useS3Client.d.ts +6 -0
  220. package/dist/hooks/useS3Client.js +3 -2
  221. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  222. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  223. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  224. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  225. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  226. package/dist/hooks/useTableRowSelection.js +45 -0
  227. package/dist/index.d.ts +6 -6
  228. package/dist/index.js +2 -2
  229. package/dist/schemas/bucketPolicySchema.json +3 -13
  230. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  231. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  232. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  234. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  235. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  236. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  237. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  238. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  239. package/dist/test/msw/handlers/headObject.js +31 -13
  240. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  241. package/dist/test/msw/handlers/listBuckets.js +5 -3
  242. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  243. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  244. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  245. package/dist/test/msw/handlers/listObjects.js +35 -23
  246. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  247. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  248. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  249. package/dist/test/msw/handlers/objectRetention.js +31 -17
  250. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  251. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  252. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  253. package/dist/test/msw/handlers/putObject.js +27 -12
  254. package/dist/test/msw/handlers.d.ts +3 -3
  255. package/dist/test/msw/handlers.js +77 -54
  256. package/dist/test/msw/index.d.ts +2 -2
  257. package/dist/test/msw/index.js +1 -1
  258. package/dist/test/msw/server.d.ts +1 -1
  259. package/dist/test/msw/server.js +1 -1
  260. package/dist/test/msw/utils.js +2 -2
  261. package/dist/test/setup.d.ts +1 -1
  262. package/dist/test/setup.js +13 -30
  263. package/dist/test/testUtils.d.ts +170 -36
  264. package/dist/test/testUtils.js +229 -116
  265. package/dist/test/utils/errorHandling.test.js +146 -108
  266. package/dist/types/index.d.ts +49 -36
  267. package/dist/types/monaco.d.ts +13 -0
  268. package/dist/types/monaco.js +0 -0
  269. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  270. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  271. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  272. package/dist/utils/__tests__/s3Client.test.js +340 -0
  273. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  274. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  275. package/dist/utils/constants.d.ts +22 -0
  276. package/dist/utils/constants.js +19 -0
  277. package/dist/utils/deletion/index.d.ts +2 -2
  278. package/dist/utils/deletion/index.js +1 -1
  279. package/dist/utils/deletion/messages.d.ts +1 -1
  280. package/dist/utils/deletion/messages.js +4 -4
  281. package/dist/utils/errorHandling.d.ts +12 -3
  282. package/dist/utils/errorHandling.js +12 -7
  283. package/dist/utils/hooks.js +8 -8
  284. package/dist/utils/index.d.ts +5 -2
  285. package/dist/utils/index.js +5 -1
  286. package/dist/utils/proxyMiddleware.d.ts +32 -13
  287. package/dist/utils/proxyMiddleware.js +90 -36
  288. package/dist/utils/s3Client.d.ts +14 -4
  289. package/dist/utils/s3Client.js +5 -26
  290. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  291. package/dist/utils/s3ConfigIdentifier.js +57 -0
  292. package/dist/utils/s3RuleUtils.d.ts +53 -0
  293. package/dist/utils/s3RuleUtils.js +101 -0
  294. package/package.json +10 -8
  295. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  296. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  297. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  298. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  299. package/dist/hooks/useLoginMutation.d.ts +0 -21
  300. package/dist/hooks/useLoginMutation.js +0 -9
  301. package/dist/utils/useFeatures.d.ts +0 -1
  302. package/dist/utils/useFeatures.js +0 -7
  303. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,47 +1,64 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useState } from "react";
3
- import { Icon, Loader, Text, spacing } from "@scality/core-ui";
2
+ import { Icon, Loader, Text, spacing, useToast } from "@scality/core-ui";
3
+ import { convertSizeToRem } from "@scality/core-ui/dist/components/inputv2/inputv2";
4
4
  import { Box, Button, Input, Select } from "@scality/core-ui/dist/next";
5
+ import { useEffect, useState } from "react";
6
+ import { Controller, useFieldArray, useForm } from "react-hook-form";
5
7
  import { useCopyObject, useObjectMetadata } from "../../../hooks/index.js";
8
+ import { useInvalidateQueries } from "../../providers/DataBrowserProvider.js";
9
+ import { ArrayFieldActions } from "../../ui/ArrayFieldActions.js";
6
10
  import { TableContainer } from "../../ui/Table.elements.js";
7
11
  const METADATA_KEYS = [
8
12
  {
9
- key: "CacheControl",
10
- label: "cache-control"
13
+ key: 'CacheControl',
14
+ label: 'cache-control'
11
15
  },
12
16
  {
13
- key: "ContentDisposition",
14
- label: "content-disposition"
17
+ key: 'ContentDisposition',
18
+ label: 'content-disposition'
15
19
  },
16
20
  {
17
- key: "ContentEncoding",
18
- label: "content-encoding"
21
+ key: 'ContentEncoding',
22
+ label: 'content-encoding'
19
23
  },
20
24
  {
21
- key: "ContentType",
22
- label: "content-type"
25
+ key: 'ContentType',
26
+ label: 'content-type'
23
27
  },
24
28
  {
25
- key: "WebsiteRedirectLocation",
26
- label: "website-redirect-location"
29
+ key: 'WebsiteRedirectLocation',
30
+ label: 'website-redirect-location'
27
31
  },
28
32
  {
29
- key: "x-amz-meta",
30
- label: "x-amz-meta"
33
+ key: 'x-amz-meta',
34
+ label: 'x-amz-meta'
31
35
  }
32
36
  ];
33
37
  const ObjectMetadata = ({ bucketName, objectKey, versionId })=>{
38
+ const getVersionParams = ()=>versionId ? {
39
+ VersionId: versionId
40
+ } : {};
34
41
  const { data: metadata, status: metadataStatus } = useObjectMetadata({
35
42
  Bucket: bucketName,
36
43
  Key: objectKey,
37
- ...versionId && {
38
- VersionId: versionId
39
- }
44
+ ...getVersionParams()
40
45
  });
41
46
  const copyObjectMutation = useCopyObject();
42
- const [metadataRows, setMetadataRows] = useState([]);
47
+ const { showToast } = useToast();
48
+ const invalidateQueries = useInvalidateQueries();
49
+ const [isInitialized, setIsInitialized] = useState(false);
50
+ const { control, handleSubmit, setValue, watch, formState: { errors, isValid, isSubmitting } } = useForm({
51
+ mode: 'onChange',
52
+ defaultValues: {
53
+ metadata: []
54
+ }
55
+ });
56
+ const { fields, append, remove } = useFieldArray({
57
+ control,
58
+ name: 'metadata'
59
+ });
43
60
  useEffect(()=>{
44
- setMetadataRows([]);
61
+ setIsInitialized(false);
45
62
  copyObjectMutation.reset();
46
63
  }, [
47
64
  bucketName,
@@ -49,114 +66,94 @@ const ObjectMetadata = ({ bucketName, objectKey, versionId })=>{
49
66
  versionId
50
67
  ]);
51
68
  useEffect(()=>{
52
- if (metadata && "success" === metadataStatus) {
69
+ if (metadata && 'success' === metadataStatus && !isInitialized) {
53
70
  const rows = [];
54
71
  const standardKeys = [
55
- "CacheControl",
56
- "ContentDisposition",
57
- "ContentEncoding",
58
- "ContentType",
59
- "WebsiteRedirectLocation"
72
+ 'CacheControl',
73
+ 'ContentDisposition',
74
+ 'ContentEncoding',
75
+ 'ContentType',
76
+ 'WebsiteRedirectLocation'
60
77
  ];
61
78
  standardKeys.forEach((keyType)=>{
62
79
  const value = metadata[keyType];
63
80
  if (value) rows.push({
64
- id: `init-${rows.length}`,
65
81
  keyType,
66
- customKey: "",
82
+ customKey: '',
67
83
  value
68
84
  });
69
85
  });
70
86
  const userMetadata = metadata.Metadata || {};
71
87
  Object.entries(userMetadata).forEach(([key, value])=>{
72
88
  rows.push({
73
- id: `init-${rows.length}`,
74
- keyType: "x-amz-meta",
89
+ keyType: 'x-amz-meta',
75
90
  customKey: key,
76
91
  value: value
77
92
  });
78
93
  });
79
- setMetadataRows(rows);
94
+ if (0 === rows.length) rows.push({
95
+ keyType: '',
96
+ customKey: '',
97
+ value: ''
98
+ });
99
+ setValue('metadata', rows);
100
+ setIsInitialized(true);
80
101
  }
81
102
  }, [
82
103
  metadata,
83
- metadataStatus
84
- ]);
85
- const handleAddRow = useCallback(()=>{
86
- setMetadataRows((prev)=>[
87
- ...prev,
88
- {
89
- id: `new-${Date.now()}`,
90
- keyType: "",
91
- customKey: "",
92
- value: ""
93
- }
94
- ]);
95
- }, []);
96
- const handleDeleteRow = useCallback((id)=>{
97
- setMetadataRows((prev)=>prev.filter((row)=>row.id !== id));
98
- }, []);
99
- const handleRowChange = useCallback((id, field, value)=>{
100
- setMetadataRows((prev)=>prev.map((row)=>row.id === id ? {
101
- ...row,
102
- [field]: value,
103
- ..."keyType" === field && "x-amz-meta" !== value && {
104
- customKey: ""
105
- }
106
- } : row));
107
- }, []);
108
- const validationErrors = useMemo(()=>{
109
- const errors = [];
110
- const seenKeys = new Set();
111
- metadataRows.forEach((row, index)=>{
112
- if (!row.keyType) return void errors.push(`Row ${index + 1}: Please select a metadata key`);
113
- if ("x-amz-meta" === row.keyType && !row.customKey.trim()) return void errors.push(`Row ${index + 1}: Please provide a custom key name`);
114
- if (!row.value.trim()) return void errors.push(`Row ${index + 1}: Please provide a value`);
115
- const fullKey = "x-amz-meta" === row.keyType ? `x-amz-meta-${row.customKey}` : row.keyType;
116
- if (seenKeys.has(fullKey)) errors.push(`Row ${index + 1}: Duplicate key "${"x-amz-meta" === row.keyType ? `x-amz-meta-${row.customKey}` : row.keyType}"`);
117
- else seenKeys.add(fullKey);
118
- });
119
- return errors;
120
- }, [
121
- metadataRows
122
- ]);
123
- const canSave = metadataRows.length > 0 && 0 === validationErrors.length;
124
- const getAvailableOptions = useCallback((currentRowId)=>{
125
- const usedKeys = new Set(metadataRows.filter((row)=>row.id !== currentRowId && "x-amz-meta" !== row.keyType).map((row)=>row.keyType));
126
- return METADATA_KEYS.filter((key)=>"x-amz-meta" === key.key || !usedKeys.has(key.key));
127
- }, [
128
- metadataRows
104
+ metadataStatus,
105
+ setValue,
106
+ isInitialized
129
107
  ]);
130
- const handleSave = useCallback(async ()=>{
131
- if (!canSave || !metadata) return;
108
+ const getAvailableOptions = (currentIndex)=>{
109
+ const allMetadata = watch('metadata') || [];
110
+ const usedKeys = new Set(allMetadata.filter((row, idx)=>idx !== currentIndex && 'x-amz-meta' !== row.keyType).map((row)=>row.keyType));
111
+ return METADATA_KEYS.filter((key)=>'x-amz-meta' === key.key || !usedKeys.has(key.key));
112
+ };
113
+ const onSubmit = async (data)=>{
114
+ if (!metadata) return;
132
115
  try {
116
+ const validMetadata = data.metadata.filter((row)=>row.keyType && row.value.trim());
133
117
  const encodedKey = encodeURIComponent(objectKey);
134
118
  const copySource = versionId ? `${bucketName}/${encodedKey}?versionId=${versionId}` : `${bucketName}/${encodedKey}`;
135
119
  const copyParams = {
136
120
  Bucket: bucketName,
137
121
  Key: objectKey,
138
122
  CopySource: copySource,
139
- MetadataDirective: "REPLACE",
123
+ MetadataDirective: 'REPLACE',
140
124
  Metadata: {}
141
125
  };
142
- metadataRows.forEach((row)=>{
143
- if ("x-amz-meta" === row.keyType) copyParams.Metadata[row.customKey] = row.value;
144
- else if (row.keyType) copyParams[row.keyType] = row.value;
126
+ validMetadata.forEach((row)=>{
127
+ if ('x-amz-meta' === row.keyType) copyParams.Metadata[row.customKey.trim()] = row.value.trim();
128
+ else if (row.keyType) copyParams[row.keyType] = row.value.trim();
145
129
  });
146
130
  if (!copyParams.ContentType && metadata.ContentType) copyParams.ContentType = metadata.ContentType;
147
131
  await copyObjectMutation.mutateAsync(copyParams);
132
+ await invalidateQueries({
133
+ queryKey: [
134
+ 'HeadObject',
135
+ {
136
+ Bucket: bucketName,
137
+ Key: objectKey,
138
+ ...getVersionParams()
139
+ }
140
+ ]
141
+ });
142
+ showToast({
143
+ open: true,
144
+ message: 'Metadata saved successfully',
145
+ status: 'success'
146
+ });
148
147
  } catch (error) {
149
- console.error("Failed to save metadata:", error);
148
+ const errorMessage = error instanceof Error ? error.message : 'Failed to save metadata';
149
+ showToast({
150
+ open: true,
151
+ message: errorMessage,
152
+ status: 'error'
153
+ });
150
154
  }
151
- }, [
152
- canSave,
153
- metadata,
154
- bucketName,
155
- objectKey,
156
- metadataRows,
157
- copyObjectMutation
158
- ]);
159
- if ("pending" === metadataStatus) return /*#__PURE__*/ jsx(TableContainer, {
155
+ };
156
+ if ('pending' === metadataStatus) return /*#__PURE__*/ jsx(TableContainer, {
160
157
  children: /*#__PURE__*/ jsx(Box, {
161
158
  display: "flex",
162
159
  justifyContent: "center",
@@ -164,7 +161,7 @@ const ObjectMetadata = ({ bucketName, objectKey, versionId })=>{
164
161
  children: /*#__PURE__*/ jsx(Loader, {})
165
162
  })
166
163
  });
167
- if ("error" === metadataStatus) return /*#__PURE__*/ jsx(TableContainer, {
164
+ if ('error' === metadataStatus) return /*#__PURE__*/ jsx(TableContainer, {
168
165
  children: /*#__PURE__*/ jsx(Box, {
169
166
  padding: spacing.r16,
170
167
  children: /*#__PURE__*/ jsx(Text, {
@@ -173,151 +170,187 @@ const ObjectMetadata = ({ bucketName, objectKey, versionId })=>{
173
170
  })
174
171
  })
175
172
  });
176
- return /*#__PURE__*/ jsxs(TableContainer, {
177
- children: [
178
- /*#__PURE__*/ jsxs(Box, {
179
- display: "flex",
180
- justifyContent: "space-between",
181
- alignItems: "center",
182
- padding: spacing.r16,
183
- borderBottom: "1px solid",
184
- borderColor: "backgroundLevel3",
185
- children: [
186
- /*#__PURE__*/ jsx(Text, {
187
- isEmphazed: true,
188
- children: "Edit Metadata"
189
- }),
190
- /*#__PURE__*/ jsxs(Box, {
191
- display: "flex",
192
- alignItems: "center",
193
- gap: spacing.r8,
194
- children: [
195
- copyObjectMutation.isSuccess && /*#__PURE__*/ jsx(Text, {
196
- color: "statusHealthy",
197
- children: "Saved successfully"
198
- }),
199
- copyObjectMutation.isError && /*#__PURE__*/ jsx(Text, {
200
- color: "statusCritical",
201
- children: "Failed to save"
202
- }),
203
- /*#__PURE__*/ jsx(Button, {
204
- variant: "primary",
205
- label: "Save",
206
- disabled: !canSave || copyObjectMutation.isPending,
207
- onClick: handleSave,
208
- icon: /*#__PURE__*/ jsx(Icon, {
209
- name: "Save"
210
- })
211
- })
212
- ]
213
- })
214
- ]
215
- }),
216
- validationErrors.length > 0 && /*#__PURE__*/ jsxs(Box, {
217
- padding: spacing.r16,
218
- backgroundColor: "backgroundLevel2",
219
- borderLeft: "3px solid",
220
- borderColor: "statusCritical",
221
- children: [
222
- /*#__PURE__*/ jsx(Text, {
223
- color: "statusCritical",
224
- isEmphazed: true,
225
- children: "Validation Errors:"
226
- }),
227
- validationErrors.map((error, index)=>/*#__PURE__*/ jsx(Box, {
228
- paddingLeft: spacing.r8,
229
- children: /*#__PURE__*/ jsxs(Text, {
230
- color: "statusCritical",
231
- children: [
232
- "• ",
233
- error
234
- ]
235
- })
236
- }, index))
237
- ]
238
- }),
239
- /*#__PURE__*/ jsxs(Box, {
240
- padding: spacing.r16,
241
- display: "flex",
242
- flexDirection: "column",
243
- gap: spacing.r12,
244
- flex: "1",
245
- children: [
246
- metadataRows.length > 0 && /*#__PURE__*/ jsxs(Box, {
247
- display: "flex",
248
- children: [
249
- /*#__PURE__*/ jsx(Box, {
250
- flex: "1",
251
- children: /*#__PURE__*/ jsx(Text, {
252
- color: "textSecondary",
253
- isEmphazed: true,
254
- children: "Key"
255
- })
256
- }),
257
- /*#__PURE__*/ jsx(Box, {
258
- flex: "1",
259
- children: /*#__PURE__*/ jsx(Text, {
260
- color: "textSecondary",
261
- isEmphazed: true,
262
- children: "Value"
263
- })
173
+ return /*#__PURE__*/ jsx(TableContainer, {
174
+ children: /*#__PURE__*/ jsxs("form", {
175
+ onSubmit: handleSubmit(onSubmit),
176
+ children: [
177
+ /*#__PURE__*/ jsxs(Box, {
178
+ display: "flex",
179
+ justifyContent: "space-between",
180
+ alignItems: "center",
181
+ padding: spacing.r16,
182
+ borderBottom: "1px solid",
183
+ borderColor: "backgroundLevel3",
184
+ children: [
185
+ /*#__PURE__*/ jsx(Text, {
186
+ isEmphazed: true,
187
+ children: "Edit Metadata"
188
+ }),
189
+ /*#__PURE__*/ jsx(Button, {
190
+ variant: "primary",
191
+ label: "Save",
192
+ disabled: !isValid || isSubmitting,
193
+ type: "submit",
194
+ icon: /*#__PURE__*/ jsx(Icon, {
195
+ name: "Save"
264
196
  })
265
- ]
266
- }),
267
- metadataRows.map((row)=>/*#__PURE__*/ jsxs(Box, {
197
+ })
198
+ ]
199
+ }),
200
+ /*#__PURE__*/ jsxs(Box, {
201
+ padding: spacing.r16,
202
+ display: "flex",
203
+ flexDirection: "column",
204
+ gap: spacing.r12,
205
+ children: [
206
+ /*#__PURE__*/ jsxs(Box, {
268
207
  display: "flex",
269
208
  gap: spacing.r8,
270
- alignItems: "center",
271
209
  children: [
272
- /*#__PURE__*/ jsx(Select, {
273
- id: `key-${row.id}`,
274
- value: row.keyType,
275
- onChange: (value)=>handleRowChange(row.id, "keyType", value),
276
- placeholder: "Select key",
277
- children: getAvailableOptions(row.id).map((key)=>/*#__PURE__*/ jsx(Select.Option, {
278
- value: key.key,
279
- children: key.label
280
- }, key.key))
210
+ /*#__PURE__*/ jsx(Box, {
211
+ flex: "1",
212
+ children: /*#__PURE__*/ jsx(Text, {
213
+ color: "textSecondary",
214
+ isEmphazed: true,
215
+ children: "Key"
216
+ })
281
217
  }),
282
- "x-amz-meta" === row.keyType && /*#__PURE__*/ jsx(Input, {
283
- id: `customKey-${row.id}`,
284
- value: row.customKey,
285
- onChange: (e)=>handleRowChange(row.id, "customKey", e.target.value),
286
- placeholder: "custom-key"
218
+ /*#__PURE__*/ jsx(Box, {
219
+ flex: "1",
220
+ children: /*#__PURE__*/ jsx(Text, {
221
+ color: "textSecondary",
222
+ isEmphazed: true,
223
+ children: "Value"
224
+ })
287
225
  }),
288
- /*#__PURE__*/ jsx(Text, {
289
- color: "textSecondary",
290
- children: ":"
291
- }),
292
- /*#__PURE__*/ jsx(Input, {
293
- id: `value-${row.id}`,
294
- value: row.value,
295
- onChange: (e)=>handleRowChange(row.id, "value", e.target.value),
296
- placeholder: "Value"
297
- }),
298
- /*#__PURE__*/ jsx(Button, {
299
- variant: "secondary",
300
- icon: /*#__PURE__*/ jsx(Icon, {
301
- name: "Delete"
302
- }),
303
- onClick: ()=>handleDeleteRow(row.id),
304
- "aria-label": "Delete row"
226
+ /*#__PURE__*/ jsx(Box, {
227
+ width: convertSizeToRem('1/3')
305
228
  })
306
229
  ]
307
- }, row.id)),
308
- /*#__PURE__*/ jsx(Box, {
309
- children: /*#__PURE__*/ jsx(Button, {
310
- variant: "secondary",
311
- icon: /*#__PURE__*/ jsx(Icon, {
312
- name: "Create-add"
313
- }),
314
- label: "Add Metadata",
315
- onClick: handleAddRow
316
- })
317
- })
318
- ]
319
- })
320
- ]
230
+ }),
231
+ fields.map((field, index)=>/*#__PURE__*/ jsxs(Box, {
232
+ children: [
233
+ /*#__PURE__*/ jsxs(Box, {
234
+ display: "flex",
235
+ gap: spacing.r8,
236
+ alignItems: "center",
237
+ children: [
238
+ /*#__PURE__*/ jsx(Controller, {
239
+ control: control,
240
+ name: `metadata.${index}.keyType`,
241
+ rules: {
242
+ validate: (value, formValues)=>{
243
+ if (1 === formValues.metadata.length && !value && !formValues.metadata[0].value.trim()) return true;
244
+ if (!value) return 'Please select a metadata key';
245
+ const allMetadata = formValues.metadata;
246
+ const usedKeys = allMetadata.map((row, idx)=>{
247
+ if (idx === index) return null;
248
+ if ('x-amz-meta' === row.keyType) return row.customKey ? `x-amz-meta-${row.customKey.trim()}` : null;
249
+ return row.keyType;
250
+ }).filter(Boolean);
251
+ const currentKey = 'x-amz-meta' === value ? formValues.metadata[index].customKey ? `x-amz-meta-${formValues.metadata[index].customKey.trim()}` : null : value;
252
+ if (currentKey && usedKeys.includes(currentKey)) return `Duplicate key "${currentKey}"`;
253
+ return true;
254
+ }
255
+ },
256
+ render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Select, {
257
+ id: `key-${field.id}`,
258
+ value: value,
259
+ onChange: (newValue)=>{
260
+ onChange(newValue);
261
+ if ('x-amz-meta' !== newValue) setValue(`metadata.${index}.customKey`, '');
262
+ },
263
+ placeholder: "Select key",
264
+ children: getAvailableOptions(index).map((key)=>/*#__PURE__*/ jsx(Select.Option, {
265
+ value: key.key,
266
+ children: key.label
267
+ }, key.key))
268
+ })
269
+ }),
270
+ 'x-amz-meta' === watch(`metadata.${index}.keyType`) && /*#__PURE__*/ jsx(Controller, {
271
+ control: control,
272
+ name: `metadata.${index}.customKey`,
273
+ rules: {
274
+ validate: (value, formValues)=>{
275
+ if ('x-amz-meta' === formValues.metadata[index].keyType) {
276
+ if (!value.trim()) return 'Custom key required';
277
+ }
278
+ return true;
279
+ }
280
+ },
281
+ render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Input, {
282
+ id: `customKey-${field.id}`,
283
+ value: value,
284
+ onChange: onChange,
285
+ size: "1/3"
286
+ })
287
+ }),
288
+ /*#__PURE__*/ jsx(Text, {
289
+ color: "textSecondary",
290
+ children: ":"
291
+ }),
292
+ /*#__PURE__*/ jsx(Controller, {
293
+ control: control,
294
+ name: `metadata.${index}.value`,
295
+ rules: {
296
+ validate: (value, formValues)=>{
297
+ if (1 === formValues.metadata.length && !value.trim() && !formValues.metadata[0].keyType) return true;
298
+ if (!value.trim()) return 'Value cannot be empty';
299
+ return true;
300
+ }
301
+ },
302
+ render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Input, {
303
+ id: `value-${field.id}`,
304
+ value: value,
305
+ onChange: onChange,
306
+ placeholder: "Value"
307
+ })
308
+ }),
309
+ /*#__PURE__*/ jsx(ArrayFieldActions, {
310
+ showAdd: index === fields.length - 1,
311
+ onRemove: ()=>{
312
+ remove(index);
313
+ if (1 === fields.length) append({
314
+ keyType: '',
315
+ customKey: '',
316
+ value: ''
317
+ });
318
+ },
319
+ onAdd: ()=>append({
320
+ keyType: '',
321
+ customKey: '',
322
+ value: ''
323
+ }),
324
+ canRemove: true,
325
+ canAdd: !!watch(`metadata.${index}.keyType`) && !!watch(`metadata.${index}.value`),
326
+ removeLabel: "Remove metadata",
327
+ addLabel: "Add metadata"
328
+ })
329
+ ]
330
+ }),
331
+ (errors.metadata?.[index]?.keyType || errors.metadata?.[index]?.customKey || errors.metadata?.[index]?.value) && /*#__PURE__*/ jsxs(Box, {
332
+ paddingTop: spacing.r4,
333
+ children: [
334
+ errors.metadata?.[index]?.keyType && /*#__PURE__*/ jsx(Text, {
335
+ color: "statusCritical",
336
+ children: errors.metadata[index]?.keyType?.message
337
+ }),
338
+ errors.metadata?.[index]?.customKey && /*#__PURE__*/ jsx(Text, {
339
+ color: "statusCritical",
340
+ children: errors.metadata[index]?.customKey?.message
341
+ }),
342
+ errors.metadata?.[index]?.value && /*#__PURE__*/ jsx(Text, {
343
+ color: "statusCritical",
344
+ children: errors.metadata[index]?.value?.message
345
+ })
346
+ ]
347
+ })
348
+ ]
349
+ }, field.id))
350
+ ]
351
+ })
352
+ ]
353
+ })
321
354
  });
322
355
  };
323
356
  export { ObjectMetadata };
@@ -1,3 +1,3 @@
1
- import { ObjectCommonProps } from ".";
2
- declare const ObjectSummary: ({ bucketName, objectKey, versionId, }: ObjectCommonProps) => import("react/jsx-runtime").JSX.Element;
1
+ import type { ObjectCommonProps } from '.';
2
+ declare const ObjectSummary: ({ bucketName, objectKey, versionId }: ObjectCommonProps) => import("react/jsx-runtime").JSX.Element;
3
3
  export { ObjectSummary };