@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,10 +1,18 @@
1
1
  import { useRBAC } from '@strapi/admin/strapi-admin';
2
2
  import { PERMISSIONS } from '../constants.mjs';
3
3
 
4
- // Hoisted to module scope (matching the legacy hook): a fresh object each render
4
+ // Hoisted to module scope (matching the legacy hook): a fresh array each render
5
5
  // would hand `useRBAC` a new identity every time, re-running its memos for no
6
6
  // gain (it guards refetch with a deep `isEqual`, so this is wasted work, not a loop).
7
- const { main: _main, ...RBAC_PERMISSIONS } = PERMISSIONS;
7
+ // `settings` stays out: `useRBAC` names each result after the last segment of the
8
+ // action, so `plugin::upload.settings.read` would also come back as `canRead`.
9
+ const RBAC_PERMISSIONS = [
10
+ ...PERMISSIONS.read,
11
+ ...PERMISSIONS.create,
12
+ ...PERMISSIONS.update,
13
+ ...PERMISSIONS.download,
14
+ ...PERMISSIONS.copyLink
15
+ ];
8
16
  /**
9
17
  * RBAC gate for the future Media Library UI. Mirrors the legacy hook of the
10
18
  * same name: the server already enforces every action route-side (assets and
@@ -13,6 +21,8 @@ const { main: _main, ...RBAC_PERMISSIONS } = PERMISSIONS;
13
21
  * hook is what keeps the UI honest so users don't discover a missing
14
22
  * permission through a 403.
15
23
  *
24
+ * - `canRead` — browse the library (the Content Manager asset picker needs
25
+ * nothing more)
16
26
  * - `canCreate` — upload (files, from URL) and New folder
17
27
  * - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete
18
28
  * (single + bulk), AI metadata — the `assets.update` action covers
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaLibraryPermissions.mjs","sources":["../../../admin/src/hooks/useMediaLibraryPermissions.ts"],"sourcesContent":["import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\n// Hoisted to module scope (matching the legacy hook): a fresh object each render\n// would hand `useRBAC` a new identity every time, re-running its memos for no\n// gain (it guards refetch with a deep `isEqual`, so this is wasted work, not a loop).\nconst { main: _main, ...RBAC_PERMISSIONS } = PERMISSIONS;\n\n/**\n * RBAC gate for the future Media Library UI. Mirrors the legacy hook of the\n * same name: the server already enforces every action route-side (assets and\n * folder operations share the asset permissions — folder create requires\n * `assets.create`, folder rename/move/delete require `assets.update`); this\n * hook is what keeps the UI honest so users don't discover a missing\n * permission through a 403.\n *\n * - `canCreate` — upload (files, from URL) and New folder\n * - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete\n * (single + bulk), AI metadata — the `assets.update` action covers\n * \"Update (crop, details, replace) + delete\" by definition\n * - `canDownload` / `canCopyLink` — the matching drawer actions\n */\nexport const useMediaLibraryPermissions = () => {\n const { allowedActions, isLoading } = useRBAC(RBAC_PERMISSIONS);\n\n return {\n isLoading,\n // `plugin::upload.read` gates every Media Library endpoint, `GET /upload/settings`\n // included. Entry forms render a media field for roles that lack it, so callers\n // need to know before they ask the server and collect a 403.\n canRead: Boolean(allowedActions.canRead),\n canCreate: Boolean(allowedActions.canCreate),\n canUpdate: Boolean(allowedActions.canUpdate),\n canDownload: Boolean(allowedActions.canDownload),\n canCopyLink: Boolean(allowedActions.canCopyLink),\n };\n};\n"],"names":["main","_main","RBAC_PERMISSIONS","PERMISSIONS","useMediaLibraryPermissions","allowedActions","isLoading","useRBAC","canRead","Boolean","canCreate","canUpdate","canDownload","canCopyLink"],"mappings":";;;AAIA;AACA;AACA;AACA,MAAM,EAAEA,IAAAA,EAAMC,KAAK,EAAE,GAAGC,kBAAkB,GAAGC,WAAAA;AAE7C;;;;;;;;;;;;;UAcaC,0BAAAA,GAA6B,IAAA;AACxC,IAAA,MAAM,EAAEC,cAAc,EAAEC,SAAS,EAAE,GAAGC,OAAAA,CAAQL,gBAAAA,CAAAA;IAE9C,OAAO;AACLI,QAAAA,SAAAA;;;;QAIAE,OAAAA,EAASC,OAAAA,CAAQJ,eAAeG,OAAO,CAAA;QACvCE,SAAAA,EAAWD,OAAAA,CAAQJ,eAAeK,SAAS,CAAA;QAC3CC,SAAAA,EAAWF,OAAAA,CAAQJ,eAAeM,SAAS,CAAA;QAC3CC,WAAAA,EAAaH,OAAAA,CAAQJ,eAAeO,WAAW,CAAA;QAC/CC,WAAAA,EAAaJ,OAAAA,CAAQJ,eAAeQ,WAAW;AACjD,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useMediaLibraryPermissions.mjs","sources":["../../../admin/src/hooks/useMediaLibraryPermissions.ts"],"sourcesContent":["import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\n// Hoisted to module scope (matching the legacy hook): a fresh array each render\n// would hand `useRBAC` a new identity every time, re-running its memos for no\n// gain (it guards refetch with a deep `isEqual`, so this is wasted work, not a loop).\n// `settings` stays out: `useRBAC` names each result after the last segment of the\n// action, so `plugin::upload.settings.read` would also come back as `canRead`.\nconst RBAC_PERMISSIONS = [\n ...PERMISSIONS.read,\n ...PERMISSIONS.create,\n ...PERMISSIONS.update,\n ...PERMISSIONS.download,\n ...PERMISSIONS.copyLink,\n];\n\n/**\n * RBAC gate for the future Media Library UI. Mirrors the legacy hook of the\n * same name: the server already enforces every action route-side (assets and\n * folder operations share the asset permissions — folder create requires\n * `assets.create`, folder rename/move/delete require `assets.update`); this\n * hook is what keeps the UI honest so users don't discover a missing\n * permission through a 403.\n *\n * - `canRead` — browse the library (the Content Manager asset picker needs\n * nothing more)\n * - `canCreate` — upload (files, from URL) and New folder\n * - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete\n * (single + bulk), AI metadata — the `assets.update` action covers\n * \"Update (crop, details, replace) + delete\" by definition\n * - `canDownload` / `canCopyLink` — the matching drawer actions\n */\nexport const useMediaLibraryPermissions = () => {\n const { allowedActions, isLoading } = useRBAC(RBAC_PERMISSIONS);\n\n return {\n isLoading,\n // `plugin::upload.read` gates every Media Library endpoint, `GET /upload/settings`\n // included. Entry forms render a media field for roles that lack it, so callers\n // need to know before they ask the server and collect a 403.\n canRead: Boolean(allowedActions.canRead),\n canCreate: Boolean(allowedActions.canCreate),\n canUpdate: Boolean(allowedActions.canUpdate),\n canDownload: Boolean(allowedActions.canDownload),\n canCopyLink: Boolean(allowedActions.canCopyLink),\n };\n};\n"],"names":["RBAC_PERMISSIONS","PERMISSIONS","read","create","update","download","copyLink","useMediaLibraryPermissions","allowedActions","isLoading","useRBAC","canRead","Boolean","canCreate","canUpdate","canDownload","canCopyLink"],"mappings":";;;AAIA;AACA;AACA;AACA;AACA;AACA,MAAMA,gBAAAA,GAAmB;AACpBC,IAAAA,GAAAA,WAAAA,CAAYC,IAAI;AAChBD,IAAAA,GAAAA,WAAAA,CAAYE,MAAM;AAClBF,IAAAA,GAAAA,WAAAA,CAAYG,MAAM;AAClBH,IAAAA,GAAAA,WAAAA,CAAYI,QAAQ;AACpBJ,IAAAA,GAAAA,WAAAA,CAAYK;AAChB,CAAA;AAED;;;;;;;;;;;;;;;UAgBaC,0BAAAA,GAA6B,IAAA;AACxC,IAAA,MAAM,EAAEC,cAAc,EAAEC,SAAS,EAAE,GAAGC,OAAAA,CAAQV,gBAAAA,CAAAA;IAE9C,OAAO;AACLS,QAAAA,SAAAA;;;;QAIAE,OAAAA,EAASC,OAAAA,CAAQJ,eAAeG,OAAO,CAAA;QACvCE,SAAAA,EAAWD,OAAAA,CAAQJ,eAAeK,SAAS,CAAA;QAC3CC,SAAAA,EAAWF,OAAAA,CAAQJ,eAAeM,SAAS,CAAA;QAC3CC,WAAAA,EAAaH,OAAAA,CAAQJ,eAAeO,WAAW,CAAA;QAC/CC,WAAAA,EAAaJ,OAAAA,CAAQJ,eAAeQ,WAAW;AACjD,KAAA;AACF;;;;"}
@@ -2,6 +2,8 @@
2
2
 
3
3
  var icons = require('@strapi/icons');
4
4
  var _package = require('./package.json.js');
5
+ var MediaLibraryPickerDialog = require('./components/AssetPickerDialog/MediaLibraryPickerDialog.js');
6
+ var EditorFileDropZone = require('./components/EditorFileDropZone/EditorFileDropZone.js');
5
7
  var MediaLibraryInput$1 = require('./components/MediaLibraryInput/MediaLibraryInput.js');
6
8
  var UploadProgressDialog = require('./components/UploadProgressDialog.js');
7
9
  var constants = require('./constants.js');
@@ -81,6 +83,12 @@ const admin = {
81
83
  {
82
84
  name: 'future-global::upload-progress',
83
85
  Component: UploadProgressDialog.UploadProgressDialog
86
+ },
87
+ // Lets the Blocks editor take files dropped onto it. Not registered on the
88
+ // legacy Media Library, which has no upload progress dialog to report to.
89
+ {
90
+ name: 'media-library-file-drop-zone',
91
+ Component: EditorFileDropZone.EditorFileDropZone
84
92
  }
85
93
  ]);
86
94
  }
