@strapi/upload 5.52.1 → 5.52.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/dist/admin/components/AssetCard/AssetCard.js +1 -0
  2. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  3. package/dist/admin/components/AssetCard/AssetCard.mjs +1 -0
  4. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  5. package/dist/admin/components/AssetCard/AssetCardBase.js +1 -0
  6. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -0
  8. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -0
  10. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  11. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -0
  12. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/UploadingAssetCard.js +1 -0
  14. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  15. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +1 -0
  16. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  17. package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -0
  18. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  19. package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -0
  20. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
  21. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -0
  22. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  23. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -0
  24. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  25. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -0
  26. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  27. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -0
  28. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  29. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -0
  30. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -0
  32. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  33. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -0
  34. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
  35. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -0
  36. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
  37. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -0
  38. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  39. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -0
  40. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  41. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -0
  42. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  43. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -0
  44. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  45. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +1 -0
  46. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  47. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +1 -0
  48. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  49. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -0
  50. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
  51. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -0
  52. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
  53. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +1 -0
  54. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
  55. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +1 -0
  56. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
  57. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -0
  58. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  59. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -0
  60. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -0
  62. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -0
  64. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  65. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -0
  66. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
  67. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -0
  68. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
  69. package/dist/admin/components/FilterList/FilterList.js +2 -2
  70. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  71. package/dist/admin/components/FilterList/FilterList.mjs +2 -2
  72. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  73. package/dist/admin/components/FilterPopover/FilterPopover.js +4 -4
  74. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  75. package/dist/admin/components/FilterPopover/FilterPopover.mjs +4 -4
  76. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  77. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +1 -0
  78. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  79. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +1 -0
  80. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  81. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -0
  82. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
  83. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -0
  84. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
  85. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +4 -10
  86. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  87. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +4 -10
  88. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  89. package/dist/admin/components/SortPicker/SortPicker.js +1 -0
  90. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  91. package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
  92. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  93. package/dist/admin/components/TableList/CellContent.js +1 -0
  94. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  95. package/dist/admin/components/TableList/CellContent.mjs +1 -0
  96. package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
  97. package/dist/admin/components/TableList/PreviewCell.js +1 -0
  98. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  99. package/dist/admin/components/TableList/PreviewCell.mjs +1 -0
  100. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  101. package/dist/admin/components/TableList/TableList.js +1 -0
  102. package/dist/admin/components/TableList/TableList.js.map +1 -1
  103. package/dist/admin/components/TableList/TableList.mjs +1 -0
  104. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  105. package/dist/admin/components/TableList/TableRows.js +1 -0
  106. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  107. package/dist/admin/components/TableList/TableRows.mjs +1 -0
  108. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  109. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -0
  110. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
  111. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -0
  112. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
  113. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +9 -21
  114. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  115. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +9 -21
  116. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  117. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -0
  118. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  119. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -0
  120. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  121. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -0
  122. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  123. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -0
  124. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  125. package/dist/admin/constants.js +1 -0
  126. package/dist/admin/constants.js.map +1 -1
  127. package/dist/admin/constants.mjs +1 -0
  128. package/dist/admin/constants.mjs.map +1 -1
  129. package/dist/admin/future/components/Drawer.js +11 -0
  130. package/dist/admin/future/components/Drawer.js.map +1 -1
  131. package/dist/admin/future/components/Drawer.mjs +11 -0
  132. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  133. package/dist/admin/future/components/UploadProgressDialog.js +82 -13
  134. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  135. package/dist/admin/future/components/UploadProgressDialog.mjs +84 -15
  136. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  137. package/dist/admin/future/hooks/useApiErrorMessage.js +61 -0
  138. package/dist/admin/future/hooks/useApiErrorMessage.js.map +1 -0
  139. package/dist/admin/future/hooks/useApiErrorMessage.mjs +39 -0
  140. package/dist/admin/future/hooks/useApiErrorMessage.mjs.map +1 -0
  141. package/dist/admin/future/pages/Assets/AssetsPage.js +11 -0
  142. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  143. package/dist/admin/future/pages/Assets/AssetsPage.mjs +11 -0
  144. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  145. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +8 -6
  146. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  147. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +8 -6
  148. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  149. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +70 -59
  150. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  151. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +72 -61
  152. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  153. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +7 -5
  154. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  155. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +7 -5
  156. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  157. package/dist/admin/future/pages/Assets/components/AssetsTable.js +47 -28
  158. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  159. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +48 -29
  160. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  161. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +87 -2
  162. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  163. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +89 -4
  164. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  165. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +3 -2
  166. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  167. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +3 -2
  168. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  169. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +4 -2
  170. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  171. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +4 -2
  172. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  173. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +21 -3
  174. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  175. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +21 -3
  176. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  177. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +4 -3
  178. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  179. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +5 -4
  180. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  181. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -2
  182. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  183. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -2
  184. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  185. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js +30 -0
  186. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -0
  187. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +26 -0
  188. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -0
  189. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +5 -5
  190. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -1
  191. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +6 -6
  192. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  193. package/dist/admin/future/pages/Assets/hooks/useListSort.js +10 -10
  194. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -1
  195. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +11 -11
  196. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -1
  197. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js +86 -0
  198. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js.map +1 -0
  199. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs +83 -0
  200. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs.map +1 -0
  201. package/dist/admin/future/pages/Assets/utils/renderedKeys.js +19 -0
  202. package/dist/admin/future/pages/Assets/utils/renderedKeys.js.map +1 -0
  203. package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs +17 -0
  204. package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs.map +1 -0
  205. package/dist/admin/future/services/api.js +131 -13
  206. package/dist/admin/future/services/api.js.map +1 -1
  207. package/dist/admin/future/services/api.mjs +133 -15
  208. package/dist/admin/future/services/api.mjs.map +1 -1
  209. package/dist/admin/future/services/uploadFileViaXHR.js +9 -3
  210. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
  211. package/dist/admin/future/services/uploadFileViaXHR.mjs +9 -3
  212. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
  213. package/dist/admin/future/store/uploadProgress.js +98 -6
  214. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  215. package/dist/admin/future/store/uploadProgress.mjs +94 -7
  216. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  217. package/dist/admin/future/utils/getApiErrorMessage.js +20 -0
  218. package/dist/admin/future/utils/getApiErrorMessage.js.map +1 -0
  219. package/dist/admin/future/utils/getApiErrorMessage.mjs +18 -0
  220. package/dist/admin/future/utils/getApiErrorMessage.mjs.map +1 -0
  221. package/dist/admin/index.js +1 -0
  222. package/dist/admin/index.js.map +1 -1
  223. package/dist/admin/index.mjs +1 -0
  224. package/dist/admin/index.mjs.map +1 -1
  225. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
  226. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  227. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
  228. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  229. package/dist/admin/pages/App/MediaLibrary.js +7 -9
  230. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  231. package/dist/admin/pages/App/MediaLibrary.mjs +8 -10
  232. package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
  233. package/dist/admin/pages/App/components/BulkActions.js +1 -0
  234. package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
  235. package/dist/admin/pages/App/components/BulkActions.mjs +1 -0
  236. package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
  237. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js +1 -0
  238. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
  239. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs +1 -0
  240. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
  241. package/dist/admin/pages/App/components/Filters.js +8 -8
  242. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  243. package/dist/admin/pages/App/components/Filters.mjs +9 -9
  244. package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
  245. package/dist/admin/pages/App/components/Header.js +1 -1
  246. package/dist/admin/pages/App/components/Header.js.map +1 -1
  247. package/dist/admin/pages/App/components/Header.mjs +2 -2
  248. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  249. package/dist/admin/src/future/hooks/useApiErrorMessage.d.ts +17 -0
  250. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +4 -1
  251. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +4 -1
  252. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
  253. package/dist/admin/src/future/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +18 -0
  254. package/dist/admin/src/future/pages/Assets/utils/mergeUploadedAssets.d.ts +35 -0
  255. package/dist/admin/src/future/pages/Assets/utils/renderedKeys.d.ts +19 -0
  256. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +6 -1
  257. package/dist/admin/src/future/store/uploadProgress.d.ts +67 -1
  258. package/dist/admin/src/future/utils/getApiErrorMessage.d.ts +1 -0
  259. package/dist/admin/src/utils/index.d.ts +1 -0
  260. package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
  261. package/dist/admin/src/utils/resolveFileMime.d.ts +13 -0
  262. package/dist/admin/translations/ca.json.js +1 -1
  263. package/dist/admin/translations/ca.json.mjs +1 -1
  264. package/dist/admin/translations/de.json.js +1 -1
  265. package/dist/admin/translations/de.json.mjs +1 -1
  266. package/dist/admin/translations/en.json.js +6 -2
  267. package/dist/admin/translations/en.json.js.map +1 -1
  268. package/dist/admin/translations/en.json.mjs +6 -2
  269. package/dist/admin/translations/en.json.mjs.map +1 -1
  270. package/dist/admin/translations/es.json.js +1 -1
  271. package/dist/admin/translations/es.json.mjs +1 -1
  272. package/dist/admin/translations/fr.json.js +1 -1
  273. package/dist/admin/translations/fr.json.mjs +1 -1
  274. package/dist/admin/translations/ja.json.js +1 -1
  275. package/dist/admin/translations/ja.json.mjs +1 -1
  276. package/dist/admin/translations/ko.json.js +1 -1
  277. package/dist/admin/translations/ko.json.mjs +1 -1
  278. package/dist/admin/translations/nl.json.js +1 -1
  279. package/dist/admin/translations/nl.json.mjs +1 -1
  280. package/dist/admin/translations/pl.json.js +1 -1
  281. package/dist/admin/translations/pl.json.mjs +1 -1
  282. package/dist/admin/translations/pt-BR.json.js +1 -1
  283. package/dist/admin/translations/pt-BR.json.mjs +1 -1
  284. package/dist/admin/translations/ru.json.js +1 -1
  285. package/dist/admin/translations/ru.json.mjs +1 -1
  286. package/dist/admin/translations/sk.json.js +1 -1
  287. package/dist/admin/translations/sk.json.mjs +1 -1
  288. package/dist/admin/translations/tr.json.js +1 -1
  289. package/dist/admin/translations/tr.json.mjs +1 -1
  290. package/dist/admin/translations/uk.json.js +1 -1
  291. package/dist/admin/translations/uk.json.mjs +1 -1
  292. package/dist/admin/translations/zh-Hans.json.js +1 -1
  293. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  294. package/dist/admin/translations/zh.json.js +1 -1
  295. package/dist/admin/translations/zh.json.mjs +1 -1
  296. package/dist/admin/utils/getFolderURL.js +2 -1
  297. package/dist/admin/utils/getFolderURL.js.map +1 -1
  298. package/dist/admin/utils/getFolderURL.mjs +2 -1
  299. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  300. package/dist/admin/utils/rawFileToAsset.js +5 -3
  301. package/dist/admin/utils/rawFileToAsset.js.map +1 -1
  302. package/dist/admin/utils/rawFileToAsset.mjs +5 -3
  303. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
  304. package/dist/admin/utils/resolveFileMime.js +69 -0
  305. package/dist/admin/utils/resolveFileMime.js.map +1 -0
  306. package/dist/admin/utils/resolveFileMime.mjs +64 -0
  307. package/dist/admin/utils/resolveFileMime.mjs.map +1 -0
  308. package/dist/admin/utils/urlsToAssets.js +8 -4
  309. package/dist/admin/utils/urlsToAssets.js.map +1 -1
  310. package/dist/admin/utils/urlsToAssets.mjs +8 -4
  311. package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
  312. package/dist/server/services/ai-metadata.js +25 -5
  313. package/dist/server/services/ai-metadata.js.map +1 -1
  314. package/dist/server/services/ai-metadata.mjs +1 -1
  315. package/dist/server/services/ai-metadata.mjs.map +1 -1
  316. package/dist/server/services/upload.js +4 -0
  317. package/dist/server/services/upload.js.map +1 -1
  318. package/dist/server/services/upload.mjs +4 -0
  319. package/dist/server/services/upload.mjs.map +1 -1
  320. package/dist/server/src/services/upload.d.ts.map +1 -1
  321. package/package.json +7 -7
  322. package/dist/admin/future/utils/getBulkMoveErrorMessage.js +0 -23
  323. package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +0 -1
  324. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +0 -21
  325. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +0 -1
  326. package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssetActionsMenu.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetActionsMenu.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Dialog,\n Flex,\n IconButton,\n Menu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ArrowRight, ArrowsCounterClockwise, Download, Link, More, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useReplaceAssetMutation } from '../../../services/assets';\nimport { downloadFile } from '../../../utils/downloadFile';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { assetKey } from '../utils/selection';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { DragFileData } from '../../../types/dnd';\n\ninterface AssetActionsMenuProps {\n asset: File;\n /** Drag data for this asset, so the move dialog validates against its real folder. */\n dragData: DragFileData;\n}\n\n/**\n * The \"...\" menu on an asset row/card. Always acts on that one asset, whatever\n * the current multi-selection is (the bulk actions bar is the selection-scoped\n * affordance) — the file mirror of `FolderActionsMenu`.\n *\n * Replace / copy link / download duplicate what the details drawer offers as\n * icon buttons, so the same action is one click away without opening the asset\n * first. They are re-implemented rather than lifted out of the drawer: the\n * drawer versions render as `IconButton`s and report through its in-drawer toast\n * slot, neither of which fits a menu item on a row.\n *\n * A successful move or delete deselects this one asset and leaves the rest of\n * the selection intact: the mutations only invalidate RTK tags, so without it an\n * `asset:<id>` key for a file that has been deleted — or has moved out of this\n * list — would linger. The other selected rows are untouched, which is the whole\n * point of the menu being a single-item affordance.\n */\nexport const AssetActionsMenu = ({ asset, dragData }: AssetActionsMenuProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n const { deselect } = useAssetSelection();\n // Absent in the asset picker and in unit tests: the replace still runs, it\n // just renders no row-level overlay.\n const markBusy = useBusyAssetsOptional()?.markBusy ?? (() => () => {});\n const {\n canUpdate,\n canDownload,\n canCopyLink,\n isLoading: isLoadingPermissions,\n } = useMediaLibraryPermissions();\n const [replaceAsset, { isLoading: isReplacing }] = useReplaceAssetMutation();\n const aiEnabled = useAIMetadataEnabled({ mime: asset.mime });\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isReplaceOpen, setIsReplaceOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Confirm first, then open the native picker, so the user only commits to\n // replacing after acknowledging the warning (same order as the drawer).\n const handleReplaceContinue = () => {\n setIsReplaceOpen(false);\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the native input so the same file can be picked again later.\n event.target.value = '';\n\n if (!file) {\n return;\n }\n\n // The menu has closed by the time the picker returns, so `isReplacing` has\n // nothing left to disable and the row would otherwise sit inert for the\n // whole upload. Marking the asset busy puts the same overlay the drawer\n // uses on the row/card, cleared when the mutation settles either way.\n const releaseBusy = markBusy(\n asset.id,\n formatMessage({\n id: getTranslationKey('asset-details.replace.loading'),\n defaultMessage: 'Replacing the file…',\n })\n );\n\n let res;\n try {\n res = await replaceAsset({ id: asset.id, file });\n } finally {\n releaseBusy();\n }\n\n if ('error' in res) {\n // `fetchBaseQuery` already unwraps the API envelope, so a server-sent\n // reason (file too large, unsupported type) lands directly on `message`.\n const { message } = res.error as { message?: string };\n toggleNotification({\n type: 'danger',\n message:\n message ??\n formatMessage({\n id: getTranslationKey('asset-details.replace.error'),\n defaultMessage: 'Failed to replace the file.',\n }),\n });\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.replace.success'),\n defaultMessage: 'File replaced.',\n }),\n });\n };\n\n const handleCopyLink = async () => {\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 handleDownload = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n\n if (!url) {\n return;\n }\n\n setIsDownloading(true);\n\n try {\n await downloadFile(url, asset.name);\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('asset-details.download.error'),\n defaultMessage: 'Failed to download the file.',\n }),\n });\n } finally {\n setIsDownloading(false);\n }\n };\n\n // Two permission-gated groups: replace/copy-link/download above, move/delete\n // below. The separator earns its place only when both survive the gate —\n // `canUpdate` alone puts Replace in the top group, which is not enough.\n const hasTopGroup = canUpdate || canCopyLink || canDownload;\n const hasBottomGroup = canUpdate;\n const showSeparator = (canCopyLink || canDownload) && hasBottomGroup;\n\n // A role can read the library while holding none of these, and an empty\n // popup is worse than no trigger at all. Every flag is `false` until the\n // RBAC check settles, so wait for it — otherwise the trigger unmounts and\n // remounts on first paint for everyone.\n if (!isLoadingPermissions && !hasTopGroup && !hasBottomGroup) {\n return null;\n }\n\n return (\n <>\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={false}\n onChange={handleFileChange}\n aria-hidden\n tabIndex={-1}\n />\n </VisuallyHidden>\n {/* Non-modal: Radix's default `modal` marks the rest of the document\n `aria-hidden` and blocks pointer events while the menu is open, so\n clicking a sibling row's trigger only dismissed this one — leaving\n every menu you touched to be closed one click at a time. Non-modal\n dismissal treats that click as both \"close this\" and \"open that\". */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* `ActionsMenuContent` replaces the design system's flat 15rem clamp\n with the height Radix actually measured, and un-hides the scrollbar\n it would otherwise overflow into. See that file for why. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n {canUpdate && (\n <Menu.Item\n startIcon={<ArrowsCounterClockwise />}\n disabled={isReplacing}\n onSelect={() => setIsReplaceOpen(true)}\n >\n {formatMessage({\n id: getTranslationKey('list.assets.actions.replace'),\n defaultMessage: 'Replace media',\n })}\n </Menu.Item>\n )}\n {canCopyLink && (\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.copy-link'),\n defaultMessage: 'Copy link to media',\n })}\n </Menu.Item>\n )}\n {canDownload && (\n <Menu.Item startIcon={<Download />} disabled={isDownloading} onSelect={handleDownload}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.download'),\n defaultMessage: 'Download media',\n })}\n </Menu.Item>\n )}\n {showSeparator && <Menu.Separator />}\n {canUpdate && (\n <>\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item\n startIcon={<Trash />}\n variant=\"danger\"\n onSelect={() => setIsDeleteOpen(true)}\n >\n {formatMessage({\n id: getTranslationKey('list.assets.actions.delete'),\n defaultMessage: 'Delete',\n })}\n </Menu.Item>\n </>\n )}\n </ActionsMenuContent>\n </Menu.Root>\n <Dialog.Root open={isReplaceOpen} onOpenChange={setIsReplaceOpen}>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.title'),\n defaultMessage: 'Replace this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body textAlign=\"center\">\n <Flex direction=\"column\" textAlign=\"center\">\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description'),\n defaultMessage: 'Current content will be permanently replaced.',\n })}\n </Typography>\n {aiEnabled ? (\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description.ai'),\n defaultMessage: 'AI will generate new metadata after upload.',\n })}\n </Typography>\n ) : null}\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"secondary\" onClick={handleReplaceContinue} fullWidth>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.continue'),\n defaultMessage: 'Continue',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect(assetKey(asset.id))}\n />\n )}\n {/* Both dialogs live inside the row, so a background refetch that drops the\n row would take an open dialog with it. Nothing invalidates until the\n mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [asset.id], folderIds: [] }}\n onSuccess={() => deselect(assetKey(asset.id))}\n />\n )}\n </>\n );\n};\n"],"names":["AssetActionsMenu","asset","dragData","formatMessage","useIntl","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelection","markBusy","useBusyAssetsOptional","canUpdate","canDownload","canCopyLink","isLoading","isLoadingPermissions","useMediaLibraryPermissions","replaceAsset","isReplacing","useReplaceAssetMutation","aiEnabled","useAIMetadataEnabled","mime","fileInputRef","useRef","isReplaceOpen","setIsReplaceOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","isDownloading","setIsDownloading","moveItems","useMemo","handleReplaceContinue","current","click","handleFileChange","event","file","target","files","value","releaseBusy","id","getTranslationKey","defaultMessage","res","message","error","type","handleCopyLink","url","prefixFileUrlWithBackendUrl","didCopy","handleDownload","downloadFile","name","hasTopGroup","hasBottomGroup","showSeparator","_jsxs","_Fragment","_jsx","VisuallyHidden","input","ref","multiple","onChange","aria-hidden","tabIndex","Menu","Root","modal","Trigger","tag","IconButton","icon","More","variant","label","ActionsMenuContent","popoverPlacement","zIndex","minWidth","Item","startIcon","ArrowsCounterClockwise","disabled","onSelect","Link","Download","Separator","ArrowRight","Trash","Dialog","open","onOpenChange","Content","Header","Body","textAlign","Flex","direction","Typography","Footer","Cancel","Button","fullWidth","Action","onClick","BulkMoveDialog","onClose","items","onSuccess","assetKey","DeleteItemsDialog","fileIds","folderIds"],"mappings":"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"}
1
+ {"version":3,"file":"AssetActionsMenu.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetActionsMenu.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Dialog,\n Flex,\n IconButton,\n Menu,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { ArrowRight, ArrowsCounterClockwise, Download, Link, More, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useApiErrorMessage } from '../../../hooks/useApiErrorMessage';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useReplaceAssetMutation } from '../../../services/assets';\nimport { downloadFile } from '../../../utils/downloadFile';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { assetKey } from '../utils/selection';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { DragFileData } from '../../../types/dnd';\n\ninterface AssetActionsMenuProps {\n asset: File;\n /** Drag data for this asset, so the move dialog validates against its real folder. */\n dragData: DragFileData;\n}\n\n/**\n * The \"...\" menu on an asset row/card. Always acts on that one asset, whatever\n * the current multi-selection is (the bulk actions bar is the selection-scoped\n * affordance) — the file mirror of `FolderActionsMenu`.\n *\n * Replace / copy link / download duplicate what the details drawer offers as\n * icon buttons, so the same action is one click away without opening the asset\n * first. They are re-implemented rather than lifted out of the drawer: the\n * drawer versions render as `IconButton`s and report through its in-drawer toast\n * slot, neither of which fits a menu item on a row.\n *\n * A successful move or delete deselects this one asset and leaves the rest of\n * the selection intact: the mutations only invalidate RTK tags, so without it an\n * `asset:<id>` key for a file that has been deleted — or has moved out of this\n * list — would linger. The other selected rows are untouched, which is the whole\n * point of the menu being a single-item affordance.\n */\nexport const AssetActionsMenu = ({ asset, dragData }: AssetActionsMenuProps) => {\n const { formatMessage } = useIntl();\n const getErrorMessage = useApiErrorMessage();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n const { deselect } = useAssetSelection();\n // Absent in the asset picker and in unit tests: the replace still runs, it\n // just renders no row-level overlay.\n const markBusy = useBusyAssetsOptional()?.markBusy ?? (() => () => {});\n const {\n canUpdate,\n canDownload,\n canCopyLink,\n isLoading: isLoadingPermissions,\n } = useMediaLibraryPermissions();\n const [replaceAsset, { isLoading: isReplacing }] = useReplaceAssetMutation();\n const aiEnabled = useAIMetadataEnabled({ mime: asset.mime });\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isReplaceOpen, setIsReplaceOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Confirm first, then open the native picker, so the user only commits to\n // replacing after acknowledging the warning (same order as the drawer).\n const handleReplaceContinue = () => {\n setIsReplaceOpen(false);\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the native input so the same file can be picked again later.\n event.target.value = '';\n\n if (!file) {\n return;\n }\n\n // The menu has closed by the time the picker returns, so `isReplacing` has\n // nothing left to disable and the row would otherwise sit inert for the\n // whole upload. Marking the asset busy puts the same overlay the drawer\n // uses on the row/card, cleared when the mutation settles either way.\n const releaseBusy = markBusy(\n asset.id,\n formatMessage({\n id: getTranslationKey('asset-details.replace.loading'),\n defaultMessage: 'Replacing the file…',\n })\n );\n\n let res;\n try {\n res = await replaceAsset({ id: asset.id, file, fileInfo: { name: asset.name } });\n } finally {\n releaseBusy();\n }\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.replace.error'),\n defaultMessage: 'Failed to replace the file.',\n })\n ),\n });\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.replace.success'),\n defaultMessage: 'File replaced.',\n }),\n });\n };\n\n const handleCopyLink = async () => {\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 handleDownload = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n\n if (!url) {\n return;\n }\n\n setIsDownloading(true);\n\n try {\n await downloadFile(url, asset.name);\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('asset-details.download.error'),\n defaultMessage: 'Failed to download the file.',\n }),\n });\n } finally {\n setIsDownloading(false);\n }\n };\n\n // Two permission-gated groups: replace/copy-link/download above, move/delete\n // below. The separator earns its place only when both survive the gate —\n // `canUpdate` alone puts Replace in the top group, which is not enough.\n const hasTopGroup = canUpdate || canCopyLink || canDownload;\n const hasBottomGroup = canUpdate;\n const showSeparator = (canCopyLink || canDownload) && hasBottomGroup;\n\n // A role can read the library while holding none of these, and an empty\n // popup is worse than no trigger at all. Every flag is `false` until the\n // RBAC check settles, so wait for it — otherwise the trigger unmounts and\n // remounts on first paint for everyone.\n if (!isLoadingPermissions && !hasTopGroup && !hasBottomGroup) {\n return null;\n }\n\n return (\n <>\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={false}\n onChange={handleFileChange}\n aria-hidden\n tabIndex={-1}\n />\n </VisuallyHidden>\n {/* Non-modal: Radix's default `modal` marks the rest of the document\n `aria-hidden` and blocks pointer events while the menu is open, so\n clicking a sibling row's trigger only dismissed this one — leaving\n every menu you touched to be closed one click at a time. Non-modal\n dismissal treats that click as both \"close this\" and \"open that\". */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* `ActionsMenuContent` replaces the design system's flat 15rem clamp\n with the height Radix actually measured, and un-hides the scrollbar\n it would otherwise overflow into. See that file for why. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n {canUpdate && (\n <Menu.Item\n startIcon={<ArrowsCounterClockwise />}\n disabled={isReplacing}\n onSelect={() => setIsReplaceOpen(true)}\n >\n {formatMessage({\n id: getTranslationKey('list.assets.actions.replace'),\n defaultMessage: 'Replace media',\n })}\n </Menu.Item>\n )}\n {canCopyLink && (\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.copy-link'),\n defaultMessage: 'Copy link to media',\n })}\n </Menu.Item>\n )}\n {canDownload && (\n <Menu.Item startIcon={<Download />} disabled={isDownloading} onSelect={handleDownload}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.download'),\n defaultMessage: 'Download media',\n })}\n </Menu.Item>\n )}\n {showSeparator && <Menu.Separator />}\n {canUpdate && (\n <>\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.assets.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item\n startIcon={<Trash />}\n variant=\"danger\"\n onSelect={() => setIsDeleteOpen(true)}\n >\n {formatMessage({\n id: getTranslationKey('list.assets.actions.delete'),\n defaultMessage: 'Delete',\n })}\n </Menu.Item>\n </>\n )}\n </ActionsMenuContent>\n </Menu.Root>\n <Dialog.Root open={isReplaceOpen} onOpenChange={setIsReplaceOpen}>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.title'),\n defaultMessage: 'Replace this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body textAlign=\"center\">\n <Flex direction=\"column\" textAlign=\"center\">\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description'),\n defaultMessage: 'Current content will be permanently replaced.',\n })}\n </Typography>\n {aiEnabled ? (\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description.ai'),\n defaultMessage: 'AI will generate new metadata after upload.',\n })}\n </Typography>\n ) : null}\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"secondary\" onClick={handleReplaceContinue} fullWidth>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.continue'),\n defaultMessage: 'Continue',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect(assetKey(asset.id))}\n />\n )}\n {/* Both dialogs live inside the row, so a background refetch that drops the\n row would take an open dialog with it. Nothing invalidates until the\n mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [asset.id], folderIds: [] }}\n onSuccess={() => deselect(assetKey(asset.id))}\n />\n )}\n </>\n );\n};\n"],"names":["AssetActionsMenu","asset","dragData","formatMessage","useIntl","getErrorMessage","useApiErrorMessage","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelection","markBusy","useBusyAssetsOptional","canUpdate","canDownload","canCopyLink","isLoading","isLoadingPermissions","useMediaLibraryPermissions","replaceAsset","isReplacing","useReplaceAssetMutation","aiEnabled","useAIMetadataEnabled","mime","fileInputRef","useRef","isReplaceOpen","setIsReplaceOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","isDownloading","setIsDownloading","moveItems","useMemo","handleReplaceContinue","current","click","handleFileChange","event","file","target","files","value","releaseBusy","id","getTranslationKey","defaultMessage","res","fileInfo","name","type","message","error","handleCopyLink","url","prefixFileUrlWithBackendUrl","didCopy","handleDownload","downloadFile","hasTopGroup","hasBottomGroup","showSeparator","_jsxs","_Fragment","_jsx","VisuallyHidden","input","ref","multiple","onChange","aria-hidden","tabIndex","Menu","Root","modal","Trigger","tag","IconButton","icon","More","variant","label","ActionsMenuContent","popoverPlacement","zIndex","minWidth","Item","startIcon","ArrowsCounterClockwise","disabled","onSelect","Link","Download","Separator","ArrowRight","Trash","Dialog","open","onOpenChange","Content","Header","Body","textAlign","Flex","direction","Typography","Footer","Cancel","Button","fullWidth","Action","onClick","BulkMoveDialog","onClose","items","onSuccess","assetKey","DeleteItemsDialog","fileIds","folderIds"],"mappings":"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"}
@@ -10,6 +10,7 @@ var styledComponents = require('styled-components');
10
10
  var enums = require('../../../../../enums.js');
