@strapi/upload 5.59.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js +29 -0
  10. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
  12. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  14. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  16. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  18. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  20. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  21. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  22. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  23. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  24. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  25. package/dist/admin/components/Drawer.js +12 -7
  26. package/dist/admin/components/Drawer.js.map +1 -1
  27. package/dist/admin/components/Drawer.mjs +12 -7
  28. package/dist/admin/components/Drawer.mjs.map +1 -1
  29. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
  30. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
  31. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
  32. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +9 -4
  34. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
  35. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +9 -4
  36. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
  37. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
  46. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
  47. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
  48. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
  49. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  50. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  52. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
  54. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
  55. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
  56. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
  57. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  58. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  60. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  61. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +163 -111
  62. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  63. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +162 -114
  64. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  65. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  66. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  67. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  68. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  69. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
  70. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
  71. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
  72. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
  73. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  74. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  75. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  76. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  77. package/dist/admin/components/UploadProgressDialog.js +2 -1
  78. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  79. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  80. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  81. package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
  82. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  83. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
  84. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  85. package/dist/admin/index.js +10 -1
  86. package/dist/admin/index.js.map +1 -1
  87. package/dist/admin/index.mjs +10 -1
  88. package/dist/admin/index.mjs.map +1 -1
  89. package/dist/admin/pages/Assets/AssetsPage.js +14 -303
  90. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  91. package/dist/admin/pages/Assets/AssetsPage.mjs +13 -282
  92. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  93. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
  94. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
  95. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  96. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
  97. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  98. package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
  99. package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
  100. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  101. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
  102. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  103. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  104. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  105. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  106. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  107. package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
  108. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  109. package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
  110. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  111. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  112. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  113. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  114. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  115. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
  116. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  117. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  118. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  119. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  120. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  121. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  122. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  123. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  124. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  125. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  126. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  127. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  128. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  129. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  130. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  131. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  132. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  133. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  134. package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
  135. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  136. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  137. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  138. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  139. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  140. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  141. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  142. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  143. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  144. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  145. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  146. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  147. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  148. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  149. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  150. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  151. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  152. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  153. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  154. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  155. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  156. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  157. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  158. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  159. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  160. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  161. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  162. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  163. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  164. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  165. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
  166. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
  167. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
  168. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
  169. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  170. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  171. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  172. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  173. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  174. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  175. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  176. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  177. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  178. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  179. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  180. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  181. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  182. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  183. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  184. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  185. package/dist/admin/services/api.js +92 -7
  186. package/dist/admin/services/api.js.map +1 -1
  187. package/dist/admin/services/api.mjs +91 -9
  188. package/dist/admin/services/api.mjs.map +1 -1
  189. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  190. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  191. package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
  192. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  193. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  194. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  195. package/dist/admin/src/components/Drawer.d.ts +8 -0
  196. package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
  197. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
  198. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  199. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  200. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
  201. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  202. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
  203. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  204. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
  205. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  206. package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
  207. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  208. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
  209. package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
  210. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  211. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  212. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  213. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  214. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  215. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  216. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  217. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  218. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  219. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  220. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  221. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  222. package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
  223. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  224. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  225. package/dist/admin/src/services/api.d.ts +24 -1
  226. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  227. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  228. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  229. package/dist/admin/store/uploadProgress.js +30 -3
  230. package/dist/admin/store/uploadProgress.js.map +1 -1
  231. package/dist/admin/store/uploadProgress.mjs +29 -4
  232. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  233. package/dist/admin/translations/en.json.js +24 -0
  234. package/dist/admin/translations/en.json.js.map +1 -1
  235. package/dist/admin/translations/en.json.mjs +24 -0
  236. package/dist/admin/translations/en.json.mjs.map +1 -1
  237. package/dist/admin/utils/findFolderPath.js +26 -0
  238. package/dist/admin/utils/findFolderPath.js.map +1 -0
  239. package/dist/admin/utils/findFolderPath.mjs +24 -0
  240. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  241. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  242. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  243. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  244. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  245. package/dist/server/audit-logs.js +264 -0
  246. package/dist/server/audit-logs.js.map +1 -0
  247. package/dist/server/audit-logs.mjs +255 -0
  248. package/dist/server/audit-logs.mjs.map +1 -0
  249. package/dist/server/bootstrap.js +4 -0
  250. package/dist/server/bootstrap.js.map +1 -1
  251. package/dist/server/bootstrap.mjs +4 -0
  252. package/dist/server/bootstrap.mjs.map +1 -1
  253. package/dist/server/controllers/admin-folder-file.js +23 -1
  254. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  255. package/dist/server/controllers/admin-folder-file.mjs +23 -1
  256. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  257. package/dist/server/controllers/admin-settings.js +5 -1
  258. package/dist/server/controllers/admin-settings.js.map +1 -1
  259. package/dist/server/controllers/admin-settings.mjs +5 -1
  260. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  261. package/dist/server/services/folder.js +48 -1
  262. package/dist/server/services/folder.js.map +1 -1
  263. package/dist/server/services/folder.mjs +48 -1
  264. package/dist/server/services/folder.mjs.map +1 -1
  265. package/dist/server/services/image-manipulation.js +14 -7
  266. package/dist/server/services/image-manipulation.js.map +1 -1
  267. package/dist/server/services/image-manipulation.mjs +14 -7
  268. package/dist/server/services/image-manipulation.mjs.map +1 -1
  269. package/dist/server/services/upload.js +100 -16
  270. package/dist/server/services/upload.js.map +1 -1
  271. package/dist/server/services/upload.mjs +102 -18
  272. package/dist/server/services/upload.mjs.map +1 -1
  273. package/dist/server/src/audit-logs.d.ts +142 -0
  274. package/dist/server/src/audit-logs.d.ts.map +1 -0
  275. package/dist/server/src/bootstrap.d.ts.map +1 -1
  276. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
  277. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  278. package/dist/server/src/index.d.ts +4 -4
  279. package/dist/server/src/index.d.ts.map +1 -1
  280. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  281. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  282. package/dist/server/src/services/folder.d.ts.map +1 -1
  283. package/dist/server/src/services/image-manipulation.d.ts +4 -4
  284. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  285. package/dist/server/src/services/index.d.ts +4 -4
  286. package/dist/server/src/services/index.d.ts.map +1 -1
  287. package/dist/server/src/services/upload.d.ts.map +1 -1
  288. package/dist/server/src/types.d.ts +63 -12
  289. package/dist/server/src/types.d.ts.map +1 -1
  290. package/package.json +11 -16
  291. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
  292. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
  293. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
  294. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
  295. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