@@ -106,10 +114,11 @@ const admin = {
106
114
  type: 'media',
107
115
  Component: isLegacyMediaLibrary ? MediaLibraryInput.MediaLibraryInput : MediaLibraryInput$1.MediaLibraryInput
108
116
  });
117
+ // The picker the Wysiwyg and Blocks editors insert images with.
109
118
  app.addComponents([
110
119
  {
111
120
  name: 'media-library',
112
- Component: MediaLibraryDialog.MediaLibraryDialog
121
+ Component: isLegacyMediaLibrary ? MediaLibraryDialog.MediaLibraryDialog : MediaLibraryPickerDialog.MediaLibraryPickerDialog
113
122
  }
114
123
  ]);
115
124
  app.registerPlugin({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { Images } from '@strapi/icons';
2
2
  import pluginPkg from './package.json.mjs';
3
+ import { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog.mjs';
4
+ import { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone.mjs';
3
5
  import { MediaLibraryInput as MediaLibraryInput$1 } from './components/MediaLibraryInput/MediaLibraryInput.mjs';
4
6
  import { UploadProgressDialog } from './components/UploadProgressDialog.mjs';
5
7
  import { PERMISSIONS } from './constants.mjs';
@@ -77,6 +79,12 @@ const admin = {
77
79
  {
78
80
  name: 'future-global::upload-progress',
79
81
  Component: UploadProgressDialog
82
+ },
83
+ // Lets the Blocks editor take files dropped onto it. Not registered on the
84
+ // legacy Media Library, which has no upload progress dialog to report to.
85
+ {
86
+ name: 'media-library-file-drop-zone',
87
+ Component: EditorFileDropZone
80
88
  }
81
89
  ]);
82
90
  }
@@ -102,10 +110,11 @@ const admin = {
102
110
  type: 'media',
103
111
  Component: isLegacyMediaLibrary ? MediaLibraryInput : MediaLibraryInput$1
104
112
  });
113
+ // The picker the Wysiwyg and Blocks editors insert images with.
105
114
  app.addComponents([
106
115
  {
107
116
  name: 'media-library',
108
- Component: MediaLibraryDialog
117
+ Component: isLegacyMediaLibrary ? MediaLibraryDialog : MediaLibraryPickerDialog
109
118
  }
110
119
  ]);
111
120
  app.registerPlugin({
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -2,7 +2,6 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
- var ToggleGroup = require('@radix-ui/react-toggle-group');
6
5
  var strapiAdmin = require('@strapi/admin/strapi-admin');
7
6
  var designSystem = require('@strapi/design-system');
8
7
  var icons = require('@strapi/icons');
@@ -12,73 +11,32 @@ var useAIMetadataEnabled = require('../../hooks/useAIMetadataEnabled.js');
12
11
  var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
13
12
  var useTracking = require('../../hooks/useTracking.js');
14
13
  var api = require('../../services/api.js');
15
- var folders = require('../../services/folders.js');
16
14
  var settings = require('../../services/settings.js');
17
15
  var itemLocations = require('../../utils/itemLocations.js');
18
16
  var translations = require('../../utils/translations.js');
19
17
  var typeFromMime = require('../../utils/typeFromMime.js');
20
18
  var AssetDetailsDrawer = require('./components/AssetDetails/AssetDetailsDrawer.js');
21
- var AssetsGrid = require('./components/AssetsGrid.js');
22
19
  var AssetsSearchInput = require('./components/AssetsSearchInput.js');
23
- var AssetsTable = require('./components/AssetsTable.js');
24
- var BulkActionsBar = require('./components/BulkActionsBar.js');
20
+ var AssetsView = require('./components/AssetsView.js');
25
21
  var AssetsDndProvider = require('./components/Dnd/AssetsDndProvider.js');
26
22
  var UploadDropZone = require('./components/DropZone/UploadDropZone.js');
27
23
  var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext.js');
28
- var EmptyState = require('./components/EmptyState.js');
29
24
  var FilterBadges = require('./components/FilterBadges.js');
30
25
  var FilterMenu = require('./components/FilterMenu.js');
31
26
  var FolderFormDialog = require('./components/FolderFormDialog.js');
32
27
  var FolderTree = require('./components/FolderTree/FolderTree.js');
33
28
  var ImportFromUrlDialog = require('./components/ImportFromUrlDialog.js');
34
- var ItemContextMenu = require('./components/ItemContextMenu.js');
35
29
  var MainAreaContextMenu = require('./components/MainAreaContextMenu.js');
36
30
  var SortMenu = require('./components/SortMenu.js');
31
+ var ViewToggle = require('./components/ViewToggle.js');
37
32
  var constants = require('./constants.js');
38
- var useAssetSearch = require('./hooks/useAssetSearch.js');
39
33
  var useAssetSelection = require('./hooks/useAssetSelection.js');
34
+ var useAssetsList = require('./hooks/useAssetsList.js');
40
35
  var useBusyAssets = require('./hooks/useBusyAssets.js');
41
36
  var useFolderInfo = require('./hooks/useFolderInfo.js');
42
- var useFolderNavigation = require('./hooks/useFolderNavigation.js');
43
- var useInfiniteAssets = require('./hooks/useInfiniteAssets.js');
44
- var useInfiniteScrollSentinel = require('./hooks/useInfiniteScrollSentinel.js');
45
- var useListFilters = require('./hooks/useListFilters.js');
46
37
  var useListScrollRestoration = require('./hooks/useListScrollRestoration.js');
47
- var useListSort = require('./hooks/useListSort.js');
48
- var buildAssetFilters = require('./utils/buildAssetFilters.js');
49
38
  var listQueryKey = require('./utils/listQueryKey.js');
50
- var mergeMixedList = require('./utils/mergeMixedList.js');
51
- var renderedKeys = require('./utils/renderedKeys.js');
52
39
 
53
- function _interopNamespace(e) {
54
- if (e && e.__esModule) return e;
55
- var n = Object.create(null);
56
- if (e) {
57
- Object.keys(e).forEach(function (k) {
58
- if (k !== 'default') {
59
- var d = Object.getOwnPropertyDescriptor(e, k);
60
- Object.defineProperty(n, k, d.get ? d : {
61
- enumerable: true,
62
- get: function () { return e[k]; }
63
- });
64
- }
65
- });
66
- }
67
- n.default = e;
68
- return Object.freeze(n);
69
- }
70
-
71
- var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
72
-
73
- // The negative bottom margin shrinks the trigger area by a pixel so the 1px
74
- // sentinel sitting exactly at the fold (when a page's rows happen to fill the
75
- // viewport) reads as "not visible" and doesn't pull an extra page. It still
76
- // triggers as soon as the sentinel scrolls a hair into view. Tune the bottom
77
- // value if the list over- or under-fetches near the fold.
78
- const INTERSECTION_OPTIONS = {
79
- threshold: 0,
80
- rootMargin: '0px 0px -1px 0px'
81
- };
82
40
  // Module-level so the header sentinel's observer isn't rebuilt every render.
83
41
  const HEADER_SENTINEL_OPTIONS = {
84
42
  threshold: 0
@@ -110,116 +68,6 @@ const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
110
68
  }
111
69
  return SEARCH_RESULTS_COUNT_MESSAGES.both;
112
70
  };
113
- const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
114
- const { formatMessage } = reactIntl.useIntl();
115
- const isGridView = view === constants.viewOptions.GRID;
116
- const isLoading = isLoadingAssets || isLoadingFolders;
117
- // "Folders: Mixed with files" — interleave the complete folder list into the
118
- // loaded asset stream client-side, following the active sort. Table view
119
- // only: the grid always keeps folders in their own band on top.
120
- const mixedItems = React.useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList.mergeMixedList({
121
- folders,
122
- assets,
123
- sort: assetsSort,
124
- hasNextPage
125
- }) : null, [
126
- foldersPosition,
127
- isGridView,
128
- folders,
129
- assets,
130
- assetsSort,
131
- hasNextPage
132
- ]);
133
- // Derived once here so the table, the grid and the bulk bar all agree on what
134
- // is on screen — in mixed mode that is not simply every folder.
135
- const renderedKeys$1 = renderedKeys.buildRenderedKeys({
136
- folders,
137
- assets,
138
- mixedItems
139
- });
140
- const loadMoreRef = useInfiniteScrollSentinel.useInfiniteScrollSentinel({
141
- hasNextPage,
142
- isFetchingMore,
143
- onLoadMore: fetchNextPage,
144
- options: INTERSECTION_OPTIONS
145
- });
146
- if (isLoading) {
147
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
148
- justifyContent: "center",
149
- padding: 8,
150
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
151
- children: formatMessage({
152
- id: 'app.loading',
153
- defaultMessage: 'Loading...'
154
- })
155
- })
156
- });
157
- }
158
- if (error) {
159
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
160
- padding: 8,
161
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
162
- textColor: "danger600",
163
- children: formatMessage({
164
- id: translations.getTranslationKey('list.assets.error'),
165
- defaultMessage: 'An error occurred while fetching assets.'
166
- })
167
- })
168
- });
169
- }
170
- if (folders.length === 0 && assets.length === 0) {
171
- // While searching, the search empty state wins (it names the query); a
172
- // filter-only dead end gets the filtered variant with its Clear action.
173
- return hasActiveFilters && !searchQuery ? /*#__PURE__*/ jsxRuntime.jsx(EmptyState.FilteredEmptyState, {
174
- onClearFilters: onClearFilters
175
- }) : /*#__PURE__*/ jsxRuntime.jsx(EmptyState.EmptyState, {
176
- onAddAssets: onAddAssets,
177
- canAddAssets: canAddAssets,
178
- searchQuery: searchQuery,
179
- onClearSearch: onClearSearch
180
- });
181
- }
182
- return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
183
- children: [
184
- /*#__PURE__*/ jsxRuntime.jsx(ItemContextMenu.ItemContextMenuProvider, {
185
- locations: locations,
186
- children: isGridView ? /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
187
- folders: folders,
188
- assets: assets,
189
- renderedKeys: renderedKeys$1,
190
- onAssetItemClick: onAssetItemClick
191
- }) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
192
- assets: assets,
193
- folders: folders,
194
- mixedItems: mixedItems,
195
- renderedKeys: renderedKeys$1,
196
- onAssetItemClick: onAssetItemClick
197
- })
198
- }),
199
- /*#__PURE__*/ jsxRuntime.jsx("div", {
200
- ref: loadMoreRef,
201
- style: {
202
- height: 1
203
- }
204
- }),
205
- isFetchingMore && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
206
- justifyContent: "center",
207
- padding: 4,
208
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
209
- children: formatMessage({
210
- id: translations.getTranslationKey('list.assets.loading-more'),
211
- defaultMessage: 'Loading more assets...'
212
- })
213
- })
214
- }),
215
- /*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {
216
- assets: assets,
217
- renderedKeys: renderedKeys$1,
218
- locations: locations
219
- })
220
- ]
221
- });
222
- };
223
71
  const ClearSelectionOnChange = ({ listQueryKey })=>{
224
72
  const { clear } = useAssetSelection.useAssetSelection();
225
73
  React.useEffect(()=>{
@@ -232,50 +80,7 @@ const ClearSelectionOnChange = ({ listQueryKey })=>{
232
80
  };
233
81
  /* -------------------------------------------------------------------------------------------------
234
82
  * AssetsPage
235
- * -----------------------------------------------------------------------------------------------*/ /**
236
- * Mirrors the design-system Toggle look (grey track, white active segment
237
- * card) — reproduced locally because the DS component is a labels-only
238
- * boolean input (no icons) and paints its left segment in danger red. Here
239
- * both segments use the primary blue when active.
240
- */ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
241
- display: flex;
242
- padding: ${({ theme })=>theme.spaces[1]};
243
- background: ${({ theme })=>theme.colors.neutral100};
244
- border: 1px solid ${({ theme })=>theme.colors.neutral200};
245
- border-radius: ${({ theme })=>theme.borderRadius};
246
- `;
247
- const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
248
- display: flex;
249
- flex: 1 1 50%;
250
- align-items: center;
251
- justify-content: center;
252
- gap: ${({ theme })=>theme.spaces[2]};
253
- padding: 0.6rem ${({ theme })=>theme.spaces[3]};
254
- border: 1px solid transparent;
255
- border-radius: ${({ theme })=>theme.borderRadius};
256
- background: transparent;
257
- color: ${({ theme })=>theme.colors.neutral600};
258
- cursor: pointer;
259
- font-size: ${({ theme })=>theme.fontSizes[1]};
260
- font-weight: ${({ theme })=>theme.fontWeights.semiBold};
261
- white-space: nowrap;
262
-
263
- &:hover {
264
- color: ${({ theme })=>theme.colors.neutral700};
265
- }
266
-
267
- &[data-state='on'] {
268
- background: ${({ theme })=>theme.colors.neutral0};
269
- border-color: ${({ theme })=>theme.colors.neutral200};
270
- color: ${({ theme })=>theme.colors.primary600};
271
- }
272
-
273
- svg {
274
- width: 1.6rem;
275
- height: 1.6rem;
276
- }
277
- `;
278
- // A single sticky header — same layout scrolled or not, so the toolbar
83
+ * -----------------------------------------------------------------------------------------------*/ // A single sticky header — same layout scrolled or not, so the toolbar
279
84
  // alignment can't reflow the way the shared sticky header did. Once the list
