@strapi/upload 5.51.2 → 5.52.1

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 (253) hide show
  1. package/dist/admin/future/App.js +3 -3
  2. package/dist/admin/future/App.js.map +1 -1
  3. package/dist/admin/future/App.mjs +4 -4
  4. package/dist/admin/future/App.mjs.map +1 -1
  5. package/dist/admin/future/components/BetaNotice.js +72 -0
  6. package/dist/admin/future/components/BetaNotice.js.map +1 -0
  7. package/dist/admin/future/components/BetaNotice.mjs +70 -0
  8. package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
  9. package/dist/admin/future/components/Drawer.js +16 -3
  10. package/dist/admin/future/components/Drawer.js.map +1 -1
  11. package/dist/admin/future/components/Drawer.mjs +16 -3
  12. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  13. package/dist/admin/future/components/TruncatedText.js +76 -0
  14. package/dist/admin/future/components/TruncatedText.js.map +1 -0
  15. package/dist/admin/future/components/TruncatedText.mjs +74 -0
  16. package/dist/admin/future/components/TruncatedText.mjs.map +1 -0
  17. package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
  18. package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
  19. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
  20. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
  21. package/dist/admin/future/hooks/useTracking.js +57 -0
  22. package/dist/admin/future/hooks/useTracking.js.map +1 -0
  23. package/dist/admin/future/hooks/useTracking.mjs +53 -0
  24. package/dist/admin/future/hooks/useTracking.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/AssetsPage.js +328 -139
  26. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/AssetsPage.mjs +332 -143
  28. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
  30. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
  32. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
  33. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +328 -0
  34. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
  35. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +326 -0
  36. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +35 -14
  38. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +35 -14
  40. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +74 -53
  42. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  43. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +74 -54
  44. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  45. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +92 -28
  46. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  47. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +94 -30
  48. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  49. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +26 -4
  50. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +27 -5
  52. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -60
  54. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -63
  56. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +64 -132
  58. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +64 -132
  60. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
  62. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
  64. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
  66. package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
  67. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
  68. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
  69. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
  70. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
  72. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +27 -17
  74. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  75. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +28 -18
  76. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  77. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
  78. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
  80. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
  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 +10 -15
  84. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  85. package/dist/admin/future/pages/Assets/components/FilterBadges.js +13 -4
  86. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -1
  87. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +13 -4
  88. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -1
  89. package/dist/admin/future/pages/Assets/components/FilterMenu.js +259 -63
  90. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +262 -66
  92. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +146 -0
  94. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
  95. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +144 -0
  96. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
  97. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +62 -16
  98. package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
  99. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +64 -18
  100. package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
  101. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +132 -229
  102. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +135 -232
  104. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/components/SortMenu.js +14 -0
  106. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +14 -0
  108. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +5 -0
  110. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  111. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +6 -1
  112. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  113. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
  114. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
  116. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +203 -62
  118. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  119. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +204 -63
  120. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  121. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
  122. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
  124. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/utils/selection.js +17 -0
  126. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -1
  127. package/dist/admin/future/pages/Assets/utils/selection.mjs +17 -1
  128. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -1
  129. package/dist/admin/future/services/api.js +31 -8
  130. package/dist/admin/future/services/api.js.map +1 -1
  131. package/dist/admin/future/services/api.mjs +31 -8
  132. package/dist/admin/future/services/api.mjs.map +1 -1
  133. package/dist/admin/future/services/assets.js +22 -23
  134. package/dist/admin/future/services/assets.js.map +1 -1
  135. package/dist/admin/future/services/assets.mjs +22 -23
  136. package/dist/admin/future/services/assets.mjs.map +1 -1
  137. package/dist/admin/future/services/folders.js +37 -2
  138. package/dist/admin/future/services/folders.js.map +1 -1
  139. package/dist/admin/future/services/folders.mjs +37 -3
  140. package/dist/admin/future/services/folders.mjs.map +1 -1
  141. package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
  142. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
  143. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
  144. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
  145. package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
  146. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
  147. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
  148. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
  149. package/dist/admin/future/utils/getRelationId.js +24 -0
  150. package/dist/admin/future/utils/getRelationId.js.map +1 -0
  151. package/dist/admin/future/utils/getRelationId.mjs +22 -0
  152. package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
  153. package/dist/admin/future/utils/isEventFromWithin.js +14 -0
  154. package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
  155. package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
  156. package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
  157. package/dist/admin/future/utils/itemLocations.js +40 -0
  158. package/dist/admin/future/utils/itemLocations.js.map +1 -0
  159. package/dist/admin/future/utils/itemLocations.mjs +36 -0
  160. package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
  161. package/dist/admin/future/utils/itemSource.js +36 -0
  162. package/dist/admin/future/utils/itemSource.js.map +1 -0
  163. package/dist/admin/future/utils/itemSource.mjs +32 -0
  164. package/dist/admin/future/utils/itemSource.mjs.map +1 -0
  165. package/dist/admin/hooks/useAIMetadataJob.js +1 -1
  166. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  167. package/dist/admin/hooks/useAIMetadataJob.mjs +1 -1
  168. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  169. package/dist/admin/index.js +11 -17
  170. package/dist/admin/index.js.map +1 -1
  171. package/dist/admin/index.mjs +12 -18
  172. package/dist/admin/index.mjs.map +1 -1
  173. package/dist/admin/pages/SettingsPage/SettingsPage.js +2 -2
  174. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  175. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +2 -2
  176. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  177. package/dist/admin/src/future/App.d.ts +1 -1
  178. package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
  179. package/dist/admin/src/future/components/Drawer.d.ts +5 -1
  180. package/dist/admin/src/future/components/TruncatedText.d.ts +32 -0
  181. package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
  182. package/dist/admin/src/future/hooks/useTracking.d.ts +29 -0
  183. package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
  184. package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +26 -0
  185. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
  186. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
  187. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
  188. package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
  189. package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
  190. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
  191. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
  192. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
  193. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +3 -1
  194. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +4 -0
  195. package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +21 -0
  196. package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
  197. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +2 -0
  198. package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
  199. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +20 -6
  200. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
  201. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +10 -0
  202. package/dist/admin/src/future/services/api.d.ts +6 -7
  203. package/dist/admin/src/future/services/folders.d.ts +6 -1
  204. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
  205. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
  206. package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
  207. package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
  208. package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
  209. package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
  210. package/dist/admin/translations/en.json.js +25 -4
  211. package/dist/admin/translations/en.json.js.map +1 -1
  212. package/dist/admin/translations/en.json.mjs +25 -4
  213. package/dist/admin/translations/en.json.mjs.map +1 -1
  214. package/dist/server/controllers/admin-file.js +27 -9
  215. package/dist/server/controllers/admin-file.js.map +1 -1
  216. package/dist/server/controllers/admin-file.mjs +27 -9
  217. package/dist/server/controllers/admin-file.mjs.map +1 -1
  218. package/dist/server/controllers/admin-upload.js +24 -8
  219. package/dist/server/controllers/admin-upload.js.map +1 -1
  220. package/dist/server/controllers/admin-upload.mjs +24 -8
  221. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  222. package/dist/server/routes/admin.js +41 -21
  223. package/dist/server/routes/admin.js.map +1 -1
  224. package/dist/server/routes/admin.mjs +41 -21
  225. package/dist/server/routes/admin.mjs.map +1 -1
  226. package/dist/server/services/ai-metadata.js.map +1 -1
  227. package/dist/server/services/ai-metadata.mjs.map +1 -1
  228. package/dist/server/services/image-manipulation.js.map +1 -1
  229. package/dist/server/services/image-manipulation.mjs.map +1 -1
  230. package/dist/server/src/controllers/admin-file.d.ts +29 -8
  231. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  232. package/dist/server/src/controllers/admin-upload.d.ts +20 -4
  233. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  234. package/dist/server/src/controllers/index.d.ts +4 -4
  235. package/dist/server/src/index.d.ts +4 -4
  236. package/dist/server/src/routes/admin.d.ts.map +1 -1
  237. package/dist/server/src/services/ai-metadata.d.ts +2 -2
  238. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  239. package/dist/server/src/services/image-manipulation.d.ts +0 -5
  240. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  241. package/dist/shared/contracts/ai-metadata-jobs.d.ts +10 -32
  242. package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -1
  243. package/dist/shared/contracts/files.d.ts +10 -10
  244. package/dist/shared/contracts/files.d.ts.map +1 -1
  245. package/package.json +9 -9
  246. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
  247. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
  248. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +0 -33
  249. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +0 -1
  250. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +0 -31
  251. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +0 -1
  252. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
  253. package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +0 -16
