@strapi/upload 5.57.0 → 5.59.0

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 (253) hide show
  1. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +141 -0
  2. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
  3. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +139 -0
  4. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
  5. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +129 -0
  6. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
  7. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +127 -0
  8. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
  9. package/dist/admin/components/MediaLibraryInput/AssetRow.js +144 -0
  10. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
  11. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +142 -0
  12. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
  13. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +397 -0
  14. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  15. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +395 -0
  16. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  17. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +45 -0
  18. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +1 -0
  19. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +43 -0
  20. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +1 -0
  21. package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
  22. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
  23. package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
  24. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
  25. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
  26. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  27. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
  28. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  29. package/dist/admin/hooks/useMediaLibraryPermissions.js +4 -0
  30. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  31. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +4 -0
  32. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  33. package/dist/admin/hooks/useTracking.js +5 -1
  34. package/dist/admin/hooks/useTracking.js.map +1 -1
  35. package/dist/admin/hooks/useTracking.mjs +5 -1
  36. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  37. package/dist/admin/index.js +7 -2
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/admin/index.mjs +7 -2
  40. package/dist/admin/index.mjs.map +1 -1
  41. package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
  42. package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
  43. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js +9 -1
  44. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js.map +1 -1
  45. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs +9 -1
  46. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  47. package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
  48. package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
  49. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
  50. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
  51. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
  52. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
  53. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
  54. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
  55. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
  56. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  57. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
  58. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  59. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  60. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  61. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
  62. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
  63. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
  64. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
  65. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
  66. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  67. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
  68. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  69. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
  70. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  71. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
  72. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  73. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
  74. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  75. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
  76. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  77. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js +20 -6
  78. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  79. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +20 -6
  80. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  81. package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
  82. package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
  83. package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
  84. package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
  85. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
  86. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
  87. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
  88. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  89. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
  90. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  91. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
  92. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  93. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
  94. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  95. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
  96. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  97. package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
  98. package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
  99. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
  100. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
  101. package/dist/admin/legacy/components/TableList/TableList.js +3 -1
  102. package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
  103. package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
  104. package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
  105. package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
  106. package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
  107. package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
  108. package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
  109. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
  110. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  111. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
  112. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  113. package/dist/admin/legacy/hooks/useEditAsset.js +11 -6
  114. package/dist/admin/legacy/hooks/useEditAsset.js.map +1 -1
  115. package/dist/admin/legacy/hooks/useEditAsset.mjs +12 -7
  116. package/dist/admin/legacy/hooks/useEditAsset.mjs.map +1 -1
  117. package/dist/admin/legacy/hooks/useUpload.js +6 -4
  118. package/dist/admin/legacy/hooks/useUpload.js.map +1 -1
  119. package/dist/admin/legacy/hooks/useUpload.mjs +6 -4
  120. package/dist/admin/legacy/hooks/useUpload.mjs.map +1 -1
  121. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  122. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  123. package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
  124. package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
  125. package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
  126. package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
  127. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
  128. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
  129. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
  130. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
  131. package/dist/admin/pages/Assets/components/AssetsGrid.js +2 -1
  132. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  133. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +2 -1
  134. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  135. package/dist/admin/pages/Assets/components/AssetsTable.js +2 -1
  136. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  137. package/dist/admin/pages/Assets/components/AssetsTable.mjs +2 -1
  138. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  139. package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
  140. package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
  141. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +3 -1
  142. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  143. package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
  144. package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
  145. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
  146. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
  147. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
  148. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  149. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
  150. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  151. package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
  152. package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
  153. package/dist/admin/pages/Assets/components/FilterBadges.mjs +33 -4
  154. package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
  155. package/dist/admin/services/api.js +15 -5
  156. package/dist/admin/services/api.js.map +1 -1
  157. package/dist/admin/services/api.mjs +15 -5
  158. package/dist/admin/services/api.mjs.map +1 -1
  159. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
  160. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +13 -0
  161. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +15 -0
  162. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +26 -0
  163. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +10 -0
  164. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +1 -0
  165. package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
  166. package/dist/admin/src/legacy/hooks/useEditAsset.d.ts +13 -22
  167. package/dist/admin/src/legacy/hooks/useUpload.d.ts +1 -1
  168. package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
  169. package/dist/admin/src/services/api.d.ts +6 -0
  170. package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
  171. package/dist/admin/translations/ca.json.js +3 -3
  172. package/dist/admin/translations/ca.json.mjs +3 -3
  173. package/dist/admin/translations/da.json.js +1 -1
  174. package/dist/admin/translations/da.json.mjs +1 -1
  175. package/dist/admin/translations/de.json.js +1 -1
  176. package/dist/admin/translations/de.json.mjs +1 -1
  177. package/dist/admin/translations/en.json.js +9 -0
  178. package/dist/admin/translations/en.json.js.map +1 -1
  179. package/dist/admin/translations/en.json.mjs +9 -0
  180. package/dist/admin/translations/en.json.mjs.map +1 -1
  181. package/dist/admin/translations/es.json.js +1 -1
  182. package/dist/admin/translations/es.json.mjs +1 -1
  183. package/dist/admin/translations/sk.json.js +2 -2
  184. package/dist/admin/translations/sk.json.mjs +2 -2
  185. package/dist/admin/translations/tr.json.js +2 -2
  186. package/dist/admin/translations/tr.json.mjs +2 -2
  187. package/dist/admin/translations/zh-Hans.json.js +1 -1
  188. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  189. package/dist/admin/translations/zh.json.js +2 -2
  190. package/dist/admin/translations/zh.json.mjs +2 -2
  191. package/dist/admin/utils/allowedMediaTypes.js +42 -0
  192. package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
  193. package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
  194. package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
  195. package/dist/server/config.js +6 -0
  196. package/dist/server/config.js.map +1 -1
  197. package/dist/server/config.mjs +6 -0
  198. package/dist/server/config.mjs.map +1 -1
  199. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  200. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  201. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  202. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  203. package/dist/server/mcp/ambient-instance.js +7 -5
  204. package/dist/server/mcp/ambient-instance.js.map +1 -1
  205. package/dist/server/mcp/ambient-instance.mjs +7 -5
  206. package/dist/server/mcp/ambient-instance.mjs.map +1 -1
  207. package/dist/server/mcp/handlers/folder-handlers.js +4 -16
  208. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
  209. package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
  210. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
  211. package/dist/server/mcp/handlers/read-handlers.js +6 -14
  212. package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
  213. package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
  214. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
  215. package/dist/server/mcp/handlers/write-handlers.js +3 -13
  216. package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
  217. package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
  218. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
  219. package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
  220. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
  221. package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
  222. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
  223. package/dist/server/services/extensions/utils.js +1 -1
  224. package/dist/server/services/extensions/utils.js.map +1 -1
  225. package/dist/server/services/extensions/utils.mjs +1 -1
  226. package/dist/server/services/extensions/utils.mjs.map +1 -1
  227. package/dist/server/services/image-manipulation.js +33 -14
  228. package/dist/server/services/image-manipulation.js.map +1 -1
  229. package/dist/server/services/image-manipulation.mjs +33 -14
  230. package/dist/server/services/image-manipulation.mjs.map +1 -1
  231. package/dist/server/src/config.d.ts +3 -0
  232. package/dist/server/src/config.d.ts.map +1 -1
  233. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  234. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  235. package/dist/server/src/index.d.ts +3 -0
  236. package/dist/server/src/index.d.ts.map +1 -1
  237. package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
  238. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  239. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
  240. package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
  241. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
  242. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
  243. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
  244. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
  245. package/dist/server/src/services/extensions/utils.d.ts +1 -1
  246. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  247. package/dist/server/src/types.d.ts +1 -0
  248. package/dist/server/src/types.d.ts.map +1 -1
  249. package/dist/server/utils/mime-validation.js +1 -1
  250. package/dist/server/utils/mime-validation.js.map +1 -1
  251. package/dist/server/utils/mime-validation.mjs +1 -1
  252. package/dist/server/utils/mime-validation.mjs.map +1 -1
  253. package/package.json +7 -7
