@strapi/upload 5.58.0 → 5.60.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 (395) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  10. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  12. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  14. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  16. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  18. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  20. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  21. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +142 -0
  22. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
  23. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +140 -0
  24. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
  25. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  26. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  27. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  28. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  29. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  30. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  31. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  32. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +156 -0
  34. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
  35. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +154 -0
  36. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
  37. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetRow.js +211 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +208 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  46. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  47. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  48. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  49. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +439 -0
  50. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +433 -0
  52. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  54. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  55. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  56. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  57. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  58. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  60. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  61. package/dist/admin/components/UploadProgressDialog.js +2 -1
  62. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  63. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  64. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  65. package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
  66. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
  67. package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
  68. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
  69. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
  70. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  71. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
  72. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  73. package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -2
  74. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  75. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +16 -2
  76. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  77. package/dist/admin/hooks/useTracking.js +5 -1
  78. package/dist/admin/hooks/useTracking.js.map +1 -1
  79. package/dist/admin/hooks/useTracking.mjs +5 -1
  80. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  81. package/dist/admin/index.js +7 -2
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +7 -2
  84. package/dist/admin/index.mjs.map +1 -1
  85. package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
  86. package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
  87. package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
  88. package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
  89. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
  90. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
  91. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
  92. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
  93. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
  94. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
  95. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
  96. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  97. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
  98. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  99. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  100. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  101. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
  102. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
  103. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
  104. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
  105. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
  106. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  107. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
  108. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  109. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
  110. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  111. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
  112. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  113. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
  114. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  115. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
  116. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  117. package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
  118. package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
  119. package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
  120. package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
  121. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
  122. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
  123. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
  124. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  125. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
  126. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  127. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
  128. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  129. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
  130. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  131. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
  132. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  133. package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
  134. package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
  135. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
  136. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
  137. package/dist/admin/legacy/components/TableList/TableList.js +3 -1
  138. package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
  139. package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
  140. package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
  141. package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
  142. package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
  143. package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
  144. package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
  145. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
  146. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  147. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
  148. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  149. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  150. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  151. package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
  152. package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
  153. package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
  154. package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
  155. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
  156. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
  157. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
  158. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
  159. package/dist/admin/pages/Assets/AssetsPage.js +13 -302
  160. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  161. package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
  162. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  163. package/dist/admin/pages/Assets/components/AssetsGrid.js +143 -31
  164. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  165. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +146 -34
  166. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  167. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  168. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  169. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  170. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  171. package/dist/admin/pages/Assets/components/AssetsTable.js +60 -35
  172. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  173. package/dist/admin/pages/Assets/components/AssetsTable.mjs +62 -37
  174. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  175. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  176. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  177. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  178. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  179. package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
  180. package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
  181. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +4 -2
  182. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  183. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  184. package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
  185. package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
  186. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
  187. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
  188. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  189. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  190. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  191. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  192. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  193. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  194. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  195. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  196. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  197. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  198. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  199. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  200. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  201. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  202. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  203. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  204. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  205. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
  206. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  207. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
  208. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  209. package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
  210. package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
  211. package/dist/admin/pages/Assets/components/FilterBadges.mjs +35 -6
  212. package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
  213. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  214. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  215. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  216. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  217. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  218. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  219. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  220. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  221. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  222. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  223. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  224. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  225. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  226. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  227. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  228. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  229. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  230. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  231. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  232. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  233. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  234. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  235. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  236. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  237. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  238. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  239. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  240. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  241. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  242. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  243. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  244. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  245. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  246. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  247. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  248. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  249. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  250. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  251. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  252. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  253. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  254. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  255. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  256. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  257. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  258. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  259. package/dist/admin/services/api.js +106 -11
  260. package/dist/admin/services/api.js.map +1 -1
  261. package/dist/admin/services/api.mjs +105 -13
  262. package/dist/admin/services/api.mjs.map +1 -1
  263. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  264. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  265. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  266. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  267. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  268. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
  269. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  270. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  271. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +21 -0
  272. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  273. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +25 -0
  274. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  275. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +28 -0
  276. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  277. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  278. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +3 -0
  279. package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
  280. package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
  281. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  282. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  283. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  284. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  285. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  286. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  287. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  288. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  289. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  290. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  291. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  292. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  293. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  294. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  295. package/dist/admin/src/services/api.d.ts +30 -1
  296. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  297. package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
  298. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  299. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  300. package/dist/admin/store/uploadProgress.js +30 -3
  301. package/dist/admin/store/uploadProgress.js.map +1 -1
  302. package/dist/admin/store/uploadProgress.mjs +29 -4
  303. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  304. package/dist/admin/translations/ca.json.js +3 -3
  305. package/dist/admin/translations/ca.json.mjs +3 -3
  306. package/dist/admin/translations/da.json.js +1 -1
  307. package/dist/admin/translations/da.json.mjs +1 -1
  308. package/dist/admin/translations/de.json.js +1 -1
  309. package/dist/admin/translations/de.json.mjs +1 -1
  310. package/dist/admin/translations/en.json.js +29 -0
  311. package/dist/admin/translations/en.json.js.map +1 -1
  312. package/dist/admin/translations/en.json.mjs +29 -0
  313. package/dist/admin/translations/en.json.mjs.map +1 -1
  314. package/dist/admin/translations/es.json.js +1 -1
  315. package/dist/admin/translations/es.json.mjs +1 -1
  316. package/dist/admin/translations/sk.json.js +2 -2
  317. package/dist/admin/translations/sk.json.mjs +2 -2
  318. package/dist/admin/translations/tr.json.js +2 -2
  319. package/dist/admin/translations/tr.json.mjs +2 -2
  320. package/dist/admin/translations/zh-Hans.json.js +1 -1
  321. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  322. package/dist/admin/translations/zh.json.js +2 -2
  323. package/dist/admin/translations/zh.json.mjs +2 -2
  324. package/dist/admin/utils/allowedMediaTypes.js +42 -0
  325. package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
  326. package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
  327. package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
  328. package/dist/admin/utils/findFolderPath.js +26 -0
  329. package/dist/admin/utils/findFolderPath.js.map +1 -0
  330. package/dist/admin/utils/findFolderPath.mjs +24 -0
  331. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  332. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  333. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  334. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  335. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  336. package/dist/server/config.js +6 -0
  337. package/dist/server/config.js.map +1 -1
  338. package/dist/server/config.mjs +6 -0
  339. package/dist/server/config.mjs.map +1 -1
  340. package/dist/server/controllers/admin-settings.js +5 -1
  341. package/dist/server/controllers/admin-settings.js.map +1 -1
  342. package/dist/server/controllers/admin-settings.mjs +5 -1
  343. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  344. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  345. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  346. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  347. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  348. package/dist/server/mcp/ambient-instance.js +7 -5
  349. package/dist/server/mcp/ambient-instance.js.map +1 -1
  350. package/dist/server/mcp/ambient-instance.mjs +7 -5
  351. package/dist/server/mcp/ambient-instance.mjs.map +1 -1
  352. package/dist/server/mcp/handlers/folder-handlers.js +4 -16
  353. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
  354. package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
  355. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
  356. package/dist/server/mcp/handlers/read-handlers.js +6 -14
  357. package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
  358. package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
  359. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
  360. package/dist/server/mcp/handlers/write-handlers.js +3 -13
  361. package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
  362. package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
  363. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
  364. package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
  365. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
  366. package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
  367. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
  368. package/dist/server/services/image-manipulation.js +35 -16
  369. package/dist/server/services/image-manipulation.js.map +1 -1
  370. package/dist/server/services/image-manipulation.mjs +35 -16
  371. package/dist/server/services/image-manipulation.mjs.map +1 -1
  372. package/dist/server/services/upload.js.map +1 -1
  373. package/dist/server/services/upload.mjs.map +1 -1
  374. package/dist/server/src/config.d.ts +3 -0
  375. package/dist/server/src/config.d.ts.map +1 -1
  376. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  377. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  378. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  379. package/dist/server/src/index.d.ts +4 -1
  380. package/dist/server/src/index.d.ts.map +1 -1
  381. package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
  382. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  383. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
  384. package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
  385. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
  386. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
  387. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
  388. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
  389. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  390. package/dist/server/src/services/image-manipulation.d.ts +1 -1
  391. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  392. package/dist/server/src/services/index.d.ts +1 -1
  393. package/dist/server/src/types.d.ts +64 -12
  394. package/dist/server/src/types.d.ts.map +1 -1
  395. package/package.json +8 -6
