@strapi/upload 5.51.0 → 5.51.2

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 (346) hide show
  1. package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
  2. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  3. package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
  4. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  5. package/dist/admin/components/TableList/TableList.js +1 -1
  6. package/dist/admin/components/TableList/TableList.js.map +1 -1
  7. package/dist/admin/components/TableList/TableList.mjs +1 -1
  8. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  9. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
  10. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  11. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
  12. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  13. package/dist/admin/future/components/Drawer.js +3 -1
  14. package/dist/admin/future/components/Drawer.js.map +1 -1
  15. package/dist/admin/future/components/Drawer.mjs +3 -1
  16. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  17. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  18. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  19. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  20. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  21. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  22. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  23. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  24. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/AssetsPage.js +344 -150
  26. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/AssetsPage.mjs +343 -149
  28. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
  30. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
  32. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  33. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
  34. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  35. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
  36. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  37. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -19
  38. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -20
  40. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
  42. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
  44. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetsTable.js +218 -37
  46. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  47. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +219 -38
  48. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  49. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +370 -0
  50. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
  51. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +368 -0
  52. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
  53. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
  54. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
  55. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
  56. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
  57. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  58. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  60. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  61. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +129 -37
  62. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +131 -39
  64. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
  66. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
  68. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
  70. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
  72. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
  74. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
  76. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
  78. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
  80. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
  82. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  83. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
  84. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  85. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
  86. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
  87. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
  88. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
  89. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  90. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  92. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  94. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  96. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/components/FilterBadges.js +408 -0
  98. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  99. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
  100. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  101. package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
  102. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  103. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
  104. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  105. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +195 -40
  106. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +198 -43
  108. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
  110. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
  112. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
  114. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
  116. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/components/SortMenu.js +154 -0
  118. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
  119. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +152 -0
  120. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
  121. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  122. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  124. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +75 -0
  126. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
  127. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +71 -0
  128. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
  129. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  130. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  131. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  132. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  133. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -4
  134. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  135. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
  136. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  137. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  138. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  139. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  140. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  141. package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
  142. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
  143. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
  144. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
  145. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  146. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  147. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  148. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  149. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
  150. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
  151. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
  152. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
  153. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
  154. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
  155. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
  156. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
  157. package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
  158. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
  159. package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
  160. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
  161. package/dist/admin/future/services/api.js +163 -28
  162. package/dist/admin/future/services/api.js.map +1 -1
  163. package/dist/admin/future/services/api.mjs +163 -30
  164. package/dist/admin/future/services/api.mjs.map +1 -1
  165. package/dist/admin/future/services/assets.js +62 -18
  166. package/dist/admin/future/services/assets.js.map +1 -1
  167. package/dist/admin/future/services/assets.mjs +62 -19
  168. package/dist/admin/future/services/assets.mjs.map +1 -1
  169. package/dist/admin/future/services/folders.js +31 -19
  170. package/dist/admin/future/services/folders.js.map +1 -1
  171. package/dist/admin/future/services/folders.mjs +31 -19
  172. package/dist/admin/future/services/folders.mjs.map +1 -1
  173. package/dist/admin/future/services/settings.js +10 -3
  174. package/dist/admin/future/services/settings.js.map +1 -1
  175. package/dist/admin/future/services/settings.mjs +10 -3
  176. package/dist/admin/future/services/settings.mjs.map +1 -1
  177. package/dist/admin/future/store/uploadProgress.js +109 -2
  178. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  179. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  180. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  181. package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
  182. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
  183. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
  184. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
  185. package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
  186. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
  187. package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
  188. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
  189. package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
  190. package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
  191. package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
  192. package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
  193. package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
  194. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
  195. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
  196. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
  197. package/dist/admin/future/utils/getFolderLabel.js +31 -0
  198. package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
  199. package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
  200. package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
  201. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  202. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  203. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  204. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  205. package/dist/admin/hooks/useSelectionState.js +2 -4
  206. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  207. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  208. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  209. package/dist/admin/shared/constants.js +43 -0
  210. package/dist/admin/shared/constants.js.map +1 -0
  211. package/dist/admin/shared/constants.mjs +38 -0
  212. package/dist/admin/shared/constants.mjs.map +1 -0
  213. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  214. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  215. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  216. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
  217. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -0
  218. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
  219. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  220. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
  221. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
  222. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
  223. package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
  224. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
  225. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
  226. package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
  227. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  228. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  229. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +6 -0
  230. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
  231. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  232. package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
  233. package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
  234. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +23 -0
  235. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  236. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +46 -0
  237. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
  238. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  239. package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
  240. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  241. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +29 -0
  242. package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
  243. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
  244. package/dist/admin/src/future/services/api.d.ts +53 -5
  245. package/dist/admin/src/future/services/assets.d.ts +13 -2
  246. package/dist/admin/src/future/services/folders.d.ts +7 -1
  247. package/dist/admin/src/future/services/settings.d.ts +2 -2
  248. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  249. package/dist/admin/src/future/types/dnd.d.ts +5 -0
  250. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
  251. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
  252. package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
  253. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
  254. package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
  255. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  256. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  257. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  258. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  259. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  260. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  261. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  262. package/dist/admin/translations/en.json.js +85 -2
  263. package/dist/admin/translations/en.json.js.map +1 -1
  264. package/dist/admin/translations/en.json.mjs +85 -2
  265. package/dist/admin/translations/en.json.mjs.map +1 -1
  266. package/dist/admin/utils/urlYupSchema.js +33 -9
  267. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  268. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  269. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  270. package/dist/server/config.js +13 -5
  271. package/dist/server/config.js.map +1 -1
  272. package/dist/server/config.mjs +13 -5
  273. package/dist/server/config.mjs.map +1 -1
  274. package/dist/server/constants.js.map +1 -1
  275. package/dist/server/constants.mjs.map +1 -1
  276. package/dist/server/controllers/admin-file.js +30 -0
  277. package/dist/server/controllers/admin-file.js.map +1 -1
  278. package/dist/server/controllers/admin-file.mjs +30 -0
  279. package/dist/server/controllers/admin-file.mjs.map +1 -1
  280. package/dist/server/controllers/admin-settings.js +20 -2
  281. package/dist/server/controllers/admin-settings.js.map +1 -1
  282. package/dist/server/controllers/admin-settings.mjs +21 -3
  283. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  284. package/dist/server/controllers/content-api.js +1 -2
  285. package/dist/server/controllers/content-api.js.map +1 -1
  286. package/dist/server/controllers/content-api.mjs +2 -2
  287. package/dist/server/controllers/content-api.mjs.map +1 -1
  288. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  289. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  290. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  291. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  292. package/dist/server/controllers/validation/admin/settings.js +4 -1
  293. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  294. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  295. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  296. package/dist/server/routes/admin.js +18 -0
  297. package/dist/server/routes/admin.js.map +1 -1
  298. package/dist/server/routes/admin.mjs +18 -0
  299. package/dist/server/routes/admin.mjs.map +1 -1
  300. package/dist/server/services/ai-metadata.js +108 -11
  301. package/dist/server/services/ai-metadata.js.map +1 -1
  302. package/dist/server/services/ai-metadata.mjs +108 -11
  303. package/dist/server/services/ai-metadata.mjs.map +1 -1
  304. package/dist/server/services/file.js +86 -13
  305. package/dist/server/services/file.js.map +1 -1
  306. package/dist/server/services/file.mjs +87 -14
  307. package/dist/server/services/file.mjs.map +1 -1
  308. package/dist/server/services/image-manipulation.js +4 -4
  309. package/dist/server/services/image-manipulation.js.map +1 -1
  310. package/dist/server/services/image-manipulation.mjs +4 -4
  311. package/dist/server/services/image-manipulation.mjs.map +1 -1
  312. package/dist/server/shared/constants.js +43 -0
  313. package/dist/server/shared/constants.js.map +1 -0
  314. package/dist/server/shared/constants.mjs +38 -0
  315. package/dist/server/shared/constants.mjs.map +1 -0
  316. package/dist/server/src/config.d.ts +2 -0
  317. package/dist/server/src/config.d.ts.map +1 -1
  318. package/dist/server/src/constants.d.ts +2 -1
  319. package/dist/server/src/constants.d.ts.map +1 -1
  320. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  321. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  322. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  323. package/dist/server/src/controllers/index.d.ts +1 -0
  324. package/dist/server/src/controllers/index.d.ts.map +1 -1
  325. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  326. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  327. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  328. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  329. package/dist/server/src/index.d.ts +7 -1
  330. package/dist/server/src/index.d.ts.map +1 -1
  331. package/dist/server/src/routes/admin.d.ts.map +1 -1
  332. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  333. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  334. package/dist/server/src/services/file.d.ts +12 -2
  335. package/dist/server/src/services/file.d.ts.map +1 -1
  336. package/dist/server/src/services/index.d.ts +4 -1
  337. package/dist/server/src/services/index.d.ts.map +1 -1
  338. package/dist/server/src/types.d.ts +3 -0
  339. package/dist/server/src/types.d.ts.map +1 -1
  340. package/dist/shared/constants.d.ts +35 -0
  341. package/dist/shared/constants.d.ts.map +1 -0
  342. package/dist/shared/contracts/files.d.ts +25 -0
  343. package/dist/shared/contracts/files.d.ts.map +1 -1
  344. package/dist/shared/contracts/folders.d.ts +1 -1
  345. package/dist/shared/contracts/settings.d.ts +7 -0
  346. package/package.json +8 -8