280
85
  // scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it
281
86
  // off the rows), like the sticky headers elsewhere in the admin. Horizontal
@@ -385,73 +190,18 @@ const SearchSlot = styledComponents.styled(designSystem.Box)`
385
190
  flex: 0 1 auto;
386
191
  }
387
192
  `;
388
- // Toggle labels are hidden below desktop — icons only (buttons keep aria-label).
389
- const ToggleLabel = styledComponents.styled.span`
390
- display: none;
391
-
392
- ${({ theme })=>theme.breakpoints.large} {
393
- display: inline;
394
- }
395
- `;
396
193
  const AssetsPage = ()=>{
397
194
  const { formatMessage } = reactIntl.useIntl();
398
195
  const { openDetails } = AssetDetailsDrawer.useAssetDetailsParam();
399
196
  const { canCreate, canUpdate } = useMediaLibraryPermissions.useMediaLibraryPermissions();
400
- const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation.useFolderNavigation();
401
- // Deleted or missing folders (404) need a fetch — handled here, not in
402
- // `useFolderNavigation` (which only strips malformed ?folder= values).
403
- const { error: currentFolderError } = folders.useGetFolderQuery({
404
- id: currentFolderId
405
- }, {
406
- skip: currentFolderId === null
407
- });
408
- React.useEffect(()=>{
409
- if (currentFolderError?.name === 'NotFoundError') {
410
- navigateToRoot();
411
- }
412
- }, [
413
- currentFolderError,
414
- navigateToRoot
415
- ]);
197
+ const { currentFolderId, navigateToFolderId, searchQuery, isSearching, clearSearch, listSort, listFilters, assets, subscribers: assetPageSubscribers, pagination, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, assetsError, folders, isLoadingFolders } = useAssetsList.useAssetsList();
416
198
  const { title, itemCount } = useFolderInfo.useFolderInfo(currentFolderId);
417
- const { searchQuery, isSearching, clearSearch } = useAssetSearch.useAssetSearch();
418
- const listSort = useListSort.useListSort();
419
- const listFilters = useListFilters.useListFilters();
420
- // Resolve relative presets against "now" only when the filters change —
421
- // keeps the query args (and RTK cache keys) stable between renders.
422
- const builtFilters = React.useMemo(()=>buildAssetFilters.buildAssetFilters(listFilters.filters, new Date()), // eslint-disable-next-line react-hooks/exhaustive-deps -- serialized is the value identity of filters
423
- [
424
- listFilters.serialized
425
- ]);
426
- const { assets, subscribers: assetPageSubscribers, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets.useInfiniteAssets({
427
- // The real folder is passed even while searching: the service drops the folder
428
- // filter when `search` is set, so results are still global. List filters
429
- // compose with both modes.
430
- folder: currentFolderId,
431
- search: searchQuery || undefined,
432
- sort: listSort.assetsSort,
433
- filters: builtFilters.fileClauses,
434
- enabled: builtFilters.showFiles
435
- });
436
- const { data: fetchedFolders = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
437
- parentId: currentFolderId,
438
- search: searchQuery || undefined,
439
- sort: listSort.foldersSort,
440
- filters: builtFilters.folderClauses
441
- }, {
442
- skip: !builtFilters.showFolders
443
- });
444
- // A type badge can exclude folders structurally (e.g. "Type is Picture").
445
- const folders$1 = React.useMemo(()=>builtFilters.showFolders ? fetchedFolders : [], [
446
- builtFilters.showFolders,
447
- fetchedFolders
448
- ]);
449
199
  // Both move affordances (drag and the bulk bar) resolve each item's parent
450
200
  // from the rows on screen — while searching, results are global and the
451
201
  // folder currently open says nothing about where an item lives.
452
- const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders$1), [
202
+ const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders), [
453
203
  assets,
454
- folders$1
204
+ folders
455
205
  ]);