11
11
  var Drawer = require('../../../../components/Drawer.js');
12
12
  var useAIMetadataEnabled = require('../../../../hooks/useAIMetadataEnabled.js');
13
+ var useApiErrorMessage = require('../../../../hooks/useApiErrorMessage.js');
13
14
  var useMediaLibraryPermissions = require('../../../../hooks/useMediaLibraryPermissions.js');
14
15
  var useTracking = require('../../../../hooks/useTracking.js');
15
16
  var api = require('../../../../services/api.js');
@@ -20,6 +21,7 @@ var files = require('../../../../utils/files.js');
20
21
  var getAssetIcon = require('../../../../utils/getAssetIcon.js');
21
22
  var translations = require('../../../../utils/translations.js');
22
23
  var useFolderInfo = require('../../hooks/useFolderInfo.js');
24
+ var useIsAssetDetailsOpen = require('../../hooks/useIsAssetDetailsOpen.js');
23
25
  var BusyOverlay = require('../BusyOverlay.js');
24
26
  var AssetCropEditor = require('./AssetCropEditor.js');
25
27
  var AssetPreview = require('./AssetPreview.js');
@@ -44,8 +46,6 @@ function _interopNamespace(e) {
44
46
 
45
47
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
46
48
 
47
- // Name of the parameter to look for in the URL to open the drawer
48
- const URL_PARAM = 'assetId';
49
49
  const DrawerNotifyContext = /*#__PURE__*/ React__namespace.createContext(null);
50
50
  const useDrawerNotify = ()=>{
51
51
  const ctx = React__namespace.useContext(DrawerNotifyContext);
@@ -63,12 +63,11 @@ const useAssetOperation = ()=>{
63
63
  return ctx;
64
64
  };
65
65
  /* -------------------------------------------------------------------------------------------------
66
- * useAssetDetailsParam - sync drawer visibility with URL ?{URL_PARAM}={id}
66
+ * useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}
67
67
  * -----------------------------------------------------------------------------------------------*/ const useAssetDetailsParam = ()=>{
68
68
  const [{ query }, setQuery] = strapiAdmin.useQueryParams();
69
- const detailsId = query?.[URL_PARAM];
70
- const assetId = detailsId ? parseInt(detailsId, 10) : null;
71
- const hasValidId = assetId !== null && !Number.isNaN(assetId);
69
+ const assetId = useIsAssetDetailsOpen.parseAssetDetailsId(query?.[useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]);
70
+ const hasValidId = assetId !== null;
72
71
  // Closing is driven by removing the URL param (a navigation), so navigation
73
72
  // guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the
74
73
  // tree through the slide-out: it stays true once opened and only flips false
@@ -94,17 +93,19 @@ const useAssetOperation = ()=>{
94
93
  hasValidId
95
94
  ]);
96
95
  const openDetails = React__namespace.useCallback((id)=>{
97
- setQuery({
98
- [URL_PARAM]: String(id)
99
- }, 'push', true);
96
+ setQuery(strapiAdmin.withEncodedUserParams(query, {
97
+ [useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]: String(id)
98
+ }), 'push', true);
100
99
  }, [
100
+ query,
101
101
  setQuery
102
102
  ]);
103
103
  const closeDetails = React__namespace.useCallback(()=>{
104
- setQuery({
105
- [URL_PARAM]: undefined
106
- }, 'remove', true);
104
+ setQuery(strapiAdmin.withEncodedUserParams(query, {
105
+ [useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]: undefined
106
+ }), 'push', true);
107
107
  }, [
108
+ query,
108
109
  setQuery
109
110
  ]);
110
111
  return {
@@ -308,7 +309,6 @@ const LocationField = ({ label, rootLabel, folders, disabled })=>{
308
309
  children: [
309
310
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Trigger, {
310
311
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
311
- withTooltip: false,
312
312
  label: triggerLabel,
313
313
  variant: "danger-light",
314
314
  children: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {})
@@ -386,7 +386,6 @@ const CopyLinkButton = ({ asset })=>{
386
386
  });
387
387
  };
388
388
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
389
- withTooltip: false,
390
389
  label: formatMessage({
391
390
  id: translations.getTranslationKey('asset-details.copy-link.trigger'),
392
391
  defaultMessage: 'Copy link'
@@ -419,7 +418,6 @@ const DownloadAssetButton = ({ asset })=>{
419
418
  }
420
419
  };
421
420
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
422
- withTooltip: false,
423
421
  label: formatMessage({
424
422
  id: translations.getTranslationKey('asset-details.download.trigger'),
425
423
  defaultMessage: 'Download'
@@ -463,6 +461,7 @@ const ReplaceAssetButton = ({ mime })=>{
463
461
  children: /*#__PURE__*/ jsxRuntime.jsx("input", {
464
462
  ref: fileInputRef,
465
463
  type: "file",
464
+ accept: mime ?? '',
466
465
  multiple: false,
467
466
  onChange: handleFileChange,
468
467
  "aria-hidden": true,
@@ -470,7 +469,6 @@ const ReplaceAssetButton = ({ mime })=>{
470
469
  })
471
470
  }),
472
471
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
473
- withTooltip: false,
474
472
  label: formatMessage({
475
473
  id: translations.getTranslationKey('asset-details.replace.trigger'),
476
474
  defaultMessage: 'Replace this file'
@@ -545,32 +543,27 @@ const ReplaceAssetButton = ({ mime })=>{
545
543
  ]
546
544
  });
547
545
  };
548
- const AssetImageActions = ({ onCrop, mime })=>{
546
+ const AssetImageActions = ({ onCrop })=>{
549
547
  const { formatMessage } = reactIntl.useIntl();
550
548
  const isSubmitting = strapiAdmin.useForm('AssetImageActions', (state)=>state.isSubmitting);
551
- return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
549
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
552
550
  direction: "column",
553
551
  gap: 2,
554
- children: [
555
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
556
- withTooltip: false,
557
- label: formatMessage({
558
- id: translations.getTranslationKey('asset-details.crop.trigger'),
559
- defaultMessage: 'Crop'
560
- }),
561
- variant: "tertiary",
562
- onClick: onCrop,
563
- disabled: isSubmitting || !onCrop,
564
- children: /*#__PURE__*/ jsxRuntime.jsx(icons.Crop, {})
552
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
553
+ label: formatMessage({
554
+ id: translations.getTranslationKey('asset-details.crop.trigger'),
555
+ defaultMessage: 'Crop'
565
556
  }),
566
- /*#__PURE__*/ jsxRuntime.jsx(ReplaceAssetButton, {
567
- mime: mime
568
- })
569
- ]
557
+ variant: "tertiary",
558
+ onClick: onCrop,
559
+ disabled: isSubmitting || !onCrop,
560
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Crop, {})
561
+ })
570
562
  });
571
563
  };
572
564
  const AssetDetails = ({ asset, closeDetails })=>{
573
565
  const { formatMessage, formatDate } = reactIntl.useIntl();
566
+ const getErrorMessage = useApiErrorMessage.useApiErrorMessage();
574
567
  const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions.useMediaLibraryPermissions();
575
568
  const { data: folders$1 = [] } = folders.useGetAllFoldersQuery();
576
569
  const { toggleNotification } = strapiAdmin.useNotification();
@@ -613,10 +606,10 @@ const AssetDetails = ({ asset, closeDetails })=>{
613
606
  if ('error' in res) {
614
607
  notify({
615
608
  type: 'danger',
616
- message: formatMessage({
609
+ message: getErrorMessage(res.error, formatMessage({
617
610
  id: translations.getTranslationKey('asset-details.update.error'),
618
611
  defaultMessage: 'Failed to update the file.'
619
- })
612
+ }))
620
613
  });
621
614
  return;
622
615
  }
@@ -639,17 +632,18 @@ const AssetDetails = ({ asset, closeDetails })=>{
639
632
  const handleReplace = React__namespace.useCallback(async (file)=>{
640
633
  const res = await replaceMutation({
641
634
  id: asset.id,
642
- file
635
+ file,
636
+ fileInfo: {
637
+ name: asset.name
638
+ }
643
639
  });
644
640
  if ('error' in res) {
645
- const error = res.error;
646
- const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
647
- id: translations.getTranslationKey('asset-details.replace.error'),
648
- defaultMessage: 'Failed to replace the file.'
649
- });
650
641
  notify({
651
642
  type: 'danger',
652
- message
643
+ message: getErrorMessage(res.error, formatMessage({
644
+ id: translations.getTranslationKey('asset-details.replace.error'),
645
+ defaultMessage: 'Failed to replace the file.'
646
+ }))
653
647
  });
654
648
  return;
655
649
  }
@@ -665,7 +659,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
665
659
  });
666
660
  }, [
667
661
  asset.id,
662
+ asset.name,
668
663
  formatMessage,
664
+ getErrorMessage,
669
665
  notify,
670
666
  replaceMutation,
671
667
  trackUsage
@@ -675,14 +671,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
675
671
  const handleDelete = React__namespace.useCallback(async ()=>{
676
672
  const res = await deleteMutation(asset.id);
677
673
  if ('error' in res) {
678
- const error = res.error;
679
- const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
680
- id: translations.getTranslationKey('asset-details.delete.error'),
681
- defaultMessage: 'Failed to delete the asset.'
682
- });
683
674
  notify({
684
675
  type: 'danger',
685
- message
676
+ message: getErrorMessage(res.error, formatMessage({
677
+ id: translations.getTranslationKey('asset-details.delete.error'),
678
+ defaultMessage: 'Failed to delete the asset.'
679
+ }))
686
680
  });
687
681
  return;
688
682
  }
@@ -702,16 +696,17 @@ const AssetDetails = ({ asset, closeDetails })=>{
702
696
  deleteMutation,
703
697
  folderName,
704
698
  formatMessage,
699
+ getErrorMessage,
705
700
  notify,
706
701
  toggleNotification
707
702
  ]);
708
- const notifyCropError = ()=>{
703
+ const notifyCropError = (error)=>{
709
704
  notify({
710
705
  type: 'danger',
711
- message: formatMessage({
706
+ message: getErrorMessage(error, formatMessage({
712
707
  id: translations.getTranslationKey('asset-details.crop.error'),
713
708
  defaultMessage: 'Failed to crop the file.'
714
- })
709
+ }))
715
710
  });
716
711
  };
717
712
  // Apply: replace the original binary with the cropped file + focal point.
@@ -727,7 +722,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
727
722
  }
728
723
  });
