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