@@ -1,42 +1,94 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { useEffect, useState, useRef, useCallback } from 'react';
2
+ import { useEffect, useMemo, useState, useRef, useCallback } from 'react';
3
3
  import * as ToggleGroup from '@radix-ui/react-toggle-group';
4
4
  import { usePersistentState, Layouts, useElementOnScreen } from '@strapi/admin/strapi-admin';
5
5
  import { Box, VisuallyHidden, Flex, SimpleMenu, MenuItem, Loader, Typography } from '@strapi/design-system';
6
6
  import { List, GridFour, Folder, Files, Link, ChevronDown } from '@strapi/icons';
7
7
  import { useIntl } from 'react-intl';
8
8
  import { styled } from 'styled-components';
9
+ import { useAIAvailability } from '../../../hooks/useAiAvailability.mjs';
10
+ import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions.mjs';
9
11
  import { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api.mjs';
10
12
  import { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders.mjs';
13
+ import { useGetUploadSettingsQuery } from '../../services/settings.mjs';
11
14
  import { getTranslationKey } from '../../utils/translations.mjs';
12
15
  import { useAssetDetailsParam, AssetDetailsDrawer } from './components/AssetDetails/AssetDetailsDrawer.mjs';
13
16
  import { AssetsGrid } from './components/AssetsGrid.mjs';
17
+ import { AssetsSearchInput } from './components/AssetsSearchInput.mjs';
14
18
  import { AssetsTable } from './components/AssetsTable.mjs';
19
+ import { BulkActionsBar } from './components/BulkActionsBar.mjs';
15
20
  import { CreateFolderDialog } from './components/CreateFolderDialog.mjs';
16
21
  import { AssetsDndProvider } from './components/Dnd/AssetsDndProvider.mjs';
17
22
  import { DropZoneWithOverlay, DropFilesMessage } from './components/DropZone/UploadDropZone.mjs';
18
23
  import { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext.mjs';
19
- import { EmptyState } from './components/EmptyState.mjs';
24
+ import { FilteredEmptyState, EmptyState } from './components/EmptyState.mjs';
25
+ import { FilterBadges } from './components/FilterBadges.mjs';
26
+ import { FilterMenu } from './components/FilterMenu.mjs';
20
27
  import { FolderTree } from './components/FolderTree/FolderTree.mjs';
21
28
  import { ImportFromUrlDialog } from './components/ImportFromUrlDialog.mjs';
29
+ import { SortMenu } from './components/SortMenu.mjs';
22
30
  import { localStorageKeys, viewOptions } from './constants.mjs';
31
+ import { useAssetSearch } from './hooks/useAssetSearch.mjs';
32
+ import { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection.mjs';
23
33
  import { useFolderInfo } from './hooks/useFolderInfo.mjs';
24
34
  import { useFolderNavigation } from './hooks/useFolderNavigation.mjs';
25
35
  import { useInfiniteAssets } from './hooks/useInfiniteAssets.mjs';
36
+ import { useListFilters } from './hooks/useListFilters.mjs';
37
+ import { useListSort } from './hooks/useListSort.mjs';
38
+ import { buildAssetFilters } from './utils/buildAssetFilters.mjs';
39
+ import { getListQueryKey } from './utils/listQueryKey.mjs';
40
+ import { mergeMixedList } from './utils/mergeMixedList.mjs';
26
41
 
27
42
  const INTERSECTION_OPTIONS = {
28
43
  threshold: 0.1
29
44
  };
30
- const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
45
+ const ITEM_COUNT_MESSAGE = {
46
+ id: getTranslationKey('header.content.item-count'),
47
+ defaultMessage: '{count, plural, =1 {# item} other {# items}}'
48
+ };
49
+ const SEARCH_RESULTS_COUNT_MESSAGES = {
50
+ both: {
51
+ id: getTranslationKey('header.search-results.count'),
52
+ defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}'
53
+ },
54
+ folders: {
55
+ id: getTranslationKey('header.search-results.count.folders'),
56
+ defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}'
57
+ },
58
+ assets: {
59
+ id: getTranslationKey('header.search-results.count.assets'),
60
+ defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}'
61
+ }
62
+ };
63
+ const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
64
+ if (numberFolders === 0) {
65
+ return SEARCH_RESULTS_COUNT_MESSAGES.assets;
66
+ }
67
+ if (numberAssets === 0) {
68
+ return SEARCH_RESULTS_COUNT_MESSAGES.folders;
69
+ }
70
+ return SEARCH_RESULTS_COUNT_MESSAGES.both;
71
+ };
72
+ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
31
73
  const { formatMessage } = useIntl();