@@ -1,46 +1,62 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { useEffect, useMemo, useState, useRef, useCallback } from 'react';
3
3
  import * as ToggleGroup from '@radix-ui/react-toggle-group';
4
- import { usePersistentState, Layouts, useElementOnScreen } from '@strapi/admin/strapi-admin';
5
- import { Box, VisuallyHidden, Flex, SimpleMenu, MenuItem, Loader, Typography } from '@strapi/design-system';
6
- import { List, GridFour, Folder, Files, Link, ChevronDown } from '@strapi/icons';
4
+ import { usePersistentState, useElementOnScreen, Layouts, Page } from '@strapi/admin/strapi-admin';
5
+ import { Box, VisuallyHidden, Typography, SimpleMenu, MenuItem, Flex, Loader } from '@strapi/design-system';
6
+ import { Folder, Files, Link, ChevronDown, List, GridFour } from '@strapi/icons';
7
7
  import { useIntl } from 'react-intl';
8
- import { styled } from 'styled-components';
9
- import { useAIAvailability } from '../../../hooks/useAiAvailability.mjs';
8
+ import { css, styled } from 'styled-components';
9
+ import { typeFromMime } from '../../../utils/typeFromMime.mjs';
10
+ import { BetaNotice } from '../../components/BetaNotice.mjs';
11
+ import { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled.mjs';
10
12
  import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions.mjs';
13
+ import { useTracking, MEDIA_LIBRARY_LOCATION } from '../../hooks/useTracking.mjs';
11
14
  import { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api.mjs';
12
15
  import { useGetFolderQuery, useGetFoldersQuery } from '../../services/folders.mjs';
13
16
  import { useGetUploadSettingsQuery } from '../../services/settings.mjs';
17
+ import { buildItemLocations } from '../../utils/itemLocations.mjs';
14
18
  import { getTranslationKey } from '../../utils/translations.mjs';
15
19
  import { useAssetDetailsParam, AssetDetailsDrawer } from './components/AssetDetails/AssetDetailsDrawer.mjs';
16
20
  import { AssetsGrid } from './components/AssetsGrid.mjs';
17
21
  import { AssetsSearchInput } from './components/AssetsSearchInput.mjs';
18
22
  import { AssetsTable } from './components/AssetsTable.mjs';
19
23
  import { BulkActionsBar } from './components/BulkActionsBar.mjs';
20
- import { CreateFolderDialog } from './components/CreateFolderDialog.mjs';
21
24
  import { AssetsDndProvider } from './components/Dnd/AssetsDndProvider.mjs';
22
25
  import { DropZoneWithOverlay, DropFilesMessage } from './components/DropZone/UploadDropZone.mjs';
23
26
  import { UploadDropZoneProvider } from './components/DropZone/UploadDropZoneContext.mjs';
24
27
  import { FilteredEmptyState, EmptyState } from './components/EmptyState.mjs';
25
28
  import { FilterBadges } from './components/FilterBadges.mjs';
26
29
  import { FilterMenu } from './components/FilterMenu.mjs';
30
+ import { FolderFormDialog } from './components/FolderFormDialog.mjs';
27
31
  import { FolderTree } from './components/FolderTree/FolderTree.mjs';
28
32
  import { ImportFromUrlDialog } from './components/ImportFromUrlDialog.mjs';
29
33
  import { SortMenu } from './components/SortMenu.mjs';
30
34
  import { localStorageKeys, viewOptions } from './constants.mjs';
31
35
  import { useAssetSearch } from './hooks/useAssetSearch.mjs';
32
36
  import { AssetSelectionProvider, useAssetSelection } from './hooks/useAssetSelection.mjs';
37
+ import { BusyAssetsProvider } from './hooks/useBusyAssets.mjs';
33
38
  import { useFolderInfo } from './hooks/useFolderInfo.mjs';
34
39
  import { useFolderNavigation } from './hooks/useFolderNavigation.mjs';
35
40
  import { useInfiniteAssets } from './hooks/useInfiniteAssets.mjs';
41
+ import { useInfiniteScrollSentinel } from './hooks/useInfiniteScrollSentinel.mjs';
36
42
  import { useListFilters } from './hooks/useListFilters.mjs';
37
43
  import { useListSort } from './hooks/useListSort.mjs';
38
44
  import { buildAssetFilters } from './utils/buildAssetFilters.mjs';
39
45
  import { getListQueryKey } from './utils/listQueryKey.mjs';
40
46
  import { mergeMixedList } from './utils/mergeMixedList.mjs';
41
47
 
48
+ // The negative bottom margin shrinks the trigger area by a pixel so the 1px
49
+ // sentinel sitting exactly at the fold (when a page's rows happen to fill the
50
+ // viewport) reads as "not visible" and doesn't pull an extra page. It still
51
+ // triggers as soon as the sentinel scrolls a hair into view. Tune the bottom
52
+ // value if the list over- or under-fetches near the fold.
42
53
  const INTERSECTION_OPTIONS = {
43
- threshold: 0.1
54
+ threshold: 0,
55
+ rootMargin: '0px 0px -1px 0px'
56
+ };
57
+ // Module-level so the header sentinel's observer isn't rebuilt every render.
58
+ const HEADER_SENTINEL_OPTIONS = {
59
+ threshold: 0
44
60
  };
45
61
  const ITEM_COUNT_MESSAGE = {
46
62
  id: getTranslationKey('header.content.item-count'),
@@ -69,7 +85,7 @@ const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
69
85
  }
70
86
  return SEARCH_RESULTS_COUNT_MESSAGES.both;
71
87
  };
72
- const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
88
+ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
73
89
  const { formatMessage } = useIntl();
74
90
  const isGridView = view === viewOptions.GRID;
75
91
  const isLoading = isLoadingAssets || isLoadingFolders;
@@ -89,15 +105,12 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
89
105
  assetsSort,
90
106
  hasNextPage
91
107
  ]);