@@ -0,0 +1,397 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var designSystem = require('@strapi/design-system');
7
+ var reactIntl = require('react-intl');
8
+ var useAIMetadataEnabled = require('../../hooks/useAIMetadataEnabled.js');
9
+ var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
10
+ var useTracking = require('../../hooks/useTracking.js');
11
+ var AssetDialog = require('../../legacy/components/AssetDialog/AssetDialog.js');
12
+ var EditAssetContent = require('../../legacy/components/EditAssetDialog/EditAssetContent.js');
13
+ var EditFolderDialog = require('../../legacy/components/EditFolderDialog/EditFolderDialog.js');
14
+ var ImportFromUrlDialog = require('../../pages/Assets/components/ImportFromUrlDialog.js');
15
+ var api = require('../../services/api.js');
16
+ var settings = require('../../services/settings.js');
17
+ var allowedMediaTypes = require('../../utils/allowedMediaTypes.js');
18
+ var files = require('../../utils/files.js');
19
+ var translations = require('../../utils/translations.js');
20
+ var typeFromMime = require('../../utils/typeFromMime.js');
21
+ var AddAssetMenu = require('./AddAssetMenu.js');
22
+ var AssetDropZone = require('./AssetDropZone.js');
23
+ var AssetRow = require('./AssetRow.js');
24
+ var NoLibraryAccessDialog = require('./NoLibraryAccessDialog.js');
25
+
26
+ /**
27
+ * `location` for every event this field fires. The standalone Media Library
28
+ * tags its events `'upload'`; the picker inside an entry form has always been
29
+ * `'content-manager'`, and analytics still splits the two on that axis.
30
+ */ const CONTENT_MANAGER_LOCATION = 'content-manager';
31
+ /**
32
+ * Uploads from here land at the root of the Media Library. An entry form has no
33
+ * current folder to inherit, and the field offers no destination picker — same
34
+ * place the legacy upload wizard put them when none was chosen.
35
+ */ const UPLOAD_FOLDER_ID = null;
36
+ const EMPTY_ATTRIBUTE = {};
37
+ /**
38
+ * The Content Manager's `media` field, on the current Media Library stack.
39
+ *
40
+ * Files dropped here (or picked from the device) upload straight through
41
+ * `uploadFiles`, which is what drives the global upload progress dialog — so the
42
+ * entry form stays usable while they go, instead of being covered by the legacy
43
+ * wizard.
44
+ *
45
+ * The legacy input is still registered when `useLegacyMediaLibrary` is on, and
46
+ * is untouched by this.
47
+ */ const MediaLibraryInput = ({ name, label, labelAction, hint, required = false, disabled = false, attribute = EMPTY_ATTRIBUTE })=>{
48
+ const { allowedTypes = null, multiple = false } = attribute;
49
+ const { formatMessage } = reactIntl.useIntl();
50
+ const { onChange, value, error } = strapiAdmin.useField(name);
51
+ const { toggleNotification } = strapiAdmin.useNotification();
52
+ const { trackUsage } = useTracking.useTracking();
53
+ const { copy } = strapiAdmin.useClipboard();
54
+ const [step, setStep] = React.useState(undefined);
55
+ const [folderId, setFolderId] = React.useState(null);
56
+ const [editedAsset, setEditedAsset] = React.useState(null);
57
+ const [isUrlDialogOpen, setIsUrlDialogOpen] = React.useState(false);
58
+ const fileInputRef = React.useRef(null);
59
+ const [uploadFiles] = api.useUploadFilesMutation();
60
+ const [uploadFromUrls] = api.useUploadFromUrlsMutation();
61
+ // Echoes the app config; a missing payload (still loading) falls back to
62
+ // sequential rather than outpacing what the server asked for.
63
+ const { canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions.useMediaLibraryPermissions();
64
+ const { data: settings$1 } = settings.useGetUploadSettingsQuery(undefined, {
65
+ skip: !canRead
66
+ });
67
+ const concurrency = settings$1?.data?.concurrentUploadRequests ?? 1;
68
+ const isAiMetadataEnabled = useAIMetadataEnabled.useAIMetadataEnabled();
69
+ const assets = Array.isArray(value) ? value : value ? [
70
+ value
71
+ ] : [];
72
+ // An upload resumes long after the render that started it, and the dialog is
73
+ // non-blocking precisely so a second batch can be dropped meanwhile. Reading
74
+ // the closed-over `assets` on resume would then append to whatever the field
75
+ // held when that drop began, dropping every asset that landed since.
76
+ const assetsRef = React.useRef(assets);
77
+ assetsRef.current = assets;
78
+ const setAssets = (nextAssets)=>{
79
+ if (multiple) {
80
+ onChange(name, nextAssets.length > 0 ? nextAssets : null);
81
+ return;
82
+ }
83
+ onChange(name, nextAssets[0] ?? null);
84
+ };
85
+ const attachUploadedFile = (file)=>{
86
+ const nextAssets = multiple ? [
87
+ ...assetsRef.current,
88
+ file
89
+ ] : [
90
+ file
91
+ ];
92
+ // Parallel uploads can finish before the next render refreshes the ref.
93
+ assetsRef.current = nextAssets;
94
+ setAssets(nextAssets);
95
+ };
96
+ const handleRemove = (asset)=>{
97
+ setAssets(assets.filter((current)=>current.id !== asset.id));
98
+ };
99
+ const handleCopyLink = async (asset)=>{
100
+ const url = files.prefixFileUrlWithBackendUrl(asset.url);
101
+ if (!url) {
102
+ return;
103
+ }
104
+ const didCopy = await copy(url);
105
+ toggleNotification({
106
+ type: didCopy ? 'success' : 'danger',
107
+ message: formatMessage(didCopy ? {
108
+ id: translations.getTranslationKey('asset-details.copy-link.success'),
109
+ defaultMessage: 'Link copied.'
110
+ } : {
111
+ id: translations.getTranslationKey('asset-details.copy-link.error'),
112
+ defaultMessage: 'Failed to copy the link.'
113
+ })
114
+ });
115
+ };
116
+ const handleEditClose = (result)=>{
117
+ const asset = editedAsset;
118
+ setEditedAsset(null);
119
+ if (!asset) {
120
+ return;
121
+ }
122
+ // `null` means the asset was deleted from the library from inside the dialog.
123
+ if (result === null) {
124
+ setAssets(assetsRef.current.filter((current)=>current.id !== asset.id));
125
+ return;
126
+ }
127
+ if (result && typeof result !== 'boolean') {
128
+ setAssets(assetsRef.current.map((current)=>current.id === asset.id ? result : current));
129
+ }
130
+ };
131
+ const handleSelect = (selectedAssets)=>{
132
+ setAssets(selectedAssets);
133
+ setStep(undefined);
134
+ setFolderId(null);
135
+ };
136
+ const notifyUnsupported = ()=>{
137
+ toggleNotification({
138
+ type: 'danger',
139
+ timeout: 4000,
140
+ message: formatMessage({
141
+ // Legacy key: translated everywhere, and it names the accepted types,
142
+ // which the field already passes as `fileTypes`.
143
+ id: translations.getTranslationKey('input.notification.not-supported'),
144
+ defaultMessage: `You can't upload this type of file, only the following types are accepted – {fileTypes}`
145
+ }, {
146
+ fileTypes: (allowedTypes ?? []).join(',')
147
+ })
148
+ });
149
+ };
150
+ /**
151
+ * True when the batch is more than a single-value field can take. Counted on
152
+ * what was handed in rather than on what survives filtering: uploading one of
153
+ * several would leave the user guessing which one the field kept.
154
+ */ const rejectsBatch = (count)=>{
155
+ if (multiple || count <= 1) {
156
+ return false;
157
+ }
158
+ toggleNotification({
159
+ type: 'danger',
160
+ timeout: 4000,
161
+ message: formatMessage({
162
+ id: translations.getTranslationKey('content-manager.input.notification.single-file'),
163
+ defaultMessage: 'This field accepts only one file.'
164
+ })
165
+ });
166
+ return true;
167
+ };
168
+ const handleUpload = async (files)=>{
169
+ if (disabled || files.length === 0) {
170
+ return;
171
+ }
172
+ // The device picker can't reach this — it carries `multiple` — so a drop is
173
+ // the only way in.
174
+ if (rejectsBatch(files.length)) {
175
+ return;
176
+ }
177
+ const allowedFiles = allowedMediaTypes.filterAllowedFiles(allowedTypes, files);
178
+ if (allowedFiles.length === 0) {
179
+ notifyUnsupported();
180
+ return;
181
+ }
182
+ // A mixed drop uploads what it can and says so, rather than silently
183
+ // dropping the rest.
184
+ if (allowedFiles.length < files.length) {
185
+ notifyUnsupported();
186
+ }
187
+ const assetsCountByType = allowedFiles.reduce((acc, file)=>{
188
+ const type = typeFromMime.typeFromMime(file.type);
189
+ acc[type] = (acc[type] ?? 0) + 1;
190
+ return acc;
191
+ }, {});
192
+ trackUsage('didSelectFile', {
193
+ source: 'computer',
194
+ location: CONTENT_MANAGER_LOCATION
195
+ });
196
+ trackUsage('willAddMediaLibraryAssets', {
197
+ location: CONTENT_MANAGER_LOCATION,
198
+ ...assetsCountByType
199
+ });
200
+ const formData = new FormData();
201
+ allowedFiles.forEach((file)=>formData.append('files', file));
202
+ formData.append('fileInfo', JSON.stringify(allowedFiles.map((file)=>({
203
+ name: file.name,
204
+ caption: null,
205
+ alternativeText: null,
206
+ folder: UPLOAD_FOLDER_ID
207
+ }))));
208
+ try {
209
+ // Attached per file rather than from the result: a Retry in the progress
210
+ // dialog uploads cancelled files after this call has already resolved.
211
+ await uploadFiles({
212
+ formData,
213
+ totalFiles: allowedFiles.length,
214
+ concurrency,
215
+ generateAiMetadata: Boolean(isAiMetadataEnabled),
216
+ onFileUploaded: attachUploadedFile
217
+ }).unwrap();
218
+ } catch {
219
+ // Errors reach the user through the progress dialog, which the mutation
220
+ // populates itself.
221
+ }
222
+ };
223
+ const handleZoneClick = ()=>{
224
+ if (canRead) {
225
+ setStep('browse');
226
+ } else if (canCreate) {
227
+ fileInputRef.current?.click();
228
+ } else {
229
+ setStep('no-access');
230
+ }
231
+ };
232
+ /**
233
+ * The server fetches each URL and uploads what it finds, so the file's type
234
+ * is not known here — `allowedTypes` can only be enforced on what comes back.
235
+ * A URL whose file the field does not accept is uploaded to the library and
236
+ * left off the field, which is also what the Media Library page does with it.
237
+ */ const handleUrlUpload = async (urls)=>{
238
+ if (disabled || urls.length === 0 || rejectsBatch(urls.length)) {
239
+ return;
240
+ }
241
+ trackUsage('didSelectFile', {
242
+ source: 'url',
243
+ location: CONTENT_MANAGER_LOCATION
244
+ });
245
+ trackUsage('willAddMediaLibraryAssets', {
246
+ location: CONTENT_MANAGER_LOCATION
247
+ });
248
+ try {
249
+ const { data: uploadedFiles } = await uploadFromUrls({
250
+ urls,
251
+ folderId: UPLOAD_FOLDER_ID,
252
+ generateAiMetadata: Boolean(isAiMetadataEnabled)
253
+ }).unwrap();
254
+ const allowedFiles = uploadedFiles.filter((file)=>allowedMediaTypes.isMediaTypeAllowed(allowedTypes, file.mime));
255
+ const notAttachedFiles = uploadedFiles.filter((file)=>!allowedFiles.includes(file));
256
+ if (notAttachedFiles.length > 0) {
257
+ toggleNotification({
258
+ type: 'warning',
259
+ timeout: 4000,
260
+ message: formatMessage({
261
+ id: translations.getTranslationKey('content-manager.input.notification.not-attached'),
262
+ defaultMessage: '{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.'
263
+ }, {
264
+ fileNames: notAttachedFiles.map((file)=>file.name).join(', '),
265
+ count: notAttachedFiles.length,
266
+ fileTypes: (allowedTypes ?? []).join(', ')
267
+ })
268
+ });
269
+ }
270
+ if (allowedFiles.length > 0) {
271
+ setAssets(multiple ? [
272
+ ...assetsRef.current,
273
+ ...allowedFiles
274
+ ] : [
275
+ allowedFiles[0]
276
+ ]);
277
+ }
278
+ } catch {
279
+ // Errors reach the user through the progress dialog, which the mutation
280
+ // populates itself.
281
+ }
282
+ };
283
+ const handleFileInputChange = async (event)=>{
284
+ // Copied before the reset, not after: `event.target.files` is the input's
285
+ // live FileList, and clearing `value` empties it in place. Reading it
286
+ // afterwards yields nothing and the upload never starts.
287
+ const files = Array.from(event.target.files ?? []);
288
+ // Reset so picking the same file twice in a row still fires `change`.
289
+ event.target.value = '';
290
+ if (files.length > 0) {
291
+ await handleUpload(files);
292
+ }
293
+ };
294
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
295
+ name: name,
296
+ error: error,
297
+ hint: hint,
298
+ required: required,
299
+ children: [
300
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
301
+ justifyContent: "space-between",
302
+ alignItems: "center",
303
+ gap: 2,
304
+ children: [
305
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
306
+ action: labelAction,
307
+ children: label
308
+ }),
309
+ /*#__PURE__*/ jsxRuntime.jsx(AddAssetMenu.AddAssetMenu, {
310
+ disabled: disabled,
311
+ onBrowseLibrary: ()=>setStep('browse'),
312
+ onUploadFromDevice: ()=>fileInputRef.current?.click(),
313
+ onUploadFromUrl: ()=>setIsUrlDialogOpen(true)
314
+ })
315
+ ]
316
+ }),
317
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
318
+ direction: "column",
319
+ alignItems: "stretch",
320
+ gap: 1,
321
+ children: [
322
+ assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow.AssetRow, {
323
+ asset: asset,
324
+ disabled: disabled,
325
+ onCopyLink: handleCopyLink,
326
+ // The details dialog needs the library's folder tree, which needs read access.
327
+ onEdit: canRead ? setEditedAsset : undefined,
328
+ onRemove: handleRemove
329
+ }, asset.id)),
330
+ /*#__PURE__*/ jsxRuntime.jsx(AssetDropZone.AssetDropZone, {
331
+ disabled: disabled,
332
+ onClick: handleZoneClick,
333
+ onDropFiles: handleUpload
334
+ })
335
+ ]
336
+ }),
337
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {}),
338
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Hint, {}),
339
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
340
+ children: /*#__PURE__*/ jsxRuntime.jsx("input", {
341
+ ref: fileInputRef,
342
+ type: "file",
343
+ multiple: multiple,
344
+ onChange: handleFileInputChange,
345
+ tabIndex: -1,
346
+ "aria-hidden": true
347
+ })
348
+ }),
349
+ step === 'browse' && /*#__PURE__*/ jsxRuntime.jsx(AssetDialog.AssetDialog, {
350
+ open: true,
351
+ multiple: multiple,
352
+ allowedTypes: allowedTypes ?? [],
353
+ initiallySelectedAssets: assets,
354
+ folderId: folderId,
355
+ trackedLocation: CONTENT_MANAGER_LOCATION,
356
+ onClose: ()=>{
357
+ setStep(undefined);
358
+ setFolderId(null);
359
+ },
360
+ onValidate: handleSelect,
361
+ onAddFolder: ()=>setStep('create-folder'),
362
+ // The dialog's own upload button hands back to this field's upload
363
+ // path, so every route to an uploaded file opens the progress dialog.
364
+ onAddAsset: ()=>{
365
+ setStep(undefined);
366
+ fileInputRef.current?.click();
367
+ },
368
+ onChangeFolder: (nextFolderId)=>setFolderId(nextFolderId)
369
+ }),
370
+ editedAsset && /*#__PURE__*/ jsxRuntime.jsx(EditAssetContent.EditAssetDialog, {
371
+ open: true,
372
+ asset: editedAsset,
373
+ canUpdate: canUpdate && !disabled,
374
+ canCopyLink: canCopyLink,
375
+ canDownload: canDownload,
376
+ trackedLocation: CONTENT_MANAGER_LOCATION,
377
+ onClose: handleEditClose
378
+ }),
379
+ step === 'create-folder' && /*#__PURE__*/ jsxRuntime.jsx(EditFolderDialog.EditFolderDialog, {
380
+ open: true,
381
+ onClose: ()=>setStep('browse'),
382
+ parentFolderId: folderId
383
+ }),
384
+ step === 'no-access' && /*#__PURE__*/ jsxRuntime.jsx(NoLibraryAccessDialog.NoLibraryAccessDialog, {
385
+ onClose: ()=>setStep(undefined)
386
+ }),
387
+ /*#__PURE__*/ jsxRuntime.jsx(ImportFromUrlDialog.ImportFromUrlDialog, {
388
+ open: isUrlDialogOpen,
389
+ onClose: ()=>setIsUrlDialogOpen(false),
390
+ onUpload: handleUrlUpload
391
+ })
392
+ ]
393
+ });
394
+ };
395
+
396
+ exports.MediaLibraryInput = MediaLibraryInput;
397
+ //# sourceMappingURL=MediaLibraryInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryInput.js","sources":["../../../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx"],"sourcesContent":["import { useRef, useState, type ChangeEvent, type ReactNode } from 'react';\n\nimport { useClipboard, useField, useNotification } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, VisuallyHidden } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../hooks/useTracking';\n// Temporary: the Content Manager's own asset picker is not built on this stack\n// yet, so browsing and editing the library still go through the legacy dialogs.\n// These imports go when that modal lands.\nimport { AssetDialog } from '../../legacy/components/AssetDialog/AssetDialog';\nimport {\n EditAssetDialog,\n type Asset as EditableAsset,\n} from '../../legacy/components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../legacy/components/EditFolderDialog/EditFolderDialog';\nimport { ImportFromUrlDialog } from '../../pages/Assets/components/ImportFromUrlDialog';\nimport { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport {\n filterAllowedFiles,\n isMediaTypeAllowed,\n type AllowedMediaType,\n} from '../../utils/allowedMediaTypes';\nimport { prefixFileUrlWithBackendUrl } from '../../utils/files';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { AddAssetMenu } from './AddAssetMenu';\nimport { AssetDropZone } from './AssetDropZone';\nimport { AssetRow } from './AssetRow';\nimport { NoLibraryAccessDialog } from './NoLibraryAccessDialog';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/**\n * `location` for every event this field fires. The standalone Media Library\n * tags its events `'upload'`; the picker inside an entry form has always been\n * `'content-manager'`, and analytics still splits the two on that axis.\n */\nconst CONTENT_MANAGER_LOCATION = 'content-manager';\n\n/**\n * Uploads from here land at the root of the Media Library. An entry form has no\n * current folder to inherit, and the field offers no destination picker — same\n * place the legacy upload wizard put them when none was chosen.\n */\nconst UPLOAD_FOLDER_ID = null;\n\ntype Step = 'browse' | 'create-folder' | 'no-access';\n\nexport interface MediaLibraryInputProps {\n name: string;\n label?: string;\n labelAction?: ReactNode;\n hint?: string;\n required?: boolean;\n disabled?: boolean;\n attribute?: {\n allowedTypes?: AllowedMediaType[] | null;\n multiple?: boolean;\n };\n}\n\nconst EMPTY_ATTRIBUTE: NonNullable<MediaLibraryInputProps['attribute']> = {};\n\n/**\n * The Content Manager's `media` field, on the current Media Library stack.\n *\n * Files dropped here (or picked from the device) upload straight through\n * `uploadFiles`, which is what drives the global upload progress dialog — so the\n * entry form stays usable while they go, instead of being covered by the legacy\n * wizard.\n *\n * The legacy input is still registered when `useLegacyMediaLibrary` is on, and\n * is untouched by this.\n */\nexport const MediaLibraryInput = ({\n name,\n label,\n labelAction,\n hint,\n required = false,\n disabled = false,\n attribute = EMPTY_ATTRIBUTE,\n}: MediaLibraryInputProps) => {\n const { allowedTypes = null, multiple = false } = attribute;\n const { formatMessage } = useIntl();\n const { onChange, value, error } = useField<File | File[] | null>(name);\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const [step, setStep] = useState<Step | undefined>(undefined);\n const [folderId, setFolderId] = useState<number | null>(null);\n const [editedAsset, setEditedAsset] = useState<File | null>(null);\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // Echoes the app config; a missing payload (still loading) falls back to\n // sequential rather than outpacing what the server asked for.\n const { canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n const { data: settings } = useGetUploadSettingsQuery(undefined, { skip: !canRead });\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n const isAiMetadataEnabled = useAIMetadataEnabled();\n\n const assets: File[] = Array.isArray(value) ? value : value ? [value] : [];\n\n // An upload resumes long after the render that started it, and the dialog is\n // non-blocking precisely so a second batch can be dropped meanwhile. Reading\n // the closed-over `assets` on resume would then append to whatever the field\n // held when that drop began, dropping every asset that landed since.\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const setAssets = (nextAssets: File[]) => {\n if (multiple) {\n onChange(name, nextAssets.length > 0 ? nextAssets : null);\n return;\n }\n onChange(name, nextAssets[0] ?? null);\n };\n\n const attachUploadedFile = (file: File) => {\n const nextAssets = multiple ? [...assetsRef.current, file] : [file];\n // Parallel uploads can finish before the next render refreshes the ref.\n assetsRef.current = nextAssets;\n setAssets(nextAssets);\n };\n\n const handleRemove = (asset: File) => {\n setAssets(assets.filter((current) => current.id !== asset.id));\n };\n\n const handleCopyLink = async (asset: File) => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n\n if (!url) {\n return;\n }\n\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('asset-details.copy-link.success'),\n defaultMessage: 'Link copied.',\n }\n : {\n id: getTranslationKey('asset-details.copy-link.error'),\n defaultMessage: 'Failed to copy the link.',\n }\n ),\n });\n };\n\n const handleEditClose = (result?: EditableAsset | null | boolean) => {\n const asset = editedAsset;\n setEditedAsset(null);\n\n if (!asset) {\n return;\n }\n\n // `null` means the asset was deleted from the library from inside the dialog.\n if (result === null) {\n setAssets(assetsRef.current.filter((current) => current.id !== asset.id));\n return;\n }\n\n if (result && typeof result !== 'boolean') {\n setAssets(\n assetsRef.current.map((current) => (current.id === asset.id ? (result as File) : current))\n );\n }\n };\n\n const handleSelect = (selectedAssets: File[]) => {\n setAssets(selectedAssets);\n setStep(undefined);\n setFolderId(null);\n };\n\n const notifyUnsupported = () => {\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage(\n {\n // Legacy key: translated everywhere, and it names the accepted types,\n // which the field already passes as `fileTypes`.\n id: getTranslationKey('input.notification.not-supported'),\n defaultMessage: `You can't upload this type of file, only the following types are accepted – {fileTypes}`,\n },\n { fileTypes: (allowedTypes ?? []).join(',') }\n ),\n });\n };\n\n /**\n * True when the batch is more than a single-value field can take. Counted on\n * what was handed in rather than on what survives filtering: uploading one of\n * several would leave the user guessing which one the field kept.\n */\n const rejectsBatch = (count: number) => {\n if (multiple || count <= 1) {\n return false;\n }\n\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage({\n id: getTranslationKey('content-manager.input.notification.single-file'),\n defaultMessage: 'This field accepts only one file.',\n }),\n });\n\n return true;\n };\n\n const handleUpload = async (files: globalThis.File[]) => {\n if (disabled || files.length === 0) {\n return;\n }\n\n // The device picker can't reach this — it carries `multiple` — so a drop is\n // the only way in.\n if (rejectsBatch(files.length)) {\n return;\n }\n\n const allowedFiles = filterAllowedFiles(allowedTypes, files);\n\n if (allowedFiles.length === 0) {\n notifyUnsupported();\n return;\n }\n\n // A mixed drop uploads what it can and says so, rather than silently\n // dropping the rest.\n if (allowedFiles.length < files.length) {\n notifyUnsupported();\n }\n\n const assetsCountByType = allowedFiles.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('didSelectFile', { source: 'computer', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', {\n location: CONTENT_MANAGER_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n allowedFiles.forEach((file) => formData.append('files', file));\n formData.append(\n 'fileInfo',\n JSON.stringify(\n allowedFiles.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: UPLOAD_FOLDER_ID,\n }))\n )\n );\n\n try {\n // Attached per file rather than from the result: a Retry in the progress\n // dialog uploads cancelled files after this call has already resolved.\n await uploadFiles({\n formData,\n totalFiles: allowedFiles.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n onFileUploaded: attachUploadedFile,\n }).unwrap();\n } catch {\n // Errors reach the user through the progress dialog, which the mutation\n // populates itself.\n }\n };\n\n const handleZoneClick = () => {\n if (canRead) {\n setStep('browse');\n } else if (canCreate) {\n fileInputRef.current?.click();\n } else {\n setStep('no-access');\n }\n };\n\n /**\n * The server fetches each URL and uploads what it finds, so the file's type\n * is not known here — `allowedTypes` can only be enforced on what comes back.\n * A URL whose file the field does not accept is uploaded to the library and\n * left off the field, which is also what the Media Library page does with it.\n */\n const handleUrlUpload = async (urls: string[]) => {\n if (disabled || urls.length === 0 || rejectsBatch(urls.length)) {\n return;\n }\n\n trackUsage('didSelectFile', { source: 'url', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', { location: CONTENT_MANAGER_LOCATION });\n\n try {\n const { data: uploadedFiles } = await uploadFromUrls({\n urls,\n folderId: UPLOAD_FOLDER_ID,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n\n const allowedFiles = uploadedFiles.filter((file) =>\n isMediaTypeAllowed(allowedTypes, file.mime)\n );\n const notAttachedFiles = uploadedFiles.filter((file) => !allowedFiles.includes(file));\n\n if (notAttachedFiles.length > 0) {\n toggleNotification({\n type: 'warning',\n timeout: 4000,\n message: formatMessage(\n {\n id: getTranslationKey('content-manager.input.notification.not-attached'),\n defaultMessage:\n '{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.',\n },\n {\n fileNames: notAttachedFiles.map((file) => file.name).join(', '),\n count: notAttachedFiles.length,\n fileTypes: (allowedTypes ?? []).join(', '),\n }\n ),\n });\n }\n\n if (allowedFiles.length > 0) {\n setAssets(multiple ? [...assetsRef.current, ...allowedFiles] : [allowedFiles[0]]);\n }\n } catch {\n // Errors reach the user through the progress dialog, which the mutation\n // populates itself.\n }\n };\n\n const handleFileInputChange = async (event: ChangeEvent<HTMLInputElement>) => {\n // Copied before the reset, not after: `event.target.files` is the input's\n // live FileList, and clearing `value` empties it in place. Reading it\n // afterwards yields nothing and the upload never starts.\n const files = Array.from(event.target.files ?? []);\n // Reset so picking the same file twice in a row still fires `change`.\n event.target.value = '';\n\n if (files.length > 0) {\n await handleUpload(files);\n }\n };\n\n return (\n <Field.Root name={name} error={error} hint={hint} required={required}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <AddAssetMenu\n disabled={disabled}\n onBrowseLibrary={() => setStep('browse')}\n onUploadFromDevice={() => fileInputRef.current?.click()}\n onUploadFromUrl={() => setIsUrlDialogOpen(true)}\n />\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n {assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n disabled={disabled}\n onCopyLink={handleCopyLink}\n // The details dialog needs the library's folder tree, which needs read access.\n onEdit={canRead ? setEditedAsset : undefined}\n onRemove={handleRemove}\n />\n ))}\n\n <AssetDropZone disabled={disabled} onClick={handleZoneClick} onDropFiles={handleUpload} />\n </Flex>\n\n <Field.Error />\n <Field.Hint />\n\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n onChange={handleFileInputChange}\n tabIndex={-1}\n aria-hidden\n />\n </VisuallyHidden>\n\n {step === 'browse' && (\n <AssetDialog\n open\n multiple={multiple}\n allowedTypes={allowedTypes ?? []}\n initiallySelectedAssets={assets}\n folderId={folderId}\n trackedLocation={CONTENT_MANAGER_LOCATION}\n onClose={() => {\n setStep(undefined);\n setFolderId(null);\n }}\n onValidate={handleSelect}\n onAddFolder={() => setStep('create-folder')}\n // The dialog's own upload button hands back to this field's upload\n // path, so every route to an uploaded file opens the progress dialog.\n onAddAsset={() => {\n setStep(undefined);\n fileInputRef.current?.click();\n }}\n onChangeFolder={(nextFolderId) => setFolderId(nextFolderId)}\n />\n )}\n\n {editedAsset && (\n <EditAssetDialog\n open\n asset={editedAsset as EditableAsset}\n canUpdate={canUpdate && !disabled}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation={CONTENT_MANAGER_LOCATION}\n onClose={handleEditClose}\n />\n )}\n\n {step === 'create-folder' && (\n <EditFolderDialog open onClose={() => setStep('browse')} parentFolderId={folderId} />\n )}\n\n {step === 'no-access' && <NoLibraryAccessDialog onClose={() => setStep(undefined)} />}\n\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n </Field.Root>\n );\n};\n"],"names":["CONTENT_MANAGER_LOCATION","UPLOAD_FOLDER_ID","EMPTY_ATTRIBUTE","MediaLibraryInput","name","label","labelAction","hint","required","disabled","attribute","allowedTypes","multiple","formatMessage","useIntl","onChange","value","error","useField","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","step","setStep","useState","undefined","folderId","setFolderId","editedAsset","setEditedAsset","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","canRead","canCreate","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","data","settings","useGetUploadSettingsQuery","skip","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","assets","Array","isArray","assetsRef","current","setAssets","nextAssets","length","attachUploadedFile","file","handleRemove","asset","filter","id","handleCopyLink","url","prefixFileUrlWithBackendUrl","didCopy","type","message","getTranslationKey","defaultMessage","handleEditClose","result","map","handleSelect","selectedAssets","notifyUnsupported","timeout","fileTypes","join","rejectsBatch","count","handleUpload","files","allowedFiles","filterAllowedFiles","assetsCountByType","reduce","acc","typeFromMime","source","location","formData","FormData","forEach","append","JSON","stringify","caption","alternativeText","folder","totalFiles","generateAiMetadata","Boolean","onFileUploaded","unwrap","handleZoneClick","click","handleUrlUpload","urls","uploadedFiles","isMediaTypeAllowed","mime","notAttachedFiles","includes","fileNames","handleFileInputChange","event","from","target","_jsxs","Field","Root","Flex","justifyContent","alignItems","gap","_jsx","Label","action","AddAssetMenu","onBrowseLibrary","onUploadFromDevice","onUploadFromUrl","direction","AssetRow","onCopyLink","onEdit","onRemove","AssetDropZone","onClick","onDropFiles","Error","Hint","VisuallyHidden","input","ref","tabIndex","aria-hidden","AssetDialog","open","initiallySelectedAssets","trackedLocation","onClose","onValidate","onAddFolder","onAddAsset","onChangeFolder","nextFolderId","EditAssetDialog","EditFolderDialog","parentFolderId","NoLibraryAccessDialog","ImportFromUrlDialog","onUpload"],"mappings":"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"}