32
- const { assets, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error } = useInfiniteAssets({
33
- folder: folderId
34
- });
35
- const { data: folders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({
36
- parentId: folderId
37
- });
38
74
  const isGridView = view === viewOptions.GRID;
39
75
  const isLoading = isLoadingAssets || isLoadingFolders;
76
+ // "Folders: Mixed with files" — interleave the complete folder list into the
77
+ // loaded asset stream client-side, following the active sort. Table view
78
+ // only: the grid always keeps folders in their own band on top.
79
+ const mixedItems = useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList({
80
+ folders,
81
+ assets,
82
+ sort: assetsSort,
83
+ hasNextPage
84
+ }) : null, [
85
+ foldersPosition,
86
+ isGridView,
87
+ folders,
88
+ assets,
89
+ assetsSort,
90
+ hasNextPage
91
+ ]);
40
92
  const loadMoreRef = useElementOnScreen(useCallback((isVisible)=>{
41
93
  if (isVisible && hasNextPage && !isFetchingMore) {
42
94
  fetchNextPage();
@@ -71,8 +123,15 @@ const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
71
123
  });
72
124
  }
73
125
  if (folders.length === 0 && assets.length === 0) {
74
- return /*#__PURE__*/ jsx(EmptyState, {
75
- onAddAssets: onAddAssets
126
+ // While searching, the search empty state wins (it names the query); a
127
+ // filter-only dead end gets the filtered variant with its Clear action.
128
+ return hasActiveFilters && !searchQuery ? /*#__PURE__*/ jsx(FilteredEmptyState, {
129
+ onClearFilters: onClearFilters
130
+ }) : /*#__PURE__*/ jsx(EmptyState, {
131
+ onAddAssets: onAddAssets,
132
+ canAddAssets: canAddAssets,
133
+ searchQuery: searchQuery,
134
+ onClearSearch: onClearSearch
76
135
  });
77
136
  }
78
137
  return /*#__PURE__*/ jsxs(Fragment, {
@@ -84,6 +143,7 @@ const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
84
143
  }) : /*#__PURE__*/ jsx(AssetsTable, {
85
144
  assets: assets,
86
145
  folders: folders,
146
+ mixedItems: mixedItems,
87
147
  onAssetItemClick: onAssetItemClick
88
148
  }),
89
149
  /*#__PURE__*/ jsx("div", {
@@ -101,36 +161,61 @@ const AssetsView = ({ view, folderId, onAssetItemClick, onAddAssets })=>{
101
161
  defaultMessage: 'Loading more assets...'
102
162
  })
103
163
  })
164
+ }),
165
+ /*#__PURE__*/ jsx(BulkActionsBar, {
166
+ assets: assets
104
167
  })