92
- const loadMoreRef = useElementOnScreen(useCallback((isVisible)=>{
93
- if (isVisible && hasNextPage && !isFetchingMore) {
94
- fetchNextPage();
95
- }
96
- }, [
108
+ const loadMoreRef = useInfiniteScrollSentinel({
97
109
  hasNextPage,
98
110
  isFetchingMore,
99
- fetchNextPage
100
- ]), INTERSECTION_OPTIONS);
111
+ onLoadMore: fetchNextPage,
112
+ options: INTERSECTION_OPTIONS
113
+ });
101
114
  if (isLoading) {
102
115
  return /*#__PURE__*/ jsx(Flex, {
103
116
  justifyContent: "center",
@@ -163,7 +176,8 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
163
176
  })
164
177
  }),
165
178
  /*#__PURE__*/ jsx(BulkActionsBar, {
166
- assets: assets
179
+ assets: assets,
180
+ locations: locations
167
181
  })
168
182
  ]
169
183
  });
@@ -223,13 +237,122 @@ const StyledToggleItem = styled(ToggleGroup.Item)`
223
237
  height: 1.6rem;
224
238
  }
225
239
  `;
226
- const HeaderWrapper = styled(Box)`
227
- [data-strapi-header] {
228
- background: ${({ theme })=>theme.colors.neutral0};
240
+ // A single sticky header — same layout scrolled or not, so the toolbar
241
+ // alignment can't reflow the way the shared sticky header did. Once the list
242
+ // scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it
243
+ // off the rows), like the sticky headers elsewhere in the admin. Horizontal
244
+ // padding stays responsive (passed as props); only the vertical rhythm + shadow
245
+ // change here so they can animate.
246
+ const StickyHeader = styled(Box)`
247
+ position: sticky;
248
+ top: 0;
249
+ z-index: 2;
250
+ /* Transparent at rest (the grey page shows through); an opaque background +
251
+ shadow appear only once it sticks and content scrolls under it. */
252
+ background: transparent;
253
+ /* Horizontal padding matches the list's default spacing (Layouts.Content /
254
+ RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */
255
+ padding: ${({ theme })=>`${theme.spaces[6]} ${theme.spaces[4]}`};
256
+ transition:
257
+ padding 0.2s ease,
258
+ background 0.2s ease,
259
+ box-shadow 0.2s ease;
229
260
 