@@ -1,8 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { useQueryParams, withEncodedUserParams, useNotification, Form, Blocker, getDisplayName, useForm, useField, useClipboard } from '@strapi/admin/strapi-admin';
4
- import { VisuallyHidden, Flex, Loader, Alert, Box, Typography, Button, IconButton, Field, TextInput, Tooltip, SingleSelect, SingleSelectOption, Dialog } from '@strapi/design-system';
5
- import { FileError, ArrowLineRight, Crop, Trash, WarningCircle, Link, Download, ArrowsCounterClockwise } from '@strapi/icons';
3
+ import { ConfirmDialog, useQueryParams, withEncodedUserParams, useNotification, Form, Blocker, getDisplayName, useForm, useField, useClipboard } from '@strapi/admin/strapi-admin';
4
+ import { Flex, Box, Typography, VisuallyHidden, Dialog, Loader, Alert, Button, IconButton, Field, TextInput, Tooltip, SingleSelect, SingleSelectOption } from '@strapi/design-system';
5
+ import { WarningCircle, FileError, ArrowLineRight, Crop, Trash, Link, Download, ArrowsCounterClockwise } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
7
  import { styled } from 'styled-components';
8
8
  import { Drawer } from '../../../../components/Drawer.mjs';
@@ -42,35 +42,12 @@ const useAssetOperation = ()=>{
42
42
  return ctx;
43
43
  };
