@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
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Merges just-uploaded assets into the loaded asset list so each one appears as
3
+ * soon as its own upload finishes, rather than when the whole batch settles.
4
+ *
5
+ * The upload is one mutation per batch, so its cache invalidation fires once at
6
+ * the end. These helpers bridge that gap purely client-side: the completed
7
+ * uploads already sit in the progress store as full `File` objects, so they can
8
+ * be placed into the list at their sort position with no extra request.
9
+ *
10
+ * The server list stays authoritative — merging never reorders it, and an id it
11
+ * already contains wins over the local copy, so the end-of-batch refetch
12
+ * silently takes over.
13
+ */ const SORT_FIELDS = [
14
+ 'createdAt',
15
+ 'updatedAt',
16
+ 'name',
17
+ 'size'
18
+ ];
19
+ const isSortField = (value)=>SORT_FIELDS.includes(value);
20
+ const DEFAULT_RULE = 'updatedAt:DESC';
21
+ const compareByField = (field, a, b)=>{
22
+ if (field === 'size') {
23
+ return (a.size ?? 0) - (b.size ?? 0);
24
+ }
25
+ if (field === 'name') {
26
+ return a.name.localeCompare(b.name);
27
+ }
28
+ // `createdAt` / `updatedAt` are ISO-8601, which sorts correctly as text.
29
+ return (a[field] ?? '').localeCompare(b[field] ?? '');
30
+ };
31
+ /**
32
+ * Comparator matching a `<field>:<ASC|DESC>` sort rule, as sent to the API.
33
+ *
34
+ * Ties break on id so the order is total: without it, two files sharing a
35
+ * timestamp could swap places between renders.
36
+ */ const getAssetComparator = (rule = DEFAULT_RULE)=>{
37
+ const [field, requestedDirection] = rule.split(':');
38
+ // An unrecognised field discards the direction too: half-applying a rule we
39
+ // cannot read would order the list differently from the default it stands in for.
40
+ const isKnownField = isSortField(field);
41
+ const sortField = isKnownField ? field : 'updatedAt';
42
+ const direction = isKnownField ? requestedDirection : 'DESC';
43
+ const sign = direction === 'ASC' ? 1 : -1;
44
+ return (a, b)=>{
45
+ const byField = compareByField(sortField, a, b);
46
+ return byField !== 0 ? sign * byField : sign * (a.id - b.id);
47
+ };
48
+ };
49
+ /**
50
+ * Places `uploaded` into `assets` at their sort position.
51
+ *
52
+ * An upload that sorts past everything loaded is dropped unless the list is
53
+ * fully loaded: it belongs on a page the user has not reached, and appending it
54
+ * would show it adjacent to the last loaded item instead of at its real place.
55
+ */ const mergeUploadedAssets = ({ assets, uploaded, sort, hasNextPage })=>{
56
+ if (uploaded.length === 0) {
57
+ return assets;
58
+ }
59
+ const loadedIds = new Set(assets.map((asset)=>asset.id));
60
+ const compare = getAssetComparator(sort);
61
+ const fresh = uploaded.filter((asset)=>!loadedIds.has(asset.id)).sort(compare);
62
+ if (fresh.length === 0) {
63
+ return assets;
64
+ }
65
+ const merged = [
66
+ ...assets
67
+ ];
68
+ for (const asset of fresh){
69
+ const at = merged.findIndex((loaded)=>compare(asset, loaded) < 0);
70
+ if (at === -1) {
71
+ if (hasNextPage) {
72
+ continue;
73
+ }
74
+ merged.push(asset);
75
+ } else {
76
+ merged.splice(at, 0, asset);
77
+ }
78
+ }
79
+ return merged;
80
+ };
81
+
82
+ export { getAssetComparator, mergeUploadedAssets };
83
+ //# sourceMappingURL=mergeUploadedAssets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeUploadedAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/utils/mergeUploadedAssets.ts"],"sourcesContent":["/**\n * Merges just-uploaded assets into the loaded asset list so each one appears as\n * soon as its own upload finishes, rather than when the whole batch settles.\n *\n * The upload is one mutation per batch, so its cache invalidation fires once at\n * the end. These helpers bridge that gap purely client-side: the completed\n * uploads already sit in the progress store as full `File` objects, so they can\n * be placed into the list at their sort position with no extra request.\n *\n * The server list stays authoritative — merging never reorders it, and an id it\n * already contains wins over the local copy, so the end-of-batch refetch\n * silently takes over.\n */\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\ntype SortField = 'createdAt' | 'updatedAt' | 'name' | 'size';\n\nconst SORT_FIELDS: SortField[] = ['createdAt', 'updatedAt', 'name', 'size'];\n\nconst isSortField = (value: string): value is SortField =>\n (SORT_FIELDS as string[]).includes(value);\n\nconst DEFAULT_RULE = 'updatedAt:DESC';\n\nconst compareByField = (field: SortField, a: File, b: File): number => {\n if (field === 'size') {\n return (a.size ?? 0) - (b.size ?? 0);\n }\n\n if (field === 'name') {\n return a.name.localeCompare(b.name);\n }\n\n // `createdAt` / `updatedAt` are ISO-8601, which sorts correctly as text.\n return (a[field] ?? '').localeCompare(b[field] ?? '');\n};\n\n/**\n * Comparator matching a `<field>:<ASC|DESC>` sort rule, as sent to the API.\n *\n * Ties break on id so the order is total: without it, two files sharing a\n * timestamp could swap places between renders.\n */\nexport const getAssetComparator = (rule: string = DEFAULT_RULE) => {\n const [field, requestedDirection] = rule.split(':');\n // An unrecognised field discards the direction too: half-applying a rule we\n // cannot read would order the list differently from the default it stands in for.\n const isKnownField = isSortField(field);\n const sortField: SortField = isKnownField ? field : 'updatedAt';\n const direction = isKnownField ? requestedDirection : 'DESC';\n const sign = direction === 'ASC' ? 1 : -1;\n\n return (a: File, b: File): number => {\n const byField = compareByField(sortField, a, b);\n\n return byField !== 0 ? sign * byField : sign * (a.id - b.id);\n };\n};\n\n/**\n * Places `uploaded` into `assets` at their sort position.\n *\n * An upload that sorts past everything loaded is dropped unless the list is\n * fully loaded: it belongs on a page the user has not reached, and appending it\n * would show it adjacent to the last loaded item instead of at its real place.\n */\nexport const mergeUploadedAssets = ({\n assets,\n uploaded,\n sort,\n hasNextPage,\n}: {\n assets: File[];\n uploaded: File[];\n sort?: string;\n /** Whether more pages remain, i.e. the tail of the list is not loaded. */\n hasNextPage: boolean;\n}): File[] => {\n if (uploaded.length === 0) {\n return assets;\n }\n\n const loadedIds = new Set(assets.map((asset) => asset.id));\n const compare = getAssetComparator(sort);\n const fresh = uploaded.filter((asset) => !loadedIds.has(asset.id)).sort(compare);\n\n if (fresh.length === 0) {\n return assets;\n }\n\n const merged = [...assets];\n\n for (const asset of fresh) {\n const at = merged.findIndex((loaded) => compare(asset, loaded) < 0);\n\n if (at === -1) {\n if (hasNextPage) {\n continue;\n }\n merged.push(asset);\n } else {\n merged.splice(at, 0, asset);\n }\n }\n\n return merged;\n};\n"],"names":["SORT_FIELDS","isSortField","value","includes","DEFAULT_RULE","compareByField","field","a","b","size","name","localeCompare","getAssetComparator","rule","requestedDirection","split","isKnownField","sortField","direction","sign","byField","id","mergeUploadedAssets","assets","uploaded","sort","hasNextPage","length","loadedIds","Set","map","asset","compare","fresh","filter","has","merged","at","findIndex","loaded","push","splice"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var selection = require('./selection.js');
4
+
5
+ /**
6
+ * The keys of the items actually on screen, in render order.
7
+ *
8
+ * Single source for every consumer of the rendered set — range selection,
9
+ * select-all and the bulk action bar. Derived once so they cannot disagree:
10
+ * in "Folders: Mixed with files" the rows come from `mergeMixedList`, which
11
+ * withholds folders sorting after the last loaded asset, so `folders` is not
12
+ * the rendered folder set.
13
+ */ const buildRenderedKeys = ({ folders, assets, mixedItems })=>mixedItems ? mixedItems.map((item)=>item.kind === 'folder' ? selection.folderKey(item.folder.id) : selection.assetKey(item.asset.id)) : [
14
+ ...folders.map((folder)=>selection.folderKey(folder.id)),
15
+ ...assets.map((asset)=>selection.assetKey(asset.id))
16
+ ];
17
+
18
+ exports.buildRenderedKeys = buildRenderedKeys;
19
+ //# sourceMappingURL=renderedKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderedKeys.js","sources":["../../../../../../admin/src/future/pages/Assets/utils/renderedKeys.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from './selection';\n\nimport type { MixedItem } from './mergeMixedList';\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/**\n * The keys of the items actually on screen, in render order.\n *\n * Single source for every consumer of the rendered set — range selection,\n * select-all and the bulk action bar. Derived once so they cannot disagree:\n * in \"Folders: Mixed with files\" the rows come from `mergeMixedList`, which\n * withholds folders sorting after the last loaded asset, so `folders` is not\n * the rendered folder set.\n */\nexport const buildRenderedKeys = ({\n folders,\n assets,\n mixedItems,\n}: {\n folders: Folder[];\n assets: File[];\n /** The interleaved rows, when the table is in mixed mode. */\n mixedItems?: MixedItem[] | null;\n}): ItemKey[] =>\n mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n"],"names":["buildRenderedKeys","folders","assets","mixedItems","map","item","kind","folderKey","folder","id","assetKey","asset"],"mappings":";;;;AAMA;;;;;;;;AAQC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,OAAO,EACPC,MAAM,EACNC,UAAU,EAMX,GACCA,UAAAA,GACIA,WAAWC,GAAG,CAAC,CAACC,IAAAA,GACdA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWC,oBAAUF,IAAAA,CAAKG,MAAM,CAACC,EAAE,IAAIC,kBAAAA,CAASL,IAAAA,CAAKM,KAAK,CAACF,EAAE,CAAA,CAAA,GAE7E;AACKR,QAAAA,GAAAA,OAAAA,CAAQG,GAAG,CAAC,CAACI,MAAAA,GAAWD,mBAAAA,CAAUC,OAAOC,EAAE,CAAA,CAAA;AAC3CP,QAAAA,GAAAA,MAAAA,CAAOE,GAAG,CAAC,CAACO,KAAAA,GAAUD,kBAAAA,CAASC,MAAMF,EAAE,CAAA;;;;;"}
@@ -0,0 +1,17 @@
1
+ import { folderKey, assetKey } from './selection.mjs';
2
+
3
+ /**
4
+ * The keys of the items actually on screen, in render order.
5
+ *
6
+ * Single source for every consumer of the rendered set — range selection,
7
+ * select-all and the bulk action bar. Derived once so they cannot disagree:
8
+ * in "Folders: Mixed with files" the rows come from `mergeMixedList`, which
9
+ * withholds folders sorting after the last loaded asset, so `folders` is not
10
+ * the rendered folder set.
11
+ */ const buildRenderedKeys = ({ folders, assets, mixedItems })=>mixedItems ? mixedItems.map((item)=>item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)) : [
12
+ ...folders.map((folder)=>folderKey(folder.id)),
13
+ ...assets.map((asset)=>assetKey(asset.id))
14
+ ];
15
+
16
+ export { buildRenderedKeys };
17
+ //# sourceMappingURL=renderedKeys.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderedKeys.mjs","sources":["../../../../../../admin/src/future/pages/Assets/utils/renderedKeys.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from './selection';\n\nimport type { MixedItem } from './mergeMixedList';\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/**\n * The keys of the items actually on screen, in render order.\n *\n * Single source for every consumer of the rendered set — range selection,\n * select-all and the bulk action bar. Derived once so they cannot disagree:\n * in \"Folders: Mixed with files\" the rows come from `mergeMixedList`, which\n * withholds folders sorting after the last loaded asset, so `folders` is not\n * the rendered folder set.\n */\nexport const buildRenderedKeys = ({\n folders,\n assets,\n mixedItems,\n}: {\n folders: Folder[];\n assets: File[];\n /** The interleaved rows, when the table is in mixed mode. */\n mixedItems?: MixedItem[] | null;\n}): ItemKey[] =>\n mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n"],"names":["buildRenderedKeys","folders","assets","mixedItems","map","item","kind","folderKey","folder","id","assetKey","asset"],"mappings":";;AAMA;;;;;;;;AAQC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,OAAO,EACPC,MAAM,EACNC,UAAU,EAMX,GACCA,UAAAA,GACIA,WAAWC,GAAG,CAAC,CAACC,IAAAA,GACdA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWC,UAAUF,IAAAA,CAAKG,MAAM,CAACC,EAAE,IAAIC,QAAAA,CAASL,IAAAA,CAAKM,KAAK,CAACF,EAAE,CAAA,CAAA,GAE7E;AACKR,QAAAA,GAAAA,OAAAA,CAAQG,GAAG,CAAC,CAACI,MAAAA,GAAWD,SAAAA,CAAUC,OAAOC,EAAE,CAAA,CAAA;AAC3CP,QAAAA,GAAAA,MAAAA,CAAOE,GAAG,CAAC,CAACO,KAAAA,GAAUD,QAAAA,CAASC,MAAMF,EAAE,CAAA;;;;;"}
@@ -43,11 +43,37 @@ const unregisterAbortController = (uploadId)=>{
43
43
  unregisterAbortController(uploadId);
44
44
  }