729
724
  if ('error' in res) {
730
- notifyCropError();
725
+ notifyCropError(res.error);
731
726
  return;
732
727
  }
733
728
  trackUsage('didCropFile', {
@@ -758,7 +753,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
758
753
  }
759
754
  });
760
755
  if ('error' in res) {
761
- notifyCropError();
756
+ notifyCropError(res.error);
762
757
  return;
763
758
  }
764
759
  trackUsage('didCropFile', {
@@ -833,8 +828,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
833
828
  /*#__PURE__*/ jsxRuntime.jsx(AssetPreview.AssetPreview, {
834
829
  asset: asset,
835
830
  actions: isImage && canUpdate ? /*#__PURE__*/ jsxRuntime.jsx(AssetImageActions, {
836
- onCrop: ()=>setIsCropOpen(true),
837
- mime: asset.mime
831
+ onCrop: ()=>setIsCropOpen(true)
838
832
  }) : null
839
833
  }),
840
834
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
@@ -987,6 +981,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
987
981
  }),
988
982
  canDownload && /*#__PURE__*/ jsxRuntime.jsx(DownloadAssetButton, {
989
983
  asset: asset
984
+ }),
985
+ canUpdate && /*#__PURE__*/ jsxRuntime.jsx(ReplaceAssetButton, {
986
+ mime: asset.mime
990
987
  })