44
44
  /* -------------------------------------------------------------------------------------------------
45
- * useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}
45
+ * useAssetDetailsParam - read and write the open asset in URL ?{ASSET_DETAILS_URL_PARAM}={id}
46
46
  * -----------------------------------------------------------------------------------------------*/ const useAssetDetailsParam = ()=>{
47
47
  const [{ query }, setQuery] = useQueryParams();
48
48
  const assetId = parseAssetDetailsId(query?.[ASSET_DETAILS_URL_PARAM]);
49
- const hasValidId = assetId !== null;
50
49
  // Closing is driven by removing the URL param (a navigation), so navigation
51
- // guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the
52
- // tree through the slide-out: it stays true once opened and only flips false
53
- // when the close animation actually ends (see onCloseAnimationEnd), so the
54
- // close duration lives entirely in CSS — no JS timer.
55
- const [isMounted, setIsMounted] = React.useState(hasValidId);
56
- const displayAssetId = React.useRef(null);
57
- React.useEffect(()=>{
58
- if (hasValidId) {
59
- displayAssetId.current = assetId;
60
- setIsMounted(true);
61
- }
62
- }, [
63
- hasValidId,
64
- assetId
65
- ]);
66
- const onCloseAnimationEnd = React.useCallback((event)=>{
67
- // Ignore animations bubbling up from descendants, and the slide-in.
68
- if (event.target === event.currentTarget && !hasValidId) {
69
- setIsMounted(false);
70
- }
71
- }, [
72
- hasValidId
73
- ]);
50
+ // guards like <Blocker> can intercept it.
74
51
  const openDetails = React.useCallback((id)=>{
75
52
  setQuery(withEncodedUserParams(query, {
76
53
  [ASSET_DETAILS_URL_PARAM]: String(id)
@@ -88,14 +65,44 @@ const useAssetOperation = ()=>{
88
65
  setQuery
89
66
  ]);
90
67
  return {
91
- assetId: hasValidId ? assetId : displayAssetId.current,
92
- isVisible: hasValidId,
93
- shouldRenderDrawer: isMounted,
94
- onCloseAnimationEnd,
68
+ assetId,
95
69
  openDetails,
96
70
  closeDetails
97
71
  };
98
72
  };
73
+ /* -------------------------------------------------------------------------------------------------
74
+ * useDrawerPresence - keep the drawer mounted through its slide-out
75
+ * -----------------------------------------------------------------------------------------------*/ const useDrawerPresence = (assetId)=>{
76
+ const isVisible = assetId !== null;
77
+ // `isMounted` stays true once opened and only flips false when the close
78
+ // animation actually ends (see onCloseAnimationEnd), so the close duration
79
+ // lives entirely in CSS — no JS timer. The last id is kept so the content
80
+ // doesn't go blank mid-slide.
81
+ const [isMounted, setIsMounted] = React.useState(isVisible);
82
+ const displayAssetId = React.useRef(assetId);
83
+ React.useEffect(()=>{
84
+ if (assetId !== null) {
85
+ displayAssetId.current = assetId;
86
+ setIsMounted(true);
87
+ }
88
+ }, [
89
+ assetId
90
+ ]);
91
+ const onCloseAnimationEnd = React.useCallback((event)=>{
92
+ // Ignore animations bubbling up from descendants, and the slide-in.
93
+ if (event.target === event.currentTarget && !isVisible) {
94
+ setIsMounted(false);
95
+ }
96
+ }, [
97
+ isVisible
98
+ ]);
99
+ return {
100
+ displayAssetId: isVisible ? assetId : displayAssetId.current,
101
+ isVisible,
102
+ shouldRender: isMounted,
103
+ onCloseAnimationEnd
104
+ };
105
+ };
99
106
  const DetailItemContainer = styled(Flex)`
100
107
  flex: 0 0 calc(50% - ${({ theme })=>theme.spaces[2]});
101
108
  `;
@@ -191,13 +198,14 @@ const DetailField = ({ name, label, required, disabled })=>{
191
198
  const { formatMessage } = useIntl();
192
199
  const field = useField(name);
193
200
  const isSubmitting = useForm('DetailField', (state)=>state.isSubmitting);
194
- // The form context (use-context-selector) echoes changes back
195
- // asynchronously — driving the input straight from `field.value` makes
196
- // React rewrite the DOM value after the keystroke, which throws the cursor
197
- // to the end of the field. The input is therefore controlled by local state
198
- // (synchronous, cursor-safe) and the form follows; the effect below only
199
- // matters for EXTERNAL value changes (discard/reset), where a cursor jump
200
- // is fine because the user isn't typing.
201
+ // The input is controlled by local state (synchronous, cursor-safe) and the
202
+ // form follows. This was needed when the form context echoed changes back
203
+ // asynchronously: driving the input straight from `field.value` made React
204
+ // rewrite the DOM value after the keystroke, which threw the cursor to the
205
+ // end of the field. The form context now updates synchronously, but the
206
+ // local state is kept as a safe default. The effect below only matters for
207
+ // EXTERNAL value changes (discard/reset), where a cursor jump is fine
208
+ // because the user isn't typing.
201
209
  const fieldValue = field.value ?? '';
202
210
  const [value, setValue] = React.useState(fieldValue);
203
211
  React.useEffect(()=>{
@@ -540,7 +548,26 @@ const AssetImageActions = ({ onCrop })=>{
540
548
  })
541
549
  });
542
550
  };
543
- const AssetDetails = ({ asset, closeDetails })=>{
551
+ /* -------------------------------------------------------------------------------------------------
552
+ * AssetDetails
553
+ * -----------------------------------------------------------------------------------------------*/ /**
554
+ * Writes whether the form has unsaved edits into the drawer's ref. Only the
555
+ * drawer's close handlers read it, so a ref rather than state: toggling dirty
556
+ * doesn't re-render the drawer. A component, not a hook, because the form state
557
+ * is only reachable inside <Form>'s render prop.
558
+ */ const ReportUnsavedEdits = ({ target, hasUnsavedEdits })=>{
559
+ React.useLayoutEffect(()=>{
560
+ target.current = hasUnsavedEdits;
561
+ return ()=>{
562
+ target.current = false;
563
+ };
564
+ }, [
565
+ target,
566
+ hasUnsavedEdits
567
+ ]);
568
+ return null;
569
+ };
570
+ const AssetDetails = ({ asset, closeDetails, hasUnsavedEditsRef, guardNavigation = false, onAssetChange, onAssetDelete, trackedLocation = MEDIA_LIBRARY_LOCATION })=>{
544
571
  const { formatMessage, formatDate } = useIntl();
545
572
  const getErrorMessage = useApiErrorMessage();
546
573
  const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions();
@@ -565,13 +592,21 @@ const AssetDetails = ({ asset, closeDetails })=>{
565
592
  // own handlers (replace, update) read like the consumers do.
566
593
  const notify = React.useCallback((toast)=>setDrawerToast(toast), []);
567
594
  const isImage = asset.mime?.includes(ASSET_TYPES.Image);
568
- const initialValues = {
569
- name: asset.name ?? '',
570
- caption: asset.caption ?? '',
571
- alternativeText: asset.alternativeText ?? '',
572
- folder: typeof asset.folder === 'object' && asset.folder !== null ? asset.folder.id ?? null : asset.folder ?? null
573
- };
574
- const handleSubmit = async (values)=>{
595
+ // Stable until the asset changes: <Form> resets its values whenever this
596
+ // object does, which on every render would throw away the baseline a save
597
+ // sets and show the pre-save values until the refetch lands.
598
+ const initialValues = React.useMemo(()=>({
599
+ name: asset.name ?? '',
600
+ caption: asset.caption ?? '',
601
+ alternativeText: asset.alternativeText ?? '',
602
+ folder: typeof asset.folder === 'object' && asset.folder !== null ? asset.folder.id ?? null : asset.folder ?? null
603
+ }), [
604
+ asset.name,
605
+ asset.caption,
606
+ asset.alternativeText,
607
+ asset.folder
608
+ ]);
609
+ const handleSubmit = async (values, { resetForm })=>{
575
610
  const fileInfo = {
576
611
  name: values.name,
577
612
  caption: values.caption,
@@ -592,8 +627,13 @@ const AssetDetails = ({ asset, closeDetails })=>{
592
627
  });
593
628
  return;
594
629
  }
630
+ // What was saved is the new baseline. Otherwise the form stays "modified"
631
+ // until the refetched asset resets it, and closing in that gap asks about
632
+ // edits that are already saved.
633
+ resetForm(values);
634
+ onAssetChange?.(res.data);
595
635
  trackUsage('didEditMediaLibraryElements', {
596
- location: MEDIA_LIBRARY_LOCATION,
636
+ location: trackedLocation,
597
637
  // Legacy sends the mime top-level type (image/video/audio/application…).
598
638
  type: asset.mime?.split('/')[0],
599
639
  changeLocation: values.folder !== initialValues.folder
@@ -626,8 +666,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
626
666
  });
627
667
  return;
628
668
  }
669
+ onAssetChange?.(res.data);
629
670
  trackUsage('didReplaceMedia', {
630
- location: MEDIA_LIBRARY_LOCATION
671
+ location: trackedLocation
631
672
  });
632
673
  notify({
633
674
  type: 'success',
@@ -642,7 +683,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
642
683
  formatMessage,
643
684
  getErrorMessage,
644
685
  notify,
686
+ onAssetChange,
645
687
  replaceMutation,
688
+ trackedLocation,
646
689
  trackUsage
647
690
  ]);
648
691
  // Owns the delete: on error notify in-drawer (drawer stays), on success fire
@@ -668,6 +711,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
668
711
  folderName
669
712
  })
670
713
  });
714
+ onAssetDelete?.(asset.id);
671
715
  closeDetails();
672
716
  }, [
673
717
  asset.id,
@@ -677,6 +721,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
677
721
  formatMessage,
678
722
  getErrorMessage,
679
723
  notify,
724
+ onAssetDelete,
680
725
  toggleNotification
681
726
  ]);