105
168
  ]
106
169
  });
107
170
  };
171
+ const ClearSelectionOnChange = ({ listQueryKey })=>{
172
+ const { clear } = useAssetSelection();
173
+ useEffect(()=>{
174
+ clear();
175
+ }, [
176
+ listQueryKey,
177
+ clear
178
+ ]);
179
+ return null;
180
+ };
108
181
  /* -------------------------------------------------------------------------------------------------
109
182
  * AssetsPage
110
- * -----------------------------------------------------------------------------------------------*/ const StyledToggleGroup = styled(ToggleGroup.Root)`
183
+ * -----------------------------------------------------------------------------------------------*/ /**
184
+ * Mirrors the design-system Toggle look (grey track, white active segment
185
+ * card) — reproduced locally because the DS component is a labels-only
186
+ * boolean input (no icons) and paints its left segment in danger red. Here
187
+ * both segments use the primary blue when active.
188
+ */ const StyledToggleGroup = styled(ToggleGroup.Root)`
111
189
  display: flex;
190
+ padding: ${({ theme })=>theme.spaces[1]};
191
+ background: ${({ theme })=>theme.colors.neutral100};
112
192
  border: 1px solid ${({ theme })=>theme.colors.neutral200};
113
193
  border-radius: ${({ theme })=>theme.borderRadius};
114
- overflow: hidden;
115
194
  `;
116
195
  const StyledToggleItem = styled(ToggleGroup.Item)`
117
196
  display: flex;
197
+ flex: 1 1 50%;
118
198
  align-items: center;
199
+ justify-content: center;
119
200
  gap: ${({ theme })=>theme.spaces[2]};
120
- padding: ${({ theme })=>`${theme.spaces[2]} ${theme.spaces[4]}`};
121
- border: none;
122
- background: ${({ theme })=>theme.colors.neutral0};
123
- color: ${({ theme })=>theme.colors.neutral800};
201
+ padding: 0.6rem ${({ theme })=>theme.spaces[3]};
202
+ border: 1px solid transparent;
203
+ border-radius: ${({ theme })=>theme.borderRadius};
204
+ background: transparent;
205
+ color: ${({ theme })=>theme.colors.neutral600};
124
206
  cursor: pointer;
125
207
  font-size: ${({ theme })=>theme.fontSizes[1]};
126
208
  font-weight: ${({ theme })=>theme.fontWeights.semiBold};
209
+ white-space: nowrap;
127
210
 