991
988
  ]
992
989
  }),
@@ -1011,6 +1008,18 @@ const AssetDetails = ({ asset, closeDetails })=>{
1011
1008
  })
1012
1009
  }));
1013
1010
  };
1011
+ /* -------------------------------------------------------------------------------------------------
1012
+ * DrawerHeader
1013
+ * -----------------------------------------------------------------------------------------------*/ /**
1014
+ * The icon's size lives in SVG attributes, which flex is free to override, so a
1015
+ * long asset name would squash it. Matches the grid and table rows, where the
1016
+ * file-type icon is shrink-proof and the name is what truncates.
1017
+ */ const HeaderIcon = styledComponents.styled(designSystem.Flex)`
1018
+ flex-shrink: 0;
1019
+ `;
1020
+ const HeaderTitle = styledComponents.styled(designSystem.Typography)`
1021
+ min-width: 0;
1022
+ `;
1014
1023
  const DrawerHeader = ({ asset, closeDetails })=>{
1015
1024
  const DocIcon = asset ? getAssetIcon.getAssetIcon(asset.mime, asset.ext) : icons.FileError;
1016
1025
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
@@ -1023,13 +1032,15 @@ const DrawerHeader = ({ asset, closeDetails })=>{
1023
1032
  borderStyle: "solid",
1024
1033
  borderWidth: "0 0 1px 0",
1025
1034
  children: [
1026
- /*#__PURE__*/ jsxRuntime.jsx(DocIcon, {
1027
- width: 20,
1028
- height: 20
1035
+ /*#__PURE__*/ jsxRuntime.jsx(HeaderIcon, {
1036
+ children: /*#__PURE__*/ jsxRuntime.jsx(DocIcon, {
1037
+ width: 20,
1038
+ height: 20
1039
+ })
1029
1040
  }),
1030
1041
  /*#__PURE__*/ jsxRuntime.jsx(Drawer.Drawer.Title, {
1031
1042
  asChild: true,
1032
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1043
+ children: /*#__PURE__*/ jsxRuntime.jsx(HeaderTitle, {
1033
1044
  variant: "omega",
1034
1045
  fontWeight: "semiBold",
1035
1046
  overflow: "hidden",