682
727
  const notifyCropError = (error)=>{
@@ -704,8 +749,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
704
749
  notifyCropError(res.error);
705
750
  return;
706
751
  }
752
+ onAssetChange?.(res.data);
707
753
  trackUsage('didCropFile', {
708
- location: MEDIA_LIBRARY_LOCATION,
754
+ location: trackedLocation,
709
755
  duplicatedFile: false
710
756
  });
711
757
  notify({
@@ -717,6 +763,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
717
763
  });
718
764
  };
719
765
  // Save as copy: upload the cropped file as a new asset in the same folder.
766
+ // The original is untouched, so `onAssetChange` stays silent.
720
767
  const handleCropSaveAsCopy = async (file, focalPoint)=>{
721
768
  setIsCropOpen(false);
722
769
  // Silent single-file upload (no global progress dialog). Carry over the
@@ -736,7 +783,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
736
783
  return;
737
784
  }
738
785
  trackUsage('didCropFile', {
739
- location: MEDIA_LIBRARY_LOCATION,
786
+ location: trackedLocation,
740
787
  duplicatedFile: true
741
788
  });
742
789
  notify({
@@ -778,9 +825,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
778
825
  });
779
826
  return /*#__PURE__*/ jsxs(Fragment, {
780
827
  children: [
781
- /*#__PURE__*/ jsx(Blocker, {
828
+ guardNavigation ? /*#__PURE__*/ jsx(Blocker, {
782
829
  onProceed: resetForm
783
- }),
830
+ }) : hasUnsavedEditsRef ? /*#__PURE__*/ jsx(ReportUnsavedEdits, {
831
+ target: hasUnsavedEditsRef,
832
+ hasUnsavedEdits: modified && !isSubmitting
833
+ }) : null,
784
834
  isCropOpen && isImage ? /*#__PURE__*/ jsx(AssetCropEditor, {
785
835
  asset: asset,
786
836
  onClose: ()=>setIsCropOpen(false),
@@ -1038,7 +1088,7 @@ const DrawerHeader = ({ asset, closeDetails })=>{
1038
1088
  ]
1039
1089
  });
1040
1090
  };
1041
- const DrawerContent = ({ assetId, closeDetails })=>{
1091
+ const DrawerContent = ({ assetId, requestClose, closeDetails, hasUnsavedEditsRef, guardNavigation, onAssetChange, onAssetDelete, trackedLocation })=>{
1042
1092
  const { formatMessage } = useIntl();
1043
1093
  const { data: asset, isLoading, error } = useGetAssetQuery(assetId, {
1044
1094
  refetchOnMountOrArgChange: false,
@@ -1069,7 +1119,7 @@ const DrawerContent = ({ assetId, closeDetails })=>{
1069
1119
  id: 'global.close',
1070
1120
  defaultMessage: 'Close'
1071
1121
  }),
1072
- onClose: closeDetails,
1122
+ onClose: requestClose,
1073
1123
  children: formatMessage({
1074
1124
  id: getTranslationKey('asset-details.error'),
1075
1125
  defaultMessage: 'Failed to load file details.'
@@ -1081,11 +1131,16 @@ const DrawerContent = ({ assetId, closeDetails })=>{
1081
1131
  children: [
1082
1132
  /*#__PURE__*/ jsx(DrawerHeader, {
1083
1133
  asset: asset,
1084
- closeDetails: closeDetails
1134
+ closeDetails: requestClose
1085
1135
  }),
1086
1136
  /*#__PURE__*/ jsx(AssetDetails, {
1087
1137
  asset: asset,
1088
- closeDetails: closeDetails
1138
+ closeDetails: closeDetails,
1139
+ hasUnsavedEditsRef: hasUnsavedEditsRef,
1140
+ guardNavigation: guardNavigation,
1141
+ onAssetChange: onAssetChange,
1142
+ onAssetDelete: onAssetDelete,
1143
+ trackedLocation: trackedLocation
1089
1144
  })
1090
1145
  ]
1091
1146
  });
@@ -1118,15 +1173,29 @@ const DrawerContent = ({ assetId, closeDetails })=>{
1118
1173
  // and stop the card's click, so no switch follows and the press dismisses.
1119
1174
  return event.target.closest(ASSET_DETAILS_TRIGGER_SELECTOR) !== null && event.target.closest(ASSET_ITEM_CONTROL_SELECTOR) === null;
1120
1175
  };
1121
- const AssetDetailsDrawer = ()=>{
1176
+ const AssetDetailsDrawer = ({ assetId, onClose, guardNavigation = false, onAssetChange, onAssetDelete, trackedLocation })=>{
1122
1177
  const { formatMessage } = useIntl();
1123
- const { assetId, isVisible, shouldRenderDrawer, onCloseAnimationEnd, closeDetails } = useAssetDetailsParam();
1124
- if (!shouldRenderDrawer || assetId === null) {
1178
+ const { displayAssetId, isVisible, shouldRender, onCloseAnimationEnd } = useDrawerPresence(assetId);
1179
+ const hasUnsavedEditsRef = React.useRef(false);
1180
+ const [isConfirmingClose, setIsConfirmingClose] = React.useState(false);
1181
+ // Where focus was when the drawer opened — the card or the field's edit
1182
+ // button — so closing can hand it back instead of dropping it on <body>.
1183
+ const returnFocusRef = React.useRef(null);
1184
+ const requestClose = React.useCallback(()=>{
1185
+ if (hasUnsavedEditsRef.current) {
1186
+ setIsConfirmingClose(true);
1187
+ return;
1188
+ }
1189
+ onClose();
1190
+ }, [
1191
+ onClose
1192
+ ]);
1193
+ if (!shouldRender || displayAssetId === null) {
1125
1194
  return null;
1126
1195
  }
1127
1196
  return /*#__PURE__*/ jsxs(Drawer.Root, {
1128
1197
  isVisible: isVisible,
1129
- onClose: closeDetails,
1198
+ onClose: requestClose,
1130
1199
  children: [
1131
1200
  /*#__PURE__*/ jsx("div", {
1132
1201
  children: /*#__PURE__*/ jsxs(VisuallyHidden, {
@@ -1146,7 +1215,7 @@ const AssetDetailsDrawer = ()=>{
1146
1215
  ]
1147
1216
  })
1148
1217
  }),
1149
- /*#__PURE__*/ jsx(Drawer.Body, {
1218
+ /*#__PURE__*/ jsxs(Drawer.Body, {
1150
1219
  animationDirection: "left",
1151
1220
  width: "41.6rem",
1152
1221
  // dvh, not vh: the drawer is anchored to the bottom, so with 100vh on
@@ -1155,21 +1224,67 @@ const AssetDetailsDrawer = ()=>{
1155
1224
  // off-screen. dvh tracks the actual visible height.
1156
1225
  height: "100dvh",
1157
1226
  onAnimationEnd: onCloseAnimationEnd,
1158
- // Opt in to dismiss-on-outside-click; `closeDetails` is the same path
1159
- // as the header's close button, so unsaved edits are still guarded.
1227
+ // Runs before focus moves in, so this is still the element that opened it.
1228
+ onOpenAutoFocus: ()=>{
1229
+ returnFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
1230
+ },
1231
+ // By now the panel is gone: focus is on <body> unless the user moved it
1232
+ // somewhere — a press on another control dismissed the drawer — and that
1233
+ // choice wins.
1234
+ onCloseAutoFocus: (event)=>{
1235
+ const target = returnFocusRef.current;
1236
+ const active = document.activeElement;
1237
+ if (target?.isConnected && (active === null || active === document.body)) {
1238
+ event.preventDefault();
1239
+ target.focus();
1240
+ }
1241
+ },
1242
+ // Opt in to dismiss-on-outside-click; it goes through `requestClose`,
1243
+ // like the header's close button, so unsaved edits are still guarded.
1160
1244
  onPointerDownOutside: (event)=>{
1161
1245
  if (shouldKeepDrawerOpen(event, isVisible)) {
1162
1246
  event.preventDefault();
1163
1247
  }
1164
1248
  },
1165
- children: /*#__PURE__*/ jsx(DrawerContent, {
1166
- assetId: assetId,
1167
- closeDetails: closeDetails
1168
- })
1249
+ children: [
1250
+ /*#__PURE__*/ jsx(DrawerContent, {
1251
+ assetId: displayAssetId,
1252
+ requestClose: requestClose,
1253
+ closeDetails: onClose,
1254
+ hasUnsavedEditsRef: hasUnsavedEditsRef,
1255
+ guardNavigation: guardNavigation,
1256
+ onAssetChange: onAssetChange,
1257
+ onAssetDelete: onAssetDelete,
1258
+ trackedLocation: trackedLocation
1259
+ }),
1260
+ /*#__PURE__*/ jsx(Dialog.Root, {
1261
+ open: isConfirmingClose,
1262
+ onOpenChange: setIsConfirmingClose,
1263
+ children: /*#__PURE__*/ jsx(ConfirmDialog, {
1264
+ onConfirm: onClose,
1265
+ variant: "danger",
1266
+ children: formatMessage({
1267
+ id: getTranslationKey('asset-details.unsaved.confirm'),
1268
+ defaultMessage: "You have unsaved changes, are you sure you want to close this file's details? Your changes will be lost."
1269
+ })
1270
+ })
1271
+ })
1272
+ ]
1169
1273
  })
1170
1274
  ]
1171
1275
  });
1172
1276
  };
1277
+ /**
1278
+ * The drawer bound to the URL's `?assetId=`, as the Media Library page uses it:
1279
+ * linkable, survives a refresh, and closing is a navigation.
1280
+ */ const AssetDetailsDrawerFromUrl = ()=>{
1281
+ const { assetId, closeDetails } = useAssetDetailsParam();
1282
+ return /*#__PURE__*/ jsx(AssetDetailsDrawer, {
1283
+ assetId: assetId,
1284
+ onClose: closeDetails,
1285
+ guardNavigation: true
1286
+ });
1287
+ };
1173
1288
 
1174
- export { AssetDetails, AssetDetailsDrawer, AssetOperationsContext, DrawerNotifyContext, getBusyMessage, useAssetDetailsParam };
1289
+ export { AssetDetails, AssetDetailsDrawer, AssetDetailsDrawerFromUrl, AssetOperationsContext, DrawerNotifyContext, getBusyMessage, useAssetDetailsParam };
1175
1290
  //# sourceMappingURL=AssetDetailsDrawer.mjs.map