45
45
  };
46
+ /**
47
+ * Runs are chained per batch rather than started in parallel: a second pool
48
+ * alongside the first would double the files in flight and make `concurrency`
49
+ * stop meaning anything.
50
+ */ const poolTails = new Map();
51
+ const trackPoolRun = (uploadId, run)=>{
52
+ // Not swallowed: the caller still gets the real result from `run`.
53
+ const tail = run.catch(()=>undefined);
54
+ poolTails.set(uploadId, tail);
55
+ tail.then(()=>{
56
+ // Leave the entry alone if another run has queued behind us in the meantime.
57
+ if (poolTails.get(uploadId) === tail) {
58
+ poolTails.delete(uploadId);
59
+ }
60
+ });
61
+ };
46
62
  /** Maps a server per-file outcome onto the row's terminal metadata status. */ const METADATA_STATUS_BY_RESULT = {
47
63
  success: 'generated',
48
64
  skipped: 'skipped',
49
65
  error: 'failed'
50
66
  };
67
+ /**
68
+ * Re-attaches the folder an upload targeted.
69
+ *
70
+ * The create response is built from `db.query().create()` with no populate, so
71
+ * it comes back without the folder relation it was just given. The list needs
72
+ * it to tell whether a freshly uploaded asset belongs to the folder on screen.
73
+ */ const withTargetFolder = (file, folder)=>file.folder != null ? file : {
74
+ ...file,
75
+ folder: folder ?? null
76
+ };
51
77
  /**
52
78
  * Kicks off AI metadata generation for a freshly uploaded file.
53
79
  *
@@ -116,7 +142,8 @@ const unregisterAbortController = (uploadId)=>{
116
142
  dispatch(uploadProgress.setFileUploading({
117
143
  name: fileName,
118
144
  index,
119
- size: entry.file.size
145
+ size: entry.file.size,
146
+ uploadId
120
147
  }));
121
148
  const formData = new FormData();
122
149
  formData.append('files', entry.file);
@@ -125,7 +152,8 @@ const unregisterAbortController = (uploadId)=>{
125
152
  const batcher = createRafBatcher.createRafBatcher((bytes)=>{
126
153
  dispatch(uploadProgress.setFileProgress({
127
154
  index,
128
- bytes
155
+ bytes,
156
+ uploadId
129
157
  }));
130
158
  });
131
159
  try {
@@ -134,7 +162,9 @@ const unregisterAbortController = (uploadId)=>{
134
162
  uploaded.push(file);
135
163
  dispatch(uploadProgress.setFileComplete({
136
164
  index,
137
- file
165
+ file: withTargetFolder(file, entry.fileInfo?.folder),
166
+ uploadId,
167
+ completedAt: Date.now()
138
168
  }));
139
169
  // Not awaited: overlaps with the next file's upload and can't fail the batch.
140
170
  maybeGenerateMetadata({
@@ -155,7 +185,8 @@ const unregisterAbortController = (uploadId)=>{
155
185
  dispatch(uploadProgress.setFileError({
156
186
  index,
157
187
  name: fileName,
158
- message
188
+ message,
189
+ uploadId
159
190
  }));
160
191
  }
161
192
  };
@@ -185,6 +216,44 @@ const unregisterAbortController = (uploadId)=>{
185
216
  data: uploaded
186
217
  };
187
218
  };
219
+ /**
220
+ * Reuses the batch's AbortController so one Cancel stops both drops.
221
+ * `runUploadPool` unregisters it on finish, hence the re-register below.
222
+ *
223
+ * Resolves with the whole batch's files, not just this leg's: the mutation
224
+ * models one drop, and after a merge the drop is the batch. The earlier leg's
225
+ * files come from the tail this run queued behind.
226
+ */ const runMergedUploadPool = async ({ entries, indices, token, uploadId, dispatch, concurrency, generateAiMetadata })=>{
227
+ const abortController = abortControllers.get(uploadId) ?? new AbortController();
228
+ const run = (poolTails.get(uploadId) ?? Promise.resolve(undefined)).then((previous)=>{
229
+ // A failed earlier leg contributes no files; its error already reached the
230
+ // store, and this leg still has files of its own to upload.
231
+ const earlier = previous?.data ?? [];
232
+ if (abortController.signal.aborted) {
233
+ return {
234
+ data: earlier
235
+ };
236
+ }
237
+ registerAbortController(uploadId, abortController);
238
+ return runUploadPool({
239
+ entries,
240
+ indices,
241
+ token,
242
+ uploadId,
243
+ abortController,
244
+ dispatch,
245
+ concurrency,
246
+ generateAiMetadata
247
+ }).then((result)=>result.error ? result : {
248
+ data: [
249
+ ...earlier,
250
+ ...result.data ?? []
251
+ ]
252
+ });
253
+ });
254
+ trackPoolRun(uploadId, run);
255
+ return run;
256
+ };
188
257
  /* -------------------------------------------------------------------------------------------------
189
258
  * URL upload flow (SSE) — kept as-is for this iteration
190
259
  * -----------------------------------------------------------------------------------------------*/ /**
@@ -240,7 +309,7 @@ const unregisterAbortController = (uploadId)=>{
240
309
  /**
241
310
  * Processes an SSE stream from the URL upload endpoint.
242
311
  * Dispatches Redux actions for each file event and returns the final result.
243
- */ const processSSEStream = async ({ response, dispatch, uploadId, generateAiMetadata })=>{
312
+ */ const processSSEStream = async ({ response, dispatch, uploadId, generateAiMetadata, folderId })=>{
244
313
  const reader = response.body.getReader();
245
314
  const decoder = new TextDecoder();
246
315
  let streamResult = null;
@@ -271,7 +340,8 @@ const unregisterAbortController = (uploadId)=>{
271
340
  dispatch(uploadProgress.setFileUploading({
272
341
  name: parsed.url,
273
342
  index,
274
- size: 0
343
+ size: 0,
344
+ uploadId
275
345
  }));
276
346
  break;
277
347
  }
@@ -281,7 +351,8 @@ const unregisterAbortController = (uploadId)=>{
281
351
  dispatch(uploadProgress.setFileUploading({
282
352
  name: payload.name,
283
353
  index,
284
- size: payload.size
354
+ size: payload.size,
355
+ uploadId
285
356
  }));
286
357
  break;
287
358
  }
@@ -290,7 +361,9 @@ const unregisterAbortController = (uploadId)=>{
290
361
  const payload = parsed;
291
362
  dispatch(uploadProgress.setFileComplete({
292
363
  index,
293
- file: payload.file
364
+ file: withTargetFolder(payload.file, folderId),
365
+ uploadId,
366
+ completedAt: Date.now()
294
367
  }));
295
368
  // Same fire-and-forget semantics as the file flow.
296
369
  maybeGenerateMetadata({
@@ -308,7 +381,8 @@ const unregisterAbortController = (uploadId)=>{
308
381
  dispatch(uploadProgress.setFileError({
309
382
  index,
310
383
  name: payload.name,
311
- message: payload.message
384
+ message: payload.message,
385
+ uploadId
312
386
  }));
313
387
  break;
314
388
  }
@@ -357,6 +431,38 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
357
431
  }));
358
432
  const fileNames = entries.map((entry)=>entry.fileInfo.name ?? entry.file.name);
359
433
  const fileSizes = entries.map((entry)=>entry.file.size);
434
+ // `uploadFromUrls` also leaves rows `pending`, but registers no batch —
435
+ // so an unregistered batch is not ours to merge into, and appending would
436
+ // land on top of its rows.
437
+ const progress = getState().uploadProgress;
438
+ const batch = getUploadEntries(progress.uploadId);
439
+ const isMerge = batch !== undefined && uploadProgress.isUploadInFlight(progress.files);
440
+ if (isMerge) {
441
+ const { uploadId } = progress;
442
+ const offset = batch.entries.length;
443
+ // No `totalFiles`: the reducer derives it from the rows it appends.
444
+ dispatch(uploadProgress.appendUploadFiles({
445
+ uploadId,
446
+ fileNames,
447
+ fileSizes
448
+ }));
449
+ const mergedEntries = [
450
+ ...batch.entries,
451
+ ...entries
452
+ ];
453
+ // Merged files adopt the batch's flags: a new concurrency would raise
454
+ // the ceiling it exists to impose.
455
+ registerUploadEntries(uploadId, mergedEntries, batch.generateAiMetadata, batch.concurrency);
456
+ return runMergedUploadPool({
457
+ entries: mergedEntries,
458
+ indices: entries.map((_, index)=>offset + index),
459
+ token,
460
+ uploadId,
461
+ dispatch,
462
+ concurrency: batch.concurrency,
463
+ generateAiMetadata: batch.generateAiMetadata
464
+ });
465
+ }
360
466
  // Open the progress dialog
361
467
  dispatch(uploadProgress.openUploadProgress({
362
468
  totalFiles,
@@ -370,7 +476,7 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
370
476
  // One AbortController per batch
371
477
  const abortController = new AbortController();
372
478
  registerAbortController(uploadId, abortController);
373
- return runUploadPool({
479
+ const run = runUploadPool({
374
480
  entries,
375
481
  indices: entries.map((_, index)=>index),
376
482
  token,
@@ -380,6 +486,8 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
380
486
  concurrency,
381
487
  generateAiMetadata
382
488
  });
489
+ trackPoolRun(uploadId, run);
490
+ return run;
383
491
  },
384
492
  // `Folder, LIST` refreshes the folder header count, which changes when
385
493
  // files are added to it.
@@ -413,7 +521,11 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
413
521
  data: uploaded
414
522
  };
415
523
  } catch (err) {
416
- const message = err instanceof Error ? err.message : 'Upload failed';
524
+ // Only pass on text the server actually sent. The XHR layer's own
525
+ // fallbacks are hardcoded English, and callers here (crop → "Save
526
+ // as copy") have a localized message of their own; an empty string
527
+ // reads as "nothing usable" and lets theirs win.
528
+ const message = err instanceof uploadFileViaXHR.UploadFileError && err.isServerMessage ? err.message : '';
417
529
  return {
418
530
  error: {
419
531
  name: 'UnknownError',
@@ -466,7 +578,7 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
466
578
  // Fresh AbortController for the retry run
467
579
  const abortController = new AbortController();
468
580
  registerAbortController(uploadId, abortController);
469
- return runUploadPool({
581
+ const run = runUploadPool({
470
582
  entries: batch.entries,
471
583
  indices: cancelledIndices,
472
584
  token,
@@ -477,6 +589,11 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
477
589
  concurrency: batch.concurrency,
478
590
  generateAiMetadata: batch.generateAiMetadata
479
591
  });
592
+ // Retried rows are `pending` again, so a drop lands on the merge branch.
593
+ // Untracked, that merge would find no tail to queue behind and run its
594
+ // pool beside this one — two pools of `concurrency` each.
595
+ trackPoolRun(uploadId, run);
596
+ return run;
480
597
  },
481
598
  // `Folder, LIST` refreshes the folder header count, which changes when
482
599
  // files are added to it.
@@ -546,7 +663,8 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
546
663
  response,
547
664
  dispatch,
548
665
  uploadId,
549
- generateAiMetadata
666
+ generateAiMetadata,
667
+ folderId
550
668
  });
551
669
  unregisterAbortController(uploadId);
552
670
  if (streamResult && streamResult.data.length > 0) {