230
- h1 {
231
- font-size: 1.8rem;
232
- }
261
+ ${({ theme })=>theme.breakpoints.medium} {
262
+ padding-left: ${({ theme })=>theme.spaces[6]};
263
+ padding-right: ${({ theme })=>theme.spaces[6]};
264
+ }
265
+ ${({ theme })=>theme.breakpoints.large} {
266
+ padding-left: ${({ theme })=>theme.spaces[10]};
267
+ padding-right: ${({ theme })=>theme.spaces[10]};
268
+ }
269
+
270
+ /* Compacting is scoped to medium and up, where the header actually sticks. On
271
+ mobile it scrolls away with the list, so shrinking it mid-scroll animated a
272
+ header the user could no longer see — the transition read as a glitch on the
273
+ way back up rather than as the header settling. */
274
+ ${({ $compact, theme })=>$compact && css`
275
+ ${theme.breakpoints.medium} {
276
+ padding-top: ${theme.spaces[3]};
277
+ padding-bottom: ${theme.spaces[3]};
278
+ padding-left: ${theme.spaces[4]};
279
+ padding-right: ${theme.spaces[4]};
280
+ background: ${theme.colors.neutral0};
281
+ box-shadow: ${theme.shadows.tableShadow};
282
+ }
283
+ ${theme.breakpoints.large} {
284
+ padding-left: ${theme.spaces[6]};
285
+ padding-right: ${theme.spaces[6]};
286
+ }
287
+ `}
288
+ `;
289
+ // New button aligns with the title, not the toolbar.
290
+ const TitleRow = styled(Flex)`
291
+ justify-content: space-between;
292
+ align-items: flex-start;
293
+ gap: ${({ theme })=>theme.spaces[4]};
294
+
295
+ h1 {
296
+ font-size: 1.8rem;
297
+ }
298
+ `;
299
+ // Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —
300
+ // Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,
301
+ // Filter+Search on the left, Sort+Toggle pushed right.
302
+ const Toolbar = styled(Flex)`
303
+ margin-top: ${({ theme })=>theme.spaces[5]};
304
+ flex-direction: column;
305
+ align-items: stretch;
306
+ gap: ${({ theme })=>theme.spaces[3]};
307
+ transition: margin-top 0.2s ease;
308
+
309
+ /* Tightening the gap to the title belongs to the compact header, so it is
310
+ scoped to the breakpoints that compact. On mobile the header never sticks,
311
+ and this was the last thing still shifting as the page scrolled. */
312
+ ${({ $compact, theme })=>$compact && css`
313
+ ${theme.breakpoints.medium} {
314
+ margin-top: ${theme.spaces[2]};
315
+ }
316
+ `}
317
+
318
+ ${({ theme })=>theme.breakpoints.large} {
319
+ flex-direction: row;
320
+ align-items: center;
321
+ justify-content: space-between;
322
+ }
323
+ `;
324
+ const ToolbarGroup = styled(Flex)`
325
+ align-items: center;
326
+ gap: ${({ theme })=>theme.spaces[3]};
327
+ `;
328
+ // Filter + Search. On mobile the group fills the row (search grows into it);
329
+ // on desktop it keeps its intrinsic size and sits at the left edge.
330
+ const FilterSearchGroup = styled(ToolbarGroup)``;
331
+ // Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).
332
+ // Desktop: sit together at the right edge (space-between on the toolbar leaves
333
+ // the empty space between the search and here).
334
+ const SortToggleGroup = styled(ToolbarGroup)`
335
+ justify-content: space-between;
336
+
337
+ ${({ theme })=>theme.breakpoints.large} {
338
+ justify-content: flex-end;
339
+ flex: 0 0 auto;
340
+ }
341
+ `;
342
+ // Fills the row on mobile; intrinsic width on desktop.
343
+ const SearchSlot = styled(Box)`
344
+ flex: 1;
345
+
346
+ ${({ theme })=>theme.breakpoints.large} {
347
+ flex: 0 1 auto;
348
+ }
349
+ `;
350
+ // Toggle labels are hidden below desktop — icons only (buttons keep aria-label).
351
+ const ToggleLabel = styled.span`
352
+ display: none;
353
+
354
+ ${({ theme })=>theme.breakpoints.large} {
355
+ display: inline;
233
356
  }