128
211
  &:hover {
129
- background: ${({ theme })=>theme.colors.primary100};
212
+ color: ${({ theme })=>theme.colors.neutral700};
130
213
  }
131
214
 
132
215
  &[data-state='on'] {
133
- background: ${({ theme })=>theme.colors.neutral150};
216
+ background: ${({ theme })=>theme.colors.neutral0};
217
+ border-color: ${({ theme })=>theme.colors.neutral200};
218
+ color: ${({ theme })=>theme.colors.primary600};
134
219
  }
135
220
 
136
221
  svg {
@@ -150,6 +235,7 @@ const HeaderWrapper = styled(Box)`
150
235
  const AssetsPage = ()=>{
151
236
  const { formatMessage } = useIntl();
152
237
  const { openDetails } = useAssetDetailsParam();
238
+ const { canCreate, canUpdate } = useMediaLibraryPermissions();
153
239
  const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation();
154
240
  // Deleted or missing folders (404) need a fetch — handled here, not in
155
241
  // `useFolderNavigation` (which only strips malformed ?folder= values).
@@ -167,16 +253,65 @@ const AssetsPage = ()=>{
167
253
  navigateToRoot
168
254
  ]);
169
255
  const { title, itemCount } = useFolderInfo(currentFolderId);
170
- const itemCountLabel = formatMessage({
171
- id: getTranslationKey('header.content.item-count'),
172
- defaultMessage: '{count, plural, =1 {# item} other {# items}}'
256
+ const { searchQuery, isSearching, clearSearch } = useAssetSearch();
257
+ const listSort = useListSort();
258
+ const listFilters = useListFilters();
259
+ // Resolve relative presets against "now" only when the filters change —
260
+ // keeps the query args (and RTK cache keys) stable between renders.
261
+ const builtFilters = useMemo(()=>buildAssetFilters(listFilters.filters, new Date()), // eslint-disable-next-line react-hooks/exhaustive-deps -- serialized is the value identity of filters
262
+ [
263
+ listFilters.serialized
264
+ ]);
265
+ const { assets, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets({
266
+ // The real folder is passed even while searching: the service drops the folder
267
+ // filter when `search` is set, so results are still global. List filters
268
+ // compose with both modes.
269
+ folder: currentFolderId,
270
+ search: searchQuery || undefined,
271
+ sort: listSort.assetsSort,
272
+ filters: builtFilters.fileClauses,
273
+ filtersKey: listFilters.serialized,
274
+ enabled: builtFilters.showFiles
275
+ });
276
+ const { data: fetchedFolders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({
277
+ parentId: currentFolderId,
278
+ search: searchQuery || undefined,
279
+ sort: listSort.foldersSort,
280
+ filters: builtFilters.folderClauses
173
281
  }, {
282
+ skip: !builtFilters.showFolders
283
+ });
284
+ // A type badge can exclude folders structurally (e.g. "Type is Picture").
285
+ const folders = useMemo(()=>builtFilters.showFolders ? fetchedFolders : [], [
286
+ builtFilters.showFolders,
287
+ fetchedFolders
288
+ ]);
289
+ const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
174
290
  count: itemCount
175
291
  });
176
- const pageHeaderTitle = title ? `${title} (${itemCountLabel})` : formatMessage({
177
- id: 'app.loading',
178
- defaultMessage: 'Loading...'
292
+ const searchResultsTitle = formatMessage({
293
+ id: getTranslationKey('header.search-results'),
294
+ defaultMessage: 'Search results for "{query}"'
295
+ }, {
296
+ query: searchQuery
179
297
  });
298
+ const numberFolders = folders.length;
299
+ const numberAssets = pagination?.total ?? 0;
300
+ const searchResultsCountLabel = formatMessage(getSearchResultsCountMessage(numberFolders, numberAssets), {
301
+ numberFolders,
302
+ numberAssets
303
+ });
304
+ let pageHeaderTitle;
305
+ if (isSearching) {
306
+ pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;
307
+ } else if (title) {
308
+ pageHeaderTitle = `${title} (${itemCountLabel})`;
309
+ } else {
310
+ pageHeaderTitle = formatMessage({
311
+ id: 'app.loading',
312
+ defaultMessage: 'Loading...'
313
+ });
314
+ }
180
315
  const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = useState(false);
181
316
  // View state
182
317
  const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);
@@ -189,6 +324,13 @@ const AssetsPage = ()=>{
189
324
  // Upload handlers
190
325
  const [uploadFiles] = useUploadFilesMutation();
191
326
  const [uploadFromUrls] = useUploadFromUrlsMutation();
327
+ // `concurrentUploadRequests` echoes the app config. Missing settings (still
328
+ // loading, no permission) fall back to sequential — never faster than the
329
+ // server asked for.
330
+ const { data: settings } = useGetUploadSettingsQuery();
331
+ const concurrency = settings?.data?.concurrentUploadRequests ?? 1;
332
+ // Drives the post-upload AI metadata phase shown per row in the progress dialog.
333
+ const { isEnabled: isAiMetadataEnabled } = useAIAvailability();
192
334
  const uploadFilesToFolder = async (files, folderId)=>{
193
335
  if (files.length === 0) return;
194
336
  const formData = new FormData();
@@ -206,9 +348,11 @@ const AssetsPage = ()=>{
206
348
  try {
207
349
  await uploadFiles({
208
350
  formData,
209
- totalFiles: files.length
351
+ totalFiles: files.length,
352
+ concurrency,
353
+ generateAiMetadata: Boolean(isAiMetadataEnabled)
210
354
  }).unwrap();
211
- } catch (error) {
355
+ } catch {
212
356
  // Error is already dispatched to store from the API queryFn
213
357
  }
214
358
  };
@@ -223,160 +367,210 @@ const AssetsPage = ()=>{
223
367
  e.target.value = '';
224
368
  };
225
369
  const handleDrop = async (files)=>{
370
+ // Defence in depth: the provider is `disabled` without `assets.create`
371
+ // (so onDrop won't fire), but guard here too in case it's ever wired live.
372
+ if (!canCreate) return;
226
373
  await uploadFilesToFolder(files, currentFolderId);
227
374
  };
228
375
  const handleUrlUpload = async (urls)=>{
229
376
  try {
230
377
  await uploadFromUrls({
231
378
  urls,
232
- folderId: currentFolderId
379
+ folderId: currentFolderId,
380
+ generateAiMetadata: Boolean(isAiMetadataEnabled)
233
381
  }).unwrap();
234
- } catch (error) {
382
+ } catch {
235
383
  // Error is already dispatched to store from the API queryFn
236
384
  }
237
385
  };
386
+ // The view is deliberately absent: table and grid render the same list, so
387
+ // toggling views keeps the selection.
388
+ const listQueryKey = getListQueryKey({
389
+ folderId: currentFolderId,
390
+ search: searchQuery,
391
+ // Folder position changes the render order too — selection must reset.
392
+ sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,
393
+ filter: listFilters.serialized || null
394
+ });
238
395
  return /*#__PURE__*/ jsxs(Fragment, {
239
396
  children: [
240
397
  /*#__PURE__*/ jsx(UploadDropZoneProvider, {
241
398
  onDrop: handleDrop,
242
- children: /*#__PURE__*/ jsx(AssetsDndProvider, {
243
- children: /*#__PURE__*/ jsx(Box, {
244
- ref: uploadDropZoneRef,
245
- children: /*#__PURE__*/ jsxs(Layouts.Root, {
246
- minHeight: "100vh",
247
- background: "neutral0",
248
- sideNav: /*#__PURE__*/ jsx(FolderTree, {
249
- currentFolderId: currentFolderId,
250
- onSelectFolder: navigateToFolderId
399
+ disabled: !canCreate,
400
+ children: /*#__PURE__*/ jsx(AssetSelectionProvider, {
401
+ disabled: !canUpdate,
402
+ children: /*#__PURE__*/ jsxs(AssetsDndProvider, {
403
+ children: [
404
+ /*#__PURE__*/ jsx(ClearSelectionOnChange, {
405
+ listQueryKey: listQueryKey
251
406
  }),
252
- children: [
253
- /*#__PURE__*/ jsx(VisuallyHidden, {
254
- children: /*#__PURE__*/ jsx("input", {
255
- type: "file",
256
- ref: fileInputRef,
257
- onChange: handleFileChange,
258
- multiple: true
259
- })
260
- }),
261
- /*#__PURE__*/ jsx(HeaderWrapper, {
262
- children: /*#__PURE__*/ jsx(Layouts.Header, {
263
- title: pageHeaderTitle,
264
- primaryAction: /*#__PURE__*/ jsxs(SimpleMenu, {
265
- popoverPlacement: "bottom-end",
266
- variant: "default",
267
- endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
268
- label: formatMessage({
269
- id: getTranslationKey('new'),
270
- defaultMessage: 'New'
271
- }),
272
- children: [
273
- /*#__PURE__*/ jsx(MenuItem, {
274
- onSelect: ()=>setIsCreateFolderDialogOpen(true),
275
- startIcon: /*#__PURE__*/ jsx(Folder, {}),
276
- children: formatMessage({
277
- id: getTranslationKey('folder.create.title'),
278
- defaultMessage: 'New folder'
279
- })
280
- }),
281
- /*#__PURE__*/ jsx(MenuItem, {
282
- onSelect: handleFileSelect,
283
- startIcon: /*#__PURE__*/ jsx(Files, {}),
284
- children: formatMessage({
285
- id: getTranslationKey('import-files'),
286
- defaultMessage: 'Import files'
287
- })
288
- }),
289
- /*#__PURE__*/ jsx(MenuItem, {
290
- onSelect: ()=>setIsUrlDialogOpen(true),
291
- startIcon: /*#__PURE__*/ jsx(Link, {}),
292
- children: formatMessage({
293
- id: getTranslationKey('import-from-url'),
294
- defaultMessage: 'Import from URL'
295
- })
296
- })
297
- ]
407
+ /*#__PURE__*/ jsx(Box, {
408
+ ref: uploadDropZoneRef,
409
+ children: /*#__PURE__*/ jsxs(Layouts.Root, {
410
+ minHeight: "100vh",
411
+ background: "neutral0",
412
+ sideNav: /*#__PURE__*/ jsx(FolderTree, {
413
+ currentFolderId: currentFolderId,
414
+ showActiveFolder: !isSearching,
415
+ onSelectFolder: navigateToFolderId
416
+ }),
417
+ children: [
418
+ /*#__PURE__*/ jsx(VisuallyHidden, {
419
+ children: /*#__PURE__*/ jsx("input", {
420
+ type: "file",
421
+ ref: fileInputRef,
422
+ onChange: handleFileChange,
423
+ multiple: true
424
+ })
298
425
  }),
299
- subtitle: /*#__PURE__*/ jsxs(Flex, {
300
- justifyContent: "space-between",
301
- alignItems: "center",
302
- gap: 4,
303
- width: "100%",
304
- children: [
305
- /*#__PURE__*/ jsx(Flex, {
306
- gap: 4,
307
- alignItems: "center",
308
- children: "TODO: Filters and search"
309
- }),
310
- /*#__PURE__*/ jsxs(Flex, {
311
- gap: 4,
312
- alignItems: "center",
426
+ /*#__PURE__*/ jsx(HeaderWrapper, {
427
+ children: /*#__PURE__*/ jsx(Layouts.Header, {
428
+ title: pageHeaderTitle,
429
+ primaryAction: canCreate && /*#__PURE__*/ jsxs(SimpleMenu, {
430
+ popoverPlacement: "bottom-end",
431
+ variant: "default",
432
+ endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
433
+ label: formatMessage({
434
+ id: getTranslationKey('new'),
435
+ defaultMessage: 'New'
436
+ }),
313
437
  children: [
314
- /*#__PURE__*/ jsx(Box, {
315
- children: "TODO: Sort"
438
+ /*#__PURE__*/ jsx(MenuItem, {
439
+ onSelect: ()=>setIsCreateFolderDialogOpen(true),
440
+ startIcon: /*#__PURE__*/ jsx(Folder, {}),
441
+ children: formatMessage({
442
+ id: getTranslationKey('folder.create.title'),
443
+ defaultMessage: 'New folder'
444
+ })
445
+ }),
446
+ /*#__PURE__*/ jsx(MenuItem, {
447
+ onSelect: handleFileSelect,
448
+ startIcon: /*#__PURE__*/ jsx(Files, {}),
449
+ children: formatMessage({
450
+ id: getTranslationKey('import-files'),
451
+ defaultMessage: 'Import files'
452
+ })
316
453
  }),
317
- /*#__PURE__*/ jsxs(StyledToggleGroup, {
318
- type: "single",
319
- value: isGridView ? 'grid' : 'table',
320
- onValueChange: (value)=>value && setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE),
321
- "aria-label": formatMessage({
322
- id: getTranslationKey('view.switch.label'),
323
- defaultMessage: 'View options'
324
- }),
454
+ /*#__PURE__*/ jsx(MenuItem, {
455
+ onSelect: ()=>setIsUrlDialogOpen(true),
456
+ startIcon: /*#__PURE__*/ jsx(Link, {}),
457
+ children: formatMessage({
458
+ id: getTranslationKey('import-from-url'),
459
+ defaultMessage: 'Import from URL'
460
+ })
461
+ })
462
+ ]
463
+ }),
464
+ subtitle: /*#__PURE__*/ jsxs(Fragment, {
465
+ children: [
466
+ /*#__PURE__*/ jsxs(Flex, {
467
+ justifyContent: "space-between",
468
+ alignItems: "center",
469
+ gap: 4,
470
+ width: "100%",
325
471
  children: [
326
- /*#__PURE__*/ jsxs(StyledToggleItem, {
327
- value: "table",
328
- "aria-label": formatMessage({
329
- id: getTranslationKey('view.table'),
330
- defaultMessage: 'Table view'
331
- }),
472
+ /*#__PURE__*/ jsxs(Flex, {
473
+ gap: 4,
474
+ alignItems: "center",
332
475
  children: [
333
- /*#__PURE__*/ jsx(List, {}),
334
- formatMessage({
335
- id: getTranslationKey('view.table'),
336
- defaultMessage: 'Table view'
337
- })
476
+ /*#__PURE__*/ jsx(FilterMenu, {
477
+ listFilters: listFilters
478
+ }),
479
+ /*#__PURE__*/ jsx(AssetsSearchInput, {})
338
480
  ]
339
481
  }),
340
- /*#__PURE__*/ jsxs(StyledToggleItem, {
341
- value: "grid",
342
- "aria-label": formatMessage({
343
- id: getTranslationKey('view.grid'),
344
- defaultMessage: 'Grid view'
345
- }),
482
+ /*#__PURE__*/ jsxs(Flex, {
483
+ gap: 4,
484
+ alignItems: "center",
346
485
  children: [
347
- /*#__PURE__*/ jsx(GridFour, {}),
348
- formatMessage({
349
- id: getTranslationKey('view.grid'),
350
- defaultMessage: 'Grid view'
486
+ /*#__PURE__*/ jsx(SortMenu, {
487
+ sort: listSort,
488
+ showFoldersGroup: !isGridView
489
+ }),
490
+ /*#__PURE__*/ jsxs(StyledToggleGroup, {
491
+ type: "single",
492
+ value: isGridView ? 'grid' : 'table',
493
+ onValueChange: (value)=>value && setView(value === 'grid' ? viewOptions.GRID : viewOptions.TABLE),
494
+ "aria-label": formatMessage({
495
+ id: getTranslationKey('view.switch.label'),
496
+ defaultMessage: 'View options'
497
+ }),
498
+ children: [
499
+ /*#__PURE__*/ jsxs(StyledToggleItem, {
500
+ value: "table",
501
+ "aria-label": formatMessage({
502
+ id: getTranslationKey('view.table'),
503
+ defaultMessage: 'Table view'
504
+ }),
505
+ children: [
506
+ /*#__PURE__*/ jsx(List, {}),
507
+ formatMessage({
508
+ id: getTranslationKey('view.table'),
509
+ defaultMessage: 'Table view'
510
+ })
511
+ ]
512
+ }),
513
+ /*#__PURE__*/ jsxs(StyledToggleItem, {
514
+ value: "grid",
515
+ "aria-label": formatMessage({
516
+ id: getTranslationKey('view.grid'),
517
+ defaultMessage: 'Grid view'
518
+ }),
519
+ children: [
520
+ /*#__PURE__*/ jsx(GridFour, {}),
521
+ formatMessage({
522
+ id: getTranslationKey('view.grid'),
523
+ defaultMessage: 'Grid view'
524
+ })
525
+ ]
526
+ })
527
+ ]
351
528
  })
352
529
  ]
353
530
  })
354
531
  ]
532
+ }),
533
+ /*#__PURE__*/ jsx(FilterBadges, {
534
+ listFilters: listFilters
355
535
  })
356
536
  ]
357
537
  })
358
- ]
359
- })
360
- })
361
- }),
362
- /*#__PURE__*/ jsx(Layouts.Content, {
363
- children: /*#__PURE__*/ jsxs(DropZoneWithOverlay, {
364
- children: [
365
- /*#__PURE__*/ jsx(DropFilesMessage, {
366
- uploadDropZoneRef: uploadDropZoneRef,
367
- folderName: title
368
- }),
369
- /*#__PURE__*/ jsx(AssetsView, {
370
- view: view,
371
- folderId: currentFolderId,
372
- onAssetItemClick: openDetails,
373
- onAddAssets: handleFileSelect
374
538
  })
375
- ]
376
- })
539
+ }),
540
+ /*#__PURE__*/ jsx(Layouts.Content, {
541
+ children: /*#__PURE__*/ jsxs(DropZoneWithOverlay, {
542
+ children: [
543
+ /*#__PURE__*/ jsx(DropFilesMessage, {
544
+ uploadDropZoneRef: uploadDropZoneRef,
545
+ folderName: title
546
+ }),
547
+ /*#__PURE__*/ jsx(AssetsView, {
548
+ view: view,
549
+ folders: folders,
550
+ isLoadingFolders: isLoadingFolders,
551
+ assets: assets,
552
+ isLoadingAssets: isLoadingAssets,
553
+ isFetchingMore: isFetchingMore,
554
+ hasNextPage: hasNextPage,
555
+ fetchNextPage: fetchNextPage,
556
+ error: assetsError,
557
+ searchQuery: searchQuery,
558
+ assetsSort: listSort.assetsSort,
559
+ foldersPosition: listSort.foldersPosition,
560
+ hasActiveFilters: listFilters.filters.length > 0,
561
+ onClearFilters: listFilters.clearFilters,
562
+ onAssetItemClick: openDetails,
563
+ onAddAssets: handleFileSelect,
564
+ canAddAssets: canCreate,
565
+ onClearSearch: clearSearch
566
+ })
567
+ ]
568
+ })
569
+ })
570
+ ]
377
571
  })
378
- ]
379
- })
572
+ })
573
+ ]
380
574
  })
381
575
  })
382
576
  }),