@@ -0,0 +1,433 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef } from 'react';
3
+ import { useField, useNotification, useClipboard, useForm } from '@strapi/admin/strapi-admin';
4
+ import { Field, Flex, VisuallyHidden } from '@strapi/design-system';
5
+ import get from 'lodash/get';
6
+ import { useIntl } from 'react-intl';
7
+ import { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled.mjs';
8
+ import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions.mjs';
9
+ import { useTracking } from '../../hooks/useTracking.mjs';
10
+ import { EditAssetDialog } from '../../legacy/components/EditAssetDialog/EditAssetContent.mjs';
11
+ import { ImportFromUrlDialog } from '../../pages/Assets/components/ImportFromUrlDialog.mjs';
12
+ import { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api.mjs';
13
+ import { useGetUploadSettingsQuery } from '../../services/settings.mjs';
14
+ import { isMediaTypeAllowed, filterAllowedFiles } from '../../utils/allowedMediaTypes.mjs';
15
+ import { prefixFileUrlWithBackendUrl } from '../../utils/files.mjs';
16
+ import { getTranslationKey } from '../../utils/translations.mjs';
17
+ import { typeFromMime } from '../../utils/typeFromMime.mjs';
18
+ import { AssetPickerDialog } from '../AssetPickerDialog/AssetPickerDialog.mjs';
19
+ import { AddAssetMenu } from './AddAssetMenu.mjs';
20
+ import { AssetCard, UploadCard } from './AssetCard.mjs';
21
+ import { AssetCarousel } from './AssetCarousel.mjs';
22
+ import { AssetDropZone } from './AssetDropZone.mjs';
23
+ import { UploadRow, AssetRow } from './AssetRow.mjs';
24
+ import { useFieldUploads } from './useFieldUploads.mjs';
25
+
26
+ /**
27
+ * What a field wrote that its form has not rendered yet, per form and field.
28
+ * `getValues()` only catches up on render, and two uploads can complete before
29
+ * the next one. Kept outside the input so it survives a remount.
30
+ */ const unrenderedWrites = new WeakMap();
31
+ const toAssets = (value)=>Array.isArray(value) ? value : value ? [
32
+ value
33
+ ] : [];
34
+ /**
35
+ * `location` for every event this field fires. The standalone Media Library
36
+ * tags its events `'upload'`; the picker inside an entry form has always been
37
+ * `'content-manager'`, and analytics still splits the two on that axis.
38
+ */ const CONTENT_MANAGER_LOCATION = 'content-manager';
39
+ /**
40
+ * Uploads from here land at the root of the Media Library. An entry form has no
41
+ * current folder to inherit, and the field offers no destination picker — same
42
+ * place the legacy upload wizard put them when none was chosen.
43
+ */ const UPLOAD_FOLDER_ID = null;
44
+ const EMPTY_ATTRIBUTE = {};
45
+ /**
46
+ * The Content Manager's `media` field, on the current Media Library stack.
47
+ *
48
+ * Files dropped here (or picked from the device) upload straight through
49
+ * `uploadFiles`, which is what drives the global upload progress dialog — so the
50
+ * entry form stays usable while they go, instead of being covered by the legacy
51
+ * wizard.
52
+ *
53
+ * The legacy input is still registered when `useLegacyMediaLibrary` is on, and
54
+ * is untouched by this.
55
+ */ const MediaLibraryInput = ({ name, label, labelAction, hint, required = false, disabled = false, attribute = EMPTY_ATTRIBUTE, layoutSize })=>{
56
+ const { allowedTypes = null, multiple = false } = attribute;
57
+ const { formatMessage } = useIntl();
58
+ const { onChange, value, error } = useField(name);
59
+ const { toggleNotification } = useNotification();
60
+ const { trackUsage } = useTracking();
61
+ const { copy } = useClipboard();
62
+ const getValues = useForm('MediaLibraryInput', (state)=>state.getValues);
63
+ const [step, setStep] = useState(undefined);
64
+ const [editedAsset, setEditedAsset] = useState(null);
65
+ const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);
66
+ const fileInputRef = useRef(null);
67
+ const [uploadFiles] = useUploadFilesMutation();
68
+ const [uploadFromUrls] = useUploadFromUrlsMutation();
69
+ // Echoes the app config; a missing payload (still loading) falls back to
70
+ // sequential rather than outpacing what the server asked for.
71
+ const { isLoading, canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();
72
+ // Not while permissions load: `useRBAC` starts with every flag false, and an
73
+ // upload sent before it settles can end in a 403.
74
+ const canUpload = !isLoading && canCreate;
75
+ const { data: settings } = useGetUploadSettingsQuery(undefined, {
76
+ skip: !canRead
77
+ });
78
+ const concurrency = settings?.data?.concurrentUploadRequests ?? 1;
79
+ const isAiMetadataEnabled = useAIMetadataEnabled();
80
+ const assets = Array.isArray(value) ? value : value ? [
81
+ value
82
+ ] : [];
83
+ // An upload resumes long after the render that started it, and the dialog is
84
+ // non-blocking precisely so a second batch can be dropped meanwhile. Reading
85
+ // the closed-over `assets` on resume would then append to whatever the field
86
+ // held when that drop began, dropping every asset that landed since.
87
+ const assetsRef = useRef(assets);
88
+ assetsRef.current = assets;
89
+ const setAssets = (nextAssets)=>{
90
+ if (multiple) {
91
+ onChange(name, nextAssets.length > 0 ? nextAssets : null);
92
+ return;
93
+ }
94
+ onChange(name, nextAssets[0] ?? null);
95
+ };
96
+ const handleRemove = (asset)=>{
97
+ setAssets(assets.filter((current)=>current.id !== asset.id));
98
+ };
99
+ // Bound to the form, not to this input: a component collapsed mid-upload
100
+ // unmounts the field, and the file must still land on the entry.
101
+ const attachUploadedFile = (file)=>{
102
+ const writes = unrenderedWrites.get(getValues) ?? new Map();
103
+ unrenderedWrites.set(getValues, writes);
104
+ const value = get(getValues(), name);
105
+ const pending = writes.get(name);
106
+ const current = pending && pending.seen === value ? pending.written : toAssets(value);
107
+ const next = multiple ? [
108
+ ...current,
109
+ file
110
+ ] : [
111
+ file
112
+ ];
113
+ writes.set(name, {
114
+ seen: value,
115
+ written: next
116
+ });
117
+ setAssets(next);
118
+ };
119
+ const { uploads, cancel, retry, dismiss } = useFieldUploads(name);
120
+ const handleCopyLink = async (asset)=>{
121
+ const url = prefixFileUrlWithBackendUrl(asset.url);
122
+ if (!url) {
123
+ return;
124
+ }
125
+ const didCopy = await copy(url);
126
+ toggleNotification({
127
+ type: didCopy ? 'success' : 'danger',
128
+ message: formatMessage(didCopy ? {
129
+ id: getTranslationKey('asset-details.copy-link.success'),
130
+ defaultMessage: 'Link copied.'
131
+ } : {
132
+ id: getTranslationKey('asset-details.copy-link.error'),
133
+ defaultMessage: 'Failed to copy the link.'
134
+ })
135
+ });
136
+ };
137
+ const handleEditClose = (result)=>{
138
+ const asset = editedAsset;
139
+ setEditedAsset(null);
140
+ if (!asset) {
141
+ return;
142
+ }
143
+ // `null` means the asset was deleted from the library from inside the dialog.
144
+ if (result === null) {
145
+ setAssets(assetsRef.current.filter((current)=>current.id !== asset.id));
146
+ return;
147
+ }
148
+ if (result && typeof result !== 'boolean') {
149
+ setAssets(assetsRef.current.map((current)=>current.id === asset.id ? result : current));
150
+ }
151
+ };
152
+ const handleSelect = (selectedAssets)=>{
153
+ setAssets(selectedAssets);
154
+ setStep(undefined);
155
+ };
156
+ const notifyUnsupported = ()=>{
157
+ toggleNotification({
158
+ type: 'danger',
159
+ timeout: 4000,
160
+ message: formatMessage({
161
+ // Legacy key: translated everywhere, and it names the accepted types,
162
+ // which the field already passes as `fileTypes`.
163
+ id: getTranslationKey('input.notification.not-supported'),
164
+ defaultMessage: `You can't upload this type of file, only the following types are accepted – {fileTypes}`
165
+ }, {
166
+ fileTypes: (allowedTypes ?? []).join(',')
167
+ })
168
+ });
169
+ };
170
+ /**
171
+ * True when the batch is more than a single-value field can take. Counted on
172
+ * what was handed in rather than on what survives filtering: uploading one of
173
+ * several would leave the user guessing which one the field kept.
174
+ */ const rejectsBatch = (count)=>{
175
+ if (multiple || count <= 1) {
176
+ return false;
177
+ }
178
+ toggleNotification({
179
+ type: 'danger',
180
+ timeout: 4000,
181
+ message: formatMessage({
182
+ id: getTranslationKey('content-manager.input.notification.single-file'),
183
+ defaultMessage: 'This field accepts only one file.'
184
+ })
185
+ });
186
+ return true;
187
+ };
188
+ const handleUpload = (files)=>{
189
+ if (disabled || !canUpload || files.length === 0) {
190
+ return;
191
+ }
192
+ // The device picker can't reach this — it carries `multiple` — so a drop is
193
+ // the only way in.
194
+ if (rejectsBatch(files.length)) {
195
+ return;
196
+ }
197
+ const allowedFiles = filterAllowedFiles(allowedTypes, files);
198
+ if (allowedFiles.length === 0) {
199
+ notifyUnsupported();
200
+ return;
201
+ }
202
+ // A mixed drop uploads what it can and says so, rather than silently
203
+ // dropping the rest.
204
+ if (allowedFiles.length < files.length) {
205
+ notifyUnsupported();
206
+ }
207
+ const assetsCountByType = allowedFiles.reduce((acc, file)=>{
208
+ const type = typeFromMime(file.type);
209
+ acc[type] = (acc[type] ?? 0) + 1;
210
+ return acc;
211
+ }, {});
212
+ trackUsage('didSelectFile', {
213
+ source: 'computer',
214
+ location: CONTENT_MANAGER_LOCATION
215
+ });
216
+ trackUsage('willAddMediaLibraryAssets', {
217
+ location: CONTENT_MANAGER_LOCATION,
218
+ ...assetsCountByType
219
+ });
220
+ startUpload(allowedFiles);
221
+ };
222
+ /**
223
+ * Hands the files to the shared upload pool. The field picks the results up
224
+ * from `onFileUploaded`, which also runs for retries of the same rows.
225
+ */ const startUpload = (allowedFiles)=>{
226
+ const formData = new FormData();
227
+ allowedFiles.forEach((file)=>formData.append('files', file));
228
+ formData.append('fileInfo', JSON.stringify(allowedFiles.map((file)=>({
229
+ name: file.name,
230
+ caption: null,
231
+ alternativeText: null,
232
+ folder: UPLOAD_FOLDER_ID
233
+ }))));
234
+ uploadFiles({
235
+ formData,
236
+ totalFiles: allowedFiles.length,
237
+ concurrency,
238
+ generateAiMetadata: Boolean(isAiMetadataEnabled),
239
+ onFileUploaded: attachUploadedFile,
240
+ owner: name
241
+ });
242
+ };
243
+ const handleRetry = (upload)=>retry(upload, (file)=>startUpload([
244
+ file
245
+ ]));
246
+ /**
247
+ * The server fetches each URL and uploads what it finds, so the file's type
248
+ * is not known here — `allowedTypes` can only be enforced on what comes back.
249
+ * A URL whose file the field does not accept is uploaded to the library and
250
+ * left off the field, which is also what the Media Library page does with it.
251
+ */ const handleUrlUpload = async (urls)=>{
252
+ if (disabled || urls.length === 0 || rejectsBatch(urls.length)) {
253
+ return;
254
+ }
255
+ trackUsage('didSelectFile', {
256
+ source: 'url',
257
+ location: CONTENT_MANAGER_LOCATION
258
+ });
259
+ trackUsage('willAddMediaLibraryAssets', {
260
+ location: CONTENT_MANAGER_LOCATION
261
+ });
262
+ try {
263
+ const { data: uploadedFiles } = await uploadFromUrls({
264
+ urls,
265
+ folderId: UPLOAD_FOLDER_ID,
266
+ generateAiMetadata: Boolean(isAiMetadataEnabled)
267
+ }).unwrap();
268
+ const allowedFiles = uploadedFiles.filter((file)=>isMediaTypeAllowed(allowedTypes, file.mime));
269
+ const notAttachedFiles = uploadedFiles.filter((file)=>!allowedFiles.includes(file));
270
+ if (notAttachedFiles.length > 0) {
271
+ toggleNotification({
272
+ type: 'warning',
273
+ timeout: 4000,
274
+ message: formatMessage({
275
+ id: getTranslationKey('content-manager.input.notification.not-attached'),
276
+ defaultMessage: '{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.'
277
+ }, {
278
+ fileNames: notAttachedFiles.map((file)=>file.name).join(', '),
279
+ count: notAttachedFiles.length,
280
+ fileTypes: (allowedTypes ?? []).join(', ')
281
+ })
282
+ });
283
+ }
284
+ if (allowedFiles.length > 0) {
285
+ setAssets(multiple ? [
286
+ ...assetsRef.current,
287
+ ...allowedFiles
288
+ ] : [
289
+ allowedFiles[0]
290
+ ]);
291
+ }
292
+ } catch {
293
+ // Errors reach the user through the progress dialog, which the mutation
294
+ // populates itself.
295
+ }
296
+ };
297
+ const handleFileInputChange = (event)=>{
298
+ // Copied before the reset, not after: `event.target.files` is the input's
299
+ // live FileList, and clearing `value` empties it in place. Reading it
300
+ // afterwards yields nothing and the upload never starts.
301
+ const files = Array.from(event.target.files ?? []);
302
+ // Reset so picking the same file twice in a row still fires `change`.
303
+ event.target.value = '';
304
+ if (files.length > 0) {
305
+ handleUpload(files);
306
+ }
307
+ };
308
+ const renderValue = ()=>{
309
+ const dropZone = (variant)=>/*#__PURE__*/ jsx(AssetDropZone, {
310
+ variant: variant,
311
+ disabled: disabled || !canUpload,
312
+ onDropFiles: handleUpload
313
+ });
314
+ if (assets.length === 0 && uploads.length === 0) {
315
+ return dropZone('bar');
316
+ }
317
+ const uploadHandlers = {
318
+ disabled,
319
+ onCancel: cancel,
320
+ onRetry: handleRetry,
321
+ onRemove: (upload)=>dismiss(upload.key)
322
+ };
323
+ if (!multiple) {
324
+ // A replacement in flight, or one that failed, stands in for the current
325
+ // asset until it lands or is removed.
326
+ if (uploads.length > 0) {
327
+ return /*#__PURE__*/ jsx(Flex, {
328
+ direction: "column",
329
+ alignItems: "stretch",
330
+ gap: 2,
331
+ children: uploads.map((upload)=>/*#__PURE__*/ jsx(UploadRow, {
332
+ upload: upload,
333
+ ...uploadHandlers
334
+ }, upload.key))
335
+ });
336
+ }
337
+ return /*#__PURE__*/ jsx(AssetRow, {
338
+ asset: assets[0],
339
+ disabled: disabled,
340
+ onCopyLink: handleCopyLink,
341
+ // The details dialog needs the library's folder tree, which needs read access.
342
+ onEdit: canRead ? setEditedAsset : undefined,
343
+ onRemove: handleRemove
344
+ });
345
+ }
346
+ return /*#__PURE__*/ jsxs(AssetCarousel, {
347
+ renderDropZone: dropZone,
348
+ layoutSize: layoutSize,
349
+ children: [
350
+ assets.map((asset)=>/*#__PURE__*/ jsx(AssetCard, {
351
+ asset: asset,
352
+ disabled: disabled,
353
+ onCopyLink: handleCopyLink,
354
+ onEdit: canRead ? setEditedAsset : undefined,
355
+ onRemove: handleRemove
356
+ }, asset.id)),
357
+ uploads.map((upload)=>/*#__PURE__*/ jsx(UploadCard, {
358
+ upload: upload,
359
+ ...uploadHandlers
360
+ }, upload.key))
361
+ ]
362
+ });
363
+ };
364
+ return /*#__PURE__*/ jsxs(Field.Root, {
365
+ name: name,
366
+ error: error,
367
+ hint: hint,
368
+ required: required,
369
+ children: [
370
+ /*#__PURE__*/ jsxs(Flex, {
371
+ justifyContent: "space-between",
372
+ alignItems: "center",
373
+ gap: 2,
374
+ children: [
375
+ /*#__PURE__*/ jsx(Field.Label, {
376
+ action: labelAction,
377
+ children: label
378
+ }),
379
+ /*#__PURE__*/ jsx(AddAssetMenu, {
380
+ disabled: disabled,
381
+ onBrowseLibrary: ()=>setStep('browse'),
382
+ onUploadFromDevice: ()=>fileInputRef.current?.click(),
383
+ onUploadFromUrl: ()=>setIsUrlDialogOpen(true)
384
+ })
385
+ ]
386
+ }),
387
+ renderValue(),
388
+ /*#__PURE__*/ jsx(Field.Error, {}),
389
+ /*#__PURE__*/ jsx(Field.Hint, {}),
390
+ /*#__PURE__*/ jsx(VisuallyHidden, {
391
+ children: /*#__PURE__*/ jsx("input", {
392
+ ref: fileInputRef,
393
+ type: "file",
394
+ multiple: multiple,
395
+ onChange: handleFileInputChange,
396
+ tabIndex: -1,
397
+ "aria-hidden": true
398
+ })
399
+ }),
400
+ step === 'browse' && /*#__PURE__*/ jsx(AssetPickerDialog, {
401
+ open: true,
402
+ title: formatMessage({
403
+ id: getTranslationKey('asset-picker.title'),
404
+ defaultMessage: 'Add asset for {fieldName}'
405
+ }, {
406
+ fieldName: label ?? name
407
+ }),
408
+ initialSelection: assets,
409
+ multiple: multiple,
410
+ allowedTypes: allowedTypes,
411
+ onClose: ()=>setStep(undefined),
412
+ onConfirm: handleSelect
413
+ }),
414
+ editedAsset && /*#__PURE__*/ jsx(EditAssetDialog, {
415
+ open: true,
416
+ asset: editedAsset,
417
+ canUpdate: canUpdate && !disabled,
418
+ canCopyLink: canCopyLink,
419
+ canDownload: canDownload,
420
+ trackedLocation: CONTENT_MANAGER_LOCATION,
421
+ onClose: handleEditClose
422
+ }),
423
+ /*#__PURE__*/ jsx(ImportFromUrlDialog, {
424
+ open: isUrlDialogOpen,
425
+ onClose: ()=>setIsUrlDialogOpen(false),
426
+ onUpload: handleUrlUpload
427
+ })
428
+ ]
429
+ });
430
+ };
431
+
432
+ export { MediaLibraryInput };
433
+ //# sourceMappingURL=MediaLibraryInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryInput.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx"],"sourcesContent":["import { useRef, useState, type ChangeEvent, type ReactNode } from 'react';\n\nimport { useClipboard, useField, useForm, useNotification } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, VisuallyHidden } from '@strapi/design-system';\nimport get from 'lodash/get';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../hooks/useTracking';\nimport {\n EditAssetDialog,\n type Asset as EditableAsset,\n} from '../../legacy/components/EditAssetDialog/EditAssetContent';\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';\nimport { AssetPickerDialog } from '../AssetPickerDialog/AssetPickerDialog';\n\nimport { AddAssetMenu } from './AddAssetMenu';\nimport { AssetCard, UploadCard } from './AssetCard';\nimport { AssetCarousel } from './AssetCarousel';\nimport { AssetDropZone, type ZoneVariant } from './AssetDropZone';\nimport { AssetRow, UploadRow } from './AssetRow';\nimport { useFieldUploads, type FieldUpload } from './useFieldUploads';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/**\n * What a field wrote that its form has not rendered yet, per form and field.\n * `getValues()` only catches up on render, and two uploads can complete before\n * the next one. Kept outside the input so it survives a remount.\n */\nconst unrenderedWrites = new WeakMap<object, Map<string, { seen: unknown; written: File[] }>>();\n\nconst toAssets = (value: unknown): File[] =>\n Array.isArray(value) ? value : value ? [value as File] : [];\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';\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 /** The field's width in the edit layout, out of 12. Set by the Content Manager. */\n layoutSize?: number;\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 layoutSize,\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 const getValues = useForm('MediaLibraryInput', (state) => state.getValues);\n\n const [step, setStep] = useState<Step | undefined>(undefined);\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 { isLoading, canRead, canCreate, canUpdate, canCopyLink, canDownload } =\n useMediaLibraryPermissions();\n // Not while permissions load: `useRBAC` starts with every flag false, and an\n // upload sent before it settles can end in a 403.\n const canUpload = !isLoading && canCreate;\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 handleRemove = (asset: File) => {\n setAssets(assets.filter((current) => current.id !== asset.id));\n };\n\n // Bound to the form, not to this input: a component collapsed mid-upload\n // unmounts the field, and the file must still land on the entry.\n const attachUploadedFile = (file: File) => {\n const writes = unrenderedWrites.get(getValues) ?? new Map();\n unrenderedWrites.set(getValues, writes);\n\n const value = get(getValues(), name);\n const pending = writes.get(name);\n const current = pending && pending.seen === value ? pending.written : toAssets(value);\n const next = multiple ? [...current, file] : [file];\n\n writes.set(name, { seen: value, written: next });\n setAssets(next);\n };\n\n const { uploads, cancel, retry, dismiss } = useFieldUploads(name);\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 };\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 = (files: globalThis.File[]) => {\n if (disabled || !canUpload || 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 startUpload(allowedFiles);\n };\n\n /**\n * Hands the files to the shared upload pool. The field picks the results up\n * from `onFileUploaded`, which also runs for retries of the same rows.\n */\n const startUpload = (allowedFiles: globalThis.File[]) => {\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 uploadFiles({\n formData,\n totalFiles: allowedFiles.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n onFileUploaded: attachUploadedFile,\n owner: name,\n });\n };\n\n const handleRetry = (upload: FieldUpload) => retry(upload, (file) => startUpload([file]));\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 = (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 handleUpload(files);\n }\n };\n\n const renderValue = () => {\n const dropZone = (variant: ZoneVariant) => (\n <AssetDropZone\n variant={variant}\n disabled={disabled || !canUpload}\n onDropFiles={handleUpload}\n />\n );\n\n if (assets.length === 0 && uploads.length === 0) {\n return dropZone('bar');\n }\n\n const uploadHandlers = {\n disabled,\n onCancel: cancel,\n onRetry: handleRetry,\n onRemove: (upload: FieldUpload) => dismiss(upload.key),\n };\n\n if (!multiple) {\n // A replacement in flight, or one that failed, stands in for the current\n // asset until it lands or is removed.\n if (uploads.length > 0) {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {uploads.map((upload) => (\n <UploadRow key={upload.key} upload={upload} {...uploadHandlers} />\n ))}\n </Flex>\n );\n }\n\n return (\n <AssetRow\n asset={assets[0]}\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\n return (\n <AssetCarousel renderDropZone={dropZone} layoutSize={layoutSize}>\n {assets.map((asset) => (\n <AssetCard\n key={asset.id}\n asset={asset}\n disabled={disabled}\n onCopyLink={handleCopyLink}\n onEdit={canRead ? setEditedAsset : undefined}\n onRemove={handleRemove}\n />\n ))}\n {uploads.map((upload) => (\n <UploadCard key={upload.key} upload={upload} {...uploadHandlers} />\n ))}\n </AssetCarousel>\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 {renderValue()}\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 <AssetPickerDialog\n open\n title={formatMessage(\n {\n id: getTranslationKey('asset-picker.title'),\n defaultMessage: 'Add asset for {fieldName}',\n },\n { fieldName: label ?? name }\n )}\n initialSelection={assets}\n multiple={multiple}\n allowedTypes={allowedTypes}\n onClose={() => setStep(undefined)}\n onConfirm={handleSelect}\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 <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n </Field.Root>\n );\n};\n"],"names":["unrenderedWrites","WeakMap","toAssets","value","Array","isArray","CONTENT_MANAGER_LOCATION","UPLOAD_FOLDER_ID","EMPTY_ATTRIBUTE","MediaLibraryInput","name","label","labelAction","hint","required","disabled","attribute","layoutSize","allowedTypes","multiple","formatMessage","useIntl","onChange","error","useField","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","getValues","useForm","state","step","setStep","useState","undefined","editedAsset","setEditedAsset","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","isLoading","canRead","canCreate","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","canUpload","data","settings","useGetUploadSettingsQuery","skip","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","assets","assetsRef","current","setAssets","nextAssets","length","handleRemove","asset","filter","id","attachUploadedFile","file","writes","get","Map","set","pending","seen","written","next","uploads","cancel","retry","dismiss","useFieldUploads","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","startUpload","formData","FormData","forEach","append","JSON","stringify","caption","alternativeText","folder","totalFiles","generateAiMetadata","Boolean","onFileUploaded","owner","handleRetry","upload","handleUrlUpload","urls","uploadedFiles","folderId","unwrap","isMediaTypeAllowed","mime","notAttachedFiles","includes","fileNames","handleFileInputChange","event","from","target","renderValue","dropZone","variant","_jsx","AssetDropZone","onDropFiles","uploadHandlers","onCancel","onRetry","onRemove","key","Flex","direction","alignItems","gap","UploadRow","AssetRow","onCopyLink","onEdit","_jsxs","AssetCarousel","renderDropZone","AssetCard","UploadCard","Field","Root","justifyContent","Label","action","AddAssetMenu","onBrowseLibrary","onUploadFromDevice","click","onUploadFromUrl","Error","Hint","VisuallyHidden","input","ref","tabIndex","aria-hidden","AssetPickerDialog","open","title","fieldName","initialSelection","onClose","onConfirm","EditAssetDialog","trackedLocation","ImportFromUrlDialog","onUpload"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var styledComponents = require('styled-components');
5
+
6
+ const slide = styledComponents.keyframes`
7
+ from { transform: translateX(-100%); }
8
+ to { transform: translateX(400%); }
9
+ `;
10
+ const Track = styledComponents.styled.div`
11
+ position: relative;
12
+ width: 100%;
13
+ height: 0.4rem;
14
+ overflow: hidden;
15
+ border-radius: 0.2rem;
16
+ background: ${({ theme })=>theme.colors.primary200};
17
+ `;
18
+ const Fill = styledComponents.styled.div`
19
+ height: 100%;
20
+ border-radius: inherit;
21
+ background: ${({ theme })=>theme.colors.primary600};
22
+ transition: width 0.2s linear;
23
+ width: ${({ $progress })=>$progress === null ? '25%' : `${$progress}%`};
24
+ animation: ${({ $progress })=>$progress === null ? slide : 'none'} 1.2s ease-in-out infinite;
25
+
26
+ @media (prefers-reduced-motion: reduce) {
27
+ animation: none;
28
+ }
29
+ `;
30
+ const UploadProgressBar = ({ progress, label })=>/*#__PURE__*/ jsxRuntime.jsx(Track, {
31
+ role: "progressbar",
32
+ "aria-label": label,
33
+ "aria-valuemin": 0,
34
+ "aria-valuemax": 100,
35
+ "aria-valuenow": progress ?? undefined,
36
+ children: /*#__PURE__*/ jsxRuntime.jsx(Fill, {
37
+ $progress: progress
38
+ })
39
+ });
40
+
41
+ exports.UploadProgressBar = UploadProgressBar;
42
+ //# sourceMappingURL=UploadProgressBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadProgressBar.js","sources":["../../../../admin/src/components/MediaLibraryInput/UploadProgressBar.tsx"],"sourcesContent":["import { keyframes, styled } from 'styled-components';\n\nconst slide = keyframes`\n from { transform: translateX(-100%); }\n to { transform: translateX(400%); }\n`;\n\nconst Track = styled.div`\n position: relative;\n width: 100%;\n height: 0.4rem;\n overflow: hidden;\n border-radius: 0.2rem;\n background: ${({ theme }) => theme.colors.primary200};\n`;\n\nconst Fill = styled.div<{ $progress: number | null }>`\n height: 100%;\n border-radius: inherit;\n background: ${({ theme }) => theme.colors.primary600};\n transition: width 0.2s linear;\n width: ${({ $progress }) => ($progress === null ? '25%' : `${$progress}%`)};\n animation: ${({ $progress }) => ($progress === null ? slide : 'none')} 1.2s ease-in-out infinite;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n`;\n\ninterface UploadProgressBarProps {\n /** 0–100, or `null` for an upload whose size is not known. */\n progress: number | null;\n label: string;\n}\n\nexport const UploadProgressBar = ({ progress, label }: UploadProgressBarProps) => (\n <Track\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress ?? undefined}\n >\n <Fill $progress={progress} />\n </Track>\n);\n"],"names":["slide","keyframes","Track","styled","div","theme","colors","primary200","Fill","primary600","$progress","UploadProgressBar","progress","label","_jsx","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","undefined"],"mappings":";;;;;AAEA,MAAMA,KAAAA,GAAQC,0BAAS;;;AAGvB,CAAC;AAED,MAAMC,KAAAA,GAAQC,uBAAAA,CAAOC,GAAG;;;;;;cAMV,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AACvD,CAAC;AAED,MAAMC,IAAAA,GAAOL,uBAAAA,CAAOC,GAAiC;;;cAGvC,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;AAE9C,SAAA,EAAE,CAAC,EAAEC,SAAS,EAAE,GAAMA,SAAAA,KAAc,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAGA,SAAAA,CAAU,CAAC,CAAC,CAAE;aAChE,EAAE,CAAC,EAAEA,SAAS,EAAE,GAAMA,SAAAA,KAAc,IAAA,GAAOV,QAAQ,MAAA,CAAQ;;;;;AAKxE,CAAC;AAQM,MAAMW,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAA0B,iBAC3EC,cAAA,CAACZ,KAAAA,EAAAA;QACCa,IAAAA,EAAK,aAAA;QACLC,YAAAA,EAAYH,KAAAA;QACZI,eAAAA,EAAe,CAAA;QACfC,eAAAA,EAAe,GAAA;AACfC,QAAAA,eAAAA,EAAeP,QAAAA,IAAYQ,SAAAA;AAE3B,QAAA,QAAA,gBAAAN,cAAA,CAACN,IAAAA,EAAAA;YAAKE,SAAAA,EAAWE;;AAEnB,KAAA;;;;"}
@@ -0,0 +1,40 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { keyframes, styled } from 'styled-components';
3
+
4
+ const slide = keyframes`
5
+ from { transform: translateX(-100%); }
6
+ to { transform: translateX(400%); }
7
+ `;
8
+ const Track = styled.div`
9
+ position: relative;
10
+ width: 100%;
11
+ height: 0.4rem;
12
+ overflow: hidden;
13
+ border-radius: 0.2rem;
14
+ background: ${({ theme })=>theme.colors.primary200};
15
+ `;
16
+ const Fill = styled.div`
17
+ height: 100%;
18
+ border-radius: inherit;
19
+ background: ${({ theme })=>theme.colors.primary600};
20
+ transition: width 0.2s linear;
21
+ width: ${({ $progress })=>$progress === null ? '25%' : `${$progress}%`};
22
+ animation: ${({ $progress })=>$progress === null ? slide : 'none'} 1.2s ease-in-out infinite;
23
+
24
+ @media (prefers-reduced-motion: reduce) {
25
+ animation: none;
26
+ }
27
+ `;
28
+ const UploadProgressBar = ({ progress, label })=>/*#__PURE__*/ jsx(Track, {
29
+ role: "progressbar",
30
+ "aria-label": label,
31
+ "aria-valuemin": 0,
32
+ "aria-valuemax": 100,
33
+ "aria-valuenow": progress ?? undefined,
34
+ children: /*#__PURE__*/ jsx(Fill, {
35
+ $progress: progress
36
+ })
37
+ });
38
+
39
+ export { UploadProgressBar };
40
+ //# sourceMappingURL=UploadProgressBar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadProgressBar.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/UploadProgressBar.tsx"],"sourcesContent":["import { keyframes, styled } from 'styled-components';\n\nconst slide = keyframes`\n from { transform: translateX(-100%); }\n to { transform: translateX(400%); }\n`;\n\nconst Track = styled.div`\n position: relative;\n width: 100%;\n height: 0.4rem;\n overflow: hidden;\n border-radius: 0.2rem;\n background: ${({ theme }) => theme.colors.primary200};\n`;\n\nconst Fill = styled.div<{ $progress: number | null }>`\n height: 100%;\n border-radius: inherit;\n background: ${({ theme }) => theme.colors.primary600};\n transition: width 0.2s linear;\n width: ${({ $progress }) => ($progress === null ? '25%' : `${$progress}%`)};\n animation: ${({ $progress }) => ($progress === null ? slide : 'none')} 1.2s ease-in-out infinite;\n\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n`;\n\ninterface UploadProgressBarProps {\n /** 0–100, or `null` for an upload whose size is not known. */\n progress: number | null;\n label: string;\n}\n\nexport const UploadProgressBar = ({ progress, label }: UploadProgressBarProps) => (\n <Track\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress ?? undefined}\n >\n <Fill $progress={progress} />\n </Track>\n);\n"],"names":["slide","keyframes","Track","styled","div","theme","colors","primary200","Fill","primary600","$progress","UploadProgressBar","progress","label","_jsx","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","undefined"],"mappings":";;;AAEA,MAAMA,KAAAA,GAAQC,SAAS;;;AAGvB,CAAC;AAED,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,GAAG;;;;;;cAMV,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AACvD,CAAC;AAED,MAAMC,IAAAA,GAAOL,MAAAA,CAAOC,GAAiC;;;cAGvC,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;AAE9C,SAAA,EAAE,CAAC,EAAEC,SAAS,EAAE,GAAMA,SAAAA,KAAc,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAGA,SAAAA,CAAU,CAAC,CAAC,CAAE;aAChE,EAAE,CAAC,EAAEA,SAAS,EAAE,GAAMA,SAAAA,KAAc,IAAA,GAAOV,QAAQ,MAAA,CAAQ;;;;;AAKxE,CAAC;AAQM,MAAMW,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAA0B,iBAC3EC,GAAA,CAACZ,KAAAA,EAAAA;QACCa,IAAAA,EAAK,aAAA;QACLC,YAAAA,EAAYH,KAAAA;QACZI,eAAAA,EAAe,CAAA;QACfC,eAAAA,EAAe,GAAA;AACfC,QAAAA,eAAAA,EAAeP,QAAAA,IAAYQ,SAAAA;AAE3B,QAAA,QAAA,gBAAAN,GAAA,CAACN,IAAAA,EAAAA;YAAKE,SAAAA,EAAWE;;AAEnB,KAAA;;;;"}