234
357
  `;
235
358
  const AssetsPage = ()=>{
@@ -262,7 +385,7 @@ const AssetsPage = ()=>{
262
385
  [
263
386
  listFilters.serialized
264
387
  ]);
265
- const { assets, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets({
388
+ const { assets, subscribers: assetPageSubscribers, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets({
266
389
  // The real folder is passed even while searching: the service drops the folder
267
390
  // filter when `search` is set, so results are still global. List filters
268
391
  // compose with both modes.
@@ -270,7 +393,6 @@ const AssetsPage = ()=>{
270
393
  search: searchQuery || undefined,
271
394
  sort: listSort.assetsSort,
272
395
  filters: builtFilters.fileClauses,
273
- filtersKey: listFilters.serialized,
274
396
  enabled: builtFilters.showFiles
275
397
  });
276
398
  const { data: fetchedFolders = [], isLoading: isLoadingFolders } = useGetFoldersQuery({
@@ -286,6 +408,13 @@ const AssetsPage = ()=>{
286
408
  builtFilters.showFolders,
287
409
  fetchedFolders
288
410
  ]);
411
+ // Both move affordances (drag and the bulk bar) resolve each item's parent
412
+ // from the rows on screen — while searching, results are global and the
413
+ // folder currently open says nothing about where an item lives.
414
+ const itemLocations = useMemo(()=>buildItemLocations(assets, folders), [
415
+ assets,
416
+ folders
417
+ ]);
289
418
  const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
290
419
  count: itemCount
291
420
  });
@@ -321,6 +450,12 @@ const AssetsPage = ()=>{
321
450
  // Refs
322
451
  const fileInputRef = useRef(null);
323
452
  const uploadDropZoneRef = useRef(null);
453
+ // Shrink the sticky header once the list scrolls beneath it. A zero-height
454
+ // sentinel sits at the very top of the scroll content; when it leaves the
455
+ // viewport we're scrolled → compact.
456
+ const [isHeaderCompact, setIsHeaderCompact] = useState(false);
457
+ const onHeaderSentinelVisibility = useCallback((isVisible)=>setIsHeaderCompact(!isVisible), []);
458
+ const headerSentinelRef = useElementOnScreen(onHeaderSentinelVisibility, HEADER_SENTINEL_OPTIONS);
324
459
  // Upload handlers
325
460
  const [uploadFiles] = useUploadFilesMutation();
326
461
  const [uploadFromUrls] = useUploadFromUrlsMutation();
@@ -329,10 +464,24 @@ const AssetsPage = ()=>{
329
464
  // server asked for.
330
465
  const { data: settings } = useGetUploadSettingsQuery();
331
466
  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();
467
+ // Drives the post-upload AI metadata phase shown per row in the progress
468
+ // dialog. No mime argument: the files are not known until they are picked,
469
+ // and the server filters the batch on the same allowlist anyway.
470
+ const isAiMetadataEnabled = useAIMetadataEnabled();
471
+ const { trackUsage } = useTracking();
334
472
  const uploadFilesToFolder = async (files, folderId)=>{
335
473
  if (files.length === 0) return;
474
+ // Mirror the legacy `willAddMediaLibraryAssets` payload: the count of files
475
+ // about to upload, broken down by asset type.
476
+ const assetsCountByType = files.reduce((acc, file)=>{
477
+ const type = typeFromMime(file.type);
478
+ acc[type] = (acc[type] ?? 0) + 1;
479
+ return acc;
480
+ }, {});
481
+ trackUsage('willAddMediaLibraryAssets', {
482
+ location: MEDIA_LIBRARY_LOCATION,
483
+ ...assetsCountByType
484
+ });
336
485
  const formData = new FormData();
337
486
  const fileInfoArray = [];
338
487
  files.forEach((file)=>{
@@ -362,6 +511,10 @@ const AssetsPage = ()=>{
362
511
  const handleFileChange = async (e)=>{
363
512
  const files = e.target.files;
364
513
  if (files && files.length > 0) {
514
+ trackUsage('didSelectFile', {
515
+ source: 'computer',
516
+ location: MEDIA_LIBRARY_LOCATION
517
+ });
365
518
  await uploadFilesToFolder(Array.from(files), currentFolderId);
366
519
  }
367
520
  e.target.value = '';
@@ -370,9 +523,22 @@ const AssetsPage = ()=>{
370
523
  // Defence in depth: the provider is `disabled` without `assets.create`
371
524
  // (so onDrop won't fire), but guard here too in case it's ever wired live.
372
525
  if (!canCreate) return;
526
+ trackUsage('didSelectFile', {
527
+ source: 'computer',
528
+ location: MEDIA_LIBRARY_LOCATION
529
+ });
373
530
  await uploadFilesToFolder(files, currentFolderId);
374
531
  };
375
532
  const handleUrlUpload = async (urls)=>{
533
+ trackUsage('didSelectFile', {
534
+ source: 'url',
535
+ location: MEDIA_LIBRARY_LOCATION
536
+ });
537
+ // Counts-by-type aren't available client-side for the URL flow (the server
538
+ // fetches the files), so this fires the event with location only.
539
+ trackUsage('willAddMediaLibraryAssets', {
540
+ location: MEDIA_LIBRARY_LOCATION
541
+ });
376
542
  try {
377
543
  await uploadFromUrls({
378
544
  urls,
@@ -399,93 +565,105 @@ const AssetsPage = ()=>{
399
565
  disabled: !canCreate,
400
566
  children: /*#__PURE__*/ jsx(AssetSelectionProvider, {
401
567
  disabled: !canUpdate,
402
- children: /*#__PURE__*/ jsxs(AssetsDndProvider, {
403
- children: [
404
- /*#__PURE__*/ jsx(ClearSelectionOnChange, {
405
- listQueryKey: listQueryKey
406
- }),
407
- /*#__PURE__*/ jsx(Box, {
408
- ref: uploadDropZoneRef,
409
- children: /*#__PURE__*/ jsxs(Layouts.Root, {
410
- minHeight: "100vh",
411
- background: "neutral0",
568
+ children: /*#__PURE__*/ jsx(BusyAssetsProvider, {
569
+ children: /*#__PURE__*/ jsxs(AssetsDndProvider, {
570
+ locations: itemLocations,
571
+ children: [
572
+ /*#__PURE__*/ jsx(ClearSelectionOnChange, {
573
+ listQueryKey: listQueryKey
574
+ }),
575
+ /*#__PURE__*/ jsx(Layouts.Root, {
412
576
  sideNav: /*#__PURE__*/ jsx(FolderTree, {
413
577
  currentFolderId: currentFolderId,
414
578
  showActiveFolder: !isSearching,
415
579
  onSelectFolder: navigateToFolderId
416
580
  }),
417
- children: [
418
- /*#__PURE__*/ jsx(VisuallyHidden, {
419
- children: /*#__PURE__*/ jsx("input", {
420
- type: "file",
421
- ref: fileInputRef,
422
- onChange: handleFileChange,
423
- multiple: true
424
- })
425
- }),
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
- }),
437
- children: [
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
- })
453
- }),
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
- ]
581
+ children: /*#__PURE__*/ jsx(Page.Main, {
582
+ children: /*#__PURE__*/ jsxs(Box, {
583
+ ref: uploadDropZoneRef,
584
+ children: [
585
+ /*#__PURE__*/ jsx(VisuallyHidden, {
586
+ children: /*#__PURE__*/ jsx("input", {
587
+ type: "file",
588
+ ref: fileInputRef,
589
+ onChange: handleFileChange,
590
+ multiple: true
591
+ })
463
592
  }),
464
- subtitle: /*#__PURE__*/ jsxs(Fragment, {
593
+ /*#__PURE__*/ jsx(Box, {
594
+ ref: headerSentinelRef,
595
+ height: 0,
596
+ "aria-hidden": true
597
+ }),
598
+ /*#__PURE__*/ jsxs(StickyHeader, {
599
+ $compact: isHeaderCompact,
465
600
  children: [
466
- /*#__PURE__*/ jsxs(Flex, {
467
- justifyContent: "space-between",
468
- alignItems: "center",
469
- gap: 4,
470
- width: "100%",
601
+ /*#__PURE__*/ jsxs(TitleRow, {
471
602
  children: [
472
- /*#__PURE__*/ jsxs(Flex, {
473
- gap: 4,
474
- alignItems: "center",
603
+ /*#__PURE__*/ jsx(Typography, {
604
+ variant: "alpha",
605
+ tag: "h1",
606
+ children: pageHeaderTitle
607
+ }),
608
+ canCreate && /*#__PURE__*/ jsxs(SimpleMenu, {
609
+ popoverPlacement: "bottom-end",
610
+ variant: "default",
611
+ endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
612
+ label: formatMessage({
613
+ id: getTranslationKey('new'),
614
+ defaultMessage: 'New'
615
+ }),
475
616
  children: [
476
- /*#__PURE__*/ jsx(FilterMenu, {
477
- listFilters: listFilters
617
+ /*#__PURE__*/ jsx(MenuItem, {
618
+ onSelect: ()=>setIsCreateFolderDialogOpen(true),
619
+ startIcon: /*#__PURE__*/ jsx(Folder, {}),
620
+ children: formatMessage({
621
+ id: getTranslationKey('folder.create.title'),
622
+ defaultMessage: 'New folder'
623
+ })
478
624
  }),
479
- /*#__PURE__*/ jsx(AssetsSearchInput, {})
625
+ /*#__PURE__*/ jsx(MenuItem, {
626
+ onSelect: handleFileSelect,
627
+ startIcon: /*#__PURE__*/ jsx(Files, {}),
628
+ children: formatMessage({
629
+ id: getTranslationKey('import-files'),
630
+ defaultMessage: 'Import files'
631
+ })
632
+ }),
633
+ /*#__PURE__*/ jsx(MenuItem, {
634
+ onSelect: ()=>setIsUrlDialogOpen(true),
635
+ startIcon: /*#__PURE__*/ jsx(Link, {}),
636
+ children: formatMessage({
637
+ id: getTranslationKey('import-from-url'),
638
+ defaultMessage: 'Import from URL'
639
+ })
640
+ })
641
+ ]
642
+ })
643
+ ]
644
+ }),
645
+ /*#__PURE__*/ jsxs(Toolbar, {
646
+ $compact: isHeaderCompact,
647
+ children: [
648
+ /*#__PURE__*/ jsxs(FilterSearchGroup, {
649
+ children: [
650
+ /*#__PURE__*/ jsx(Box, {
651
+ children: /*#__PURE__*/ jsx(FilterMenu, {
652
+ listFilters: listFilters
653
+ })
654
+ }),
655
+ /*#__PURE__*/ jsx(SearchSlot, {
656
+ children: /*#__PURE__*/ jsx(AssetsSearchInput, {})
657
+ })
480
658
  ]
481
659
  }),
482
- /*#__PURE__*/ jsxs(Flex, {
483
- gap: 4,
484
- alignItems: "center",
660
+ /*#__PURE__*/ jsxs(SortToggleGroup, {
485
661
  children: [
486
- /*#__PURE__*/ jsx(SortMenu, {
487
- sort: listSort,
488
- showFoldersGroup: !isGridView
662
+ /*#__PURE__*/ jsx(Box, {
663
+ children: /*#__PURE__*/ jsx(SortMenu, {
664
+ sort: listSort,
665
+ showFoldersGroup: !isGridView
666
+ })
489
667
  }),
490
668
  /*#__PURE__*/ jsxs(StyledToggleGroup, {
491
669
  type: "single",
@@ -504,9 +682,11 @@ const AssetsPage = ()=>{
504
682
  }),
505
683
  children: [
506
684
  /*#__PURE__*/ jsx(List, {}),
507
- formatMessage({
508
- id: getTranslationKey('view.table'),
509
- defaultMessage: 'Table view'
685
+ /*#__PURE__*/ jsx(ToggleLabel, {
686
+ children: formatMessage({
687
+ id: getTranslationKey('view.table'),
688
+ defaultMessage: 'Table view'
689
+ })
510
690
  })
511
691
  ]
512
692
  }),
@@ -518,9 +698,11 @@ const AssetsPage = ()=>{
518
698
  }),
519
699
  children: [
520
700
  /*#__PURE__*/ jsx(GridFour, {}),
521
- formatMessage({
522
- id: getTranslationKey('view.grid'),
523
- defaultMessage: 'Grid view'
701
+ /*#__PURE__*/ jsx(ToggleLabel, {
702
+ children: formatMessage({
703
+ id: getTranslationKey('view.grid'),
704
+ defaultMessage: 'Grid view'
705
+ })
524
706
  })
525
707
  ]
526
708
  })
@@ -531,52 +713,59 @@ const AssetsPage = ()=>{
531
713
  ]
532
714
  }),
533
715
  /*#__PURE__*/ jsx(FilterBadges, {
534
- listFilters: listFilters
716
+ listFilters: listFilters,
717
+ compact: isHeaderCompact
718
+ })
719
+ ]
720
+ }),
721
+ /*#__PURE__*/ jsxs(Layouts.Content, {
722
+ children: [
723
+ /*#__PURE__*/ jsx(BetaNotice, {}),
724
+ assetPageSubscribers,
725
+ /*#__PURE__*/ jsxs(DropZoneWithOverlay, {
726
+ children: [
727
+ /*#__PURE__*/ jsx(DropFilesMessage, {
728
+ uploadDropZoneRef: uploadDropZoneRef,
729
+ folderName: title
730
+ }),
731
+ /*#__PURE__*/ jsx(AssetsView, {
732
+ view: view,
733
+ folders: folders,
734
+ isLoadingFolders: isLoadingFolders,
735
+ assets: assets,
736
+ isLoadingAssets: isLoadingAssets,
737
+ isFetchingMore: isFetchingMore,
738
+ hasNextPage: hasNextPage,
739
+ fetchNextPage: fetchNextPage,
740
+ error: assetsError,
741
+ locations: itemLocations,
742
+ searchQuery: searchQuery,
743
+ assetsSort: listSort.assetsSort,
744
+ foldersPosition: listSort.foldersPosition,
745
+ hasActiveFilters: listFilters.filters.length > 0,
746
+ onClearFilters: listFilters.clearFilters,
747
+ onAssetItemClick: openDetails,
748
+ onAddAssets: handleFileSelect,
749
+ canAddAssets: canCreate,
750
+ onClearSearch: clearSearch
751
+ })
752
+ ]
535
753
  })
536
754
  ]
537
755
  })
538
- })
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
- })
756
+ ]
569
757
  })
570
- ]
758
+ })
571
759
  })
572
- })
573
- ]
760
+ ]
761
+ })
574
762
  })
575
763
  })
576
764
  }),
577
- /*#__PURE__*/ jsx(CreateFolderDialog, {
765
+ /*#__PURE__*/ jsx(FolderFormDialog, {
578
766
  open: isCreateFolderDialogOpen,
579
- folderName: title,
767
+ mode: "create",
768
+ parentFolderName: title,
580
769
  parentFolderId: currentFolderId,
581
770
  onClose: ()=>setIsCreateFolderDialogOpen(false)
582
771
  }),