456
206
  const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
457
207
  count: itemCount
@@ -462,7 +212,7 @@ const AssetsPage = ()=>{
462
212
  }, {
463
213
  query: searchQuery
464
214
  });
465
- const numberFolders = folders$1.length;
215
+ const numberFolders = folders.length;
466
216
  const numberAssets = pagination?.total ?? 0;
467
217
  const searchResultsCountLabel = formatMessage(getSearchResultsCountMessage(numberFolders, numberAssets), {
468
218
  numberFolders,
@@ -723,48 +473,9 @@ const AssetsPage = ()=>{
723
473
  showFoldersGroup: !isGridView
724
474
  })
725
475
  }),
726
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
727
- type: "single",
728
- value: isGridView ? 'grid' : 'table',
729
- onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
730
- "aria-label": formatMessage({
731
- id: translations.getTranslationKey('view.switch.label'),
732
- defaultMessage: 'View options'
733
- }),
734
- children: [
735
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
736
- value: "table",
737
- "aria-label": formatMessage({
738
- id: translations.getTranslationKey('view.table'),
739
- defaultMessage: 'Table view'
740
- }),
741
- children: [
742
- /*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
743
- /*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
744
- children: formatMessage({
745
- id: translations.getTranslationKey('view.table'),
746
- defaultMessage: 'Table view'
747
- })
748
- })
749
- ]
750
- }),
751
- /*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
752
- value: "grid",
753
- "aria-label": formatMessage({
754
- id: translations.getTranslationKey('view.grid'),
755
- defaultMessage: 'Grid view'
756
- }),
757
- children: [
758
- /*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
759
- /*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
760
- children: formatMessage({
761
- id: translations.getTranslationKey('view.grid'),
762
- defaultMessage: 'Grid view'
763
- })
764
- })
765
- ]
766
- })
767
- ]
476
+ /*#__PURE__*/ jsxRuntime.jsx(ViewToggle.ViewToggle, {
477
+ view: view,
478
+ onChange: setView
768
479
  })
769
480
  ]
770
481
  })
@@ -785,9 +496,9 @@ const AssetsPage = ()=>{
785
496
  uploadDropZoneRef: uploadDropZoneRef,
786
497
  folderName: title
787
498
  }),
788
- /*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
499
+ /*#__PURE__*/ jsxRuntime.jsx(AssetsView.AssetsView, {
789
500
  view: view,
790
- folders: folders$1,
501
+ folders: folders,
791
502
  isLoadingFolders: isLoadingFolders,
792
503
  assets: assets,
793
504
  isLoadingAssets: isLoadingAssets,
@@ -831,7 +542,7 @@ const AssetsPage = ()=>{
831
542
  onClose: ()=>setIsUrlDialogOpen(false),
832
543
  onUpload: handleUrlUpload
833
544
  }),
834
- /*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.AssetDetailsDrawer, {})
545
+ /*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.AssetDetailsDrawerFromUrl, {})
835
546
  ]
836
547
  });
837
548
  };