@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 +1 @@
1
- {"version":3,"file":"AssetsTable.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsMobile } from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Flex,\n IconButton,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { TABLE_HEADERS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { type MixedItem } from '../utils/mergeMixedList';\nimport { assetKey, folderKey, getSelectAllState, type ItemKey } from '../utils/selection';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\nconst StyledTh = styled(RawTh)`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledTr = styled.tr<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n height: 48px;\n user-select: none;\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\n// Leading checkbox column. Narrow + centred so the control sits flush against the\n// row's left edge.\nconst CheckboxTd = styled(StyledTd)`\n width: 1%;\n white-space: nowrap;\n`;\n\nconst CheckboxTh = styled(StyledTh)`\n width: 1%;\n white-space: nowrap;\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the row.\nconst NameButton = styled.button`\n display: inline-flex;\n max-width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\nconst stopRowEvent = (e: React.SyntheticEvent) => {\n e.stopPropagation();\n};\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={20} height={20} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetRow = ({ asset, orderedItemKeys, onAssetItemClick }: AssetRowProps) => {\n const isMobile = useIsMobile();\n const { formatDate, formatMessage } = useIntl();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n const handleRowClick = (e: React.MouseEvent) => {\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Desktop: Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledTr\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n onDragStart={(e) => e.preventDefault()}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n >\n {/* No checkbox column on mobile (multi-select deferred) or without the\n update permission (nothing selectable can be acted on). */}\n {!isMobile && canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={selected}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <StyledTd>\n <Flex gap={3} alignItems=\"center\">\n <AssetPreviewCell asset={asset} />\n <Flex direction=\"column\" alignItems=\"flex-start\" minWidth={0}>\n <NameButton type=\"button\" onClick={handleNameClick}>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {asset.name}\n </Typography>\n </NameButton>\n {isMobile && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n </StyledTd>\n {!isMobile && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </StyledTd>\n </>\n )}\n <StyledTd>\n <Flex justifyContent=\"flex-end\">\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\nconst FolderTr = styled(StyledTr)`\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n`;\n\ninterface FolderRowProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderRow = ({ folder, orderedItemKeys }: FolderRowProps) => {\n const isMobile = useIsMobile();\n const { formatDate, formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n\n // Folders share the selection mechanism with assets. Only the plain-click\n // semantic differs: it navigates into the folder instead of selecting it.\n const handleRowClick = (e: React.MouseEvent) => {\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n // Enter navigates into the folder, Space toggles selection (same as assets).\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <FolderTr\n ref={(node) => {\n setDragRef(node);\n setDropRef(node);\n }}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n tabIndex={0}\n role=\"row\"\n onDragStart={(e) => e.preventDefault()}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n >\n {!isMobile && canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={isSelected(key)}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <StyledTd>\n <Flex gap={3} alignItems=\"center\">\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral600\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <FolderIcon width={20} height={20} />\n </Flex>\n <Typography textColor=\"neutral800\" fontWeight=\"semiBold\" ellipsis>\n {folder.name}\n </Typography>\n </Flex>\n </StyledTd>\n {!isMobile && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </StyledTd>\n </>\n )}\n <StyledTd>\n <Flex justifyContent=\"flex-end\">\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </Flex>\n </StyledTd>\n </FolderTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n folders?: Folder[];\n /**\n * When set (\"Folders: Mixed with files\"), rows render in this interleaved\n * order instead of folders-first. Range selection follows the same order.\n */\n mixedItems?: MixedItem[] | null;\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = [],\n mixedItems = null,\n onAssetItemClick,\n}: AssetsTableProps) => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n const { selectedKeys, selectAll, clear } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n\n const visibleHeaders = isMobile\n ? TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions')\n : TABLE_HEADERS;\n\n // The checkbox column is a dedicated structural column (not part of\n // TABLE_HEADERS). Hidden on mobile (multi-select deferred) and without the\n // update permission — every bulk action needs `assets.update`, so a\n // read-only user has nothing to select for.\n const showCheckboxColumn = !isMobile && canUpdate;\n const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);\n\n const totalRows = folders.length + assets.length;\n\n // Render order — folders first by default, or the interleaved mixed order.\n // Range selection follows it.\n const orderedItemKeys: ItemKey[] = mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, orderedItemKeys);\n\n const handleSelectAll = () => {\n if (allSelected) {\n clear();\n } else {\n selectAll(orderedItemKeys);\n }\n };\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty table renders nothing at all, not headers over an empty body.\n if (totalRows === 0) {\n return null;\n }\n\n return (\n <StyledTable colCount={colCount} rowCount={(mixedItems ? mixedItems.length : totalRows) + 1}>\n <StyledThead>\n <RawTr>\n {showCheckboxColumn && (\n <CheckboxTh>\n <Flex>\n <Checkbox\n checked={isIndeterminate ? 'indeterminate' : allSelected}\n disabled={orderedItemKeys.length === 0}\n onCheckedChange={handleSelectAll}\n aria-label={formatMessage({\n id: getTranslationKey('list.table.header.select-all'),\n defaultMessage: 'Select all',\n })}\n />\n </Flex>\n </CheckboxTh>\n )}\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {mixedItems?.map((item) =>\n item.kind === 'folder' ? (\n <FolderRow\n key={`folder-${item.folder.id}`}\n folder={item.folder}\n orderedItemKeys={orderedItemKeys}\n />\n ) : (\n <AssetRow\n key={item.asset.id}\n asset={item.asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n )\n )}\n {!mixedItems &&\n folders.map((folder) => (\n <FolderRow\n key={`folder-${folder.id}`}\n folder={folder}\n orderedItemKeys={orderedItemKeys}\n />\n ))}\n {!mixedItems &&\n assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n ))}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","StyledTh","RawTh","spaces","StyledTd","RawTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isInvalidDropTarget","$isDragging","$isValidDropTarget","css","primary600","CheckboxTd","CheckboxTh","NameButton","button","stopRowEvent","e","stopPropagation","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","orderedItemKeys","onAssetItemClick","isMobile","useIsMobile","formatDate","formatMessage","useIntl","isMovePending","useAssetsDndOptional","attributes","listeners","setNodeRef","isDragging","useFileDraggable","isSelected","toggle","selectRange","useAssetSelection","canUpdate","useMediaLibraryPermissions","key","assetKey","id","selected","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","tabIndex","role","onDragStart","onClick","onKeyDown","Checkbox","checked","aria-label","getTranslationKey","defaultMessage","name","gap","direction","minWidth","type","Typography","textColor","fontWeight","ellipsis","variant","size","formatBytes","_Fragment","createdAt","Date","dateStyle","updatedAt","IconButton","label","More","FolderTr","FolderRow","folder","navigateToFolder","useFolderNavigation","draggable","setDragRef","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","folderKey","node","FolderIcon","AssetsTable","assets","folders","mixedItems","selectedKeys","selectAll","clear","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","map","item","kind","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsTable.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsDesktop } from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Flex,\n Loader,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Tooltip,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { TruncatedText } from '../../../components/TruncatedText';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { isEventFromWithin } from '../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { TABLE_HEADERS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { type MixedItem } from '../utils/mergeMixedList';\nimport { assetKey, folderKey, getSelectAllState, type ItemKey } from '../utils/selection';\n\nimport { AssetActionsMenu } from './AssetActionsMenu';\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\nimport { FolderActionsMenu } from './FolderActionsMenu';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n\n /* Below desktop only the name column remains. A fixed layout makes a long\n name ellipsize instead of widening the table past the viewport — the\n checkbox (first) and actions (last) columns keep a fixed width and the name\n takes the rest. Desktop keeps the content-sized auto layout. */\n table-layout: fixed;\n\n & td:last-child,\n & th:last-child {\n width: 5.6rem;\n white-space: nowrap;\n }\n\n ${({ theme }) => theme.breakpoints.large} {\n table-layout: auto;\n\n & td:last-child,\n & th:last-child {\n width: auto;\n white-space: normal;\n }\n }\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\nconst StyledTh = styled(RawTh)`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledTr = styled.tr<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isBusy?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n height: 48px;\n user-select: none;\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget }) => {\n if ($isMovePending || $isBusy) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging, $isBusy }) => ($isDragging || $isBusy ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\n// Leading checkbox column. Fixed narrow width so it holds its own column under\n// the mobile fixed table-layout (a 1% width would collapse and let the name\n// cell's preview overlap the control).\nconst CheckboxTd = styled(StyledTd)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\nconst CheckboxTh = styled(StyledTh)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\n// Flags an asset whose caption or alternative text is empty — mirrors the\n// per-field warning shown in the details drawer. Pushed to the far end of the\n// name cell (shrink 0 so a long name never crowds it out).\nconst MetadataWarning = styled(WarningCircle)`\n flex-shrink: 0;\n width: 1.6rem;\n height: 1.6rem;\n\n path {\n fill: ${({ theme }) => theme.colors.warning500};\n }\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the row.\nconst NameButton = styled.button`\n display: inline-flex;\n max-width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\n// Shields the row from its own controls (checkbox, \"...\" trigger) without\n// severing propagation for the menu's portaled content — those events are React\n// children of the cell but not DOM descendants, and Radix needs them to reach\n// `document` to dismiss its layers.\nconst stopRowEvent = (e: React.SyntheticEvent) => {\n if (isEventFromWithin(e)) {\n e.stopPropagation();\n }\n};\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={20} height={20} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetRow = ({ asset, orderedItemKeys, onAssetItemClick }: AssetRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n\n // Caption and alternative text apply to every file type — same \"empty =\n // falsy\" rule as the drawer's per-field warning.\n const isMetadataMissing = !asset.caption || !asset.alternativeText;\n const metadataMissingLabel = formatMessage({\n id: getTranslationKey('list.table.row.metadata-missing'),\n defaultMessage: 'This asset is missing metadata (caption or alternative text).',\n });\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n //\n // The containment guard on this and the handler below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // opening the details drawer or toggling the selection.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Desktop: Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledTr\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n onDragStart={(e) => e.preventDefault()}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {/* No checkbox without the update permission (nothing selectable can be\n acted on). Shown at every viewport width otherwise. */}\n {canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={selected}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <StyledTd>\n <Flex alignItems=\"center\" justifyContent=\"space-between\" gap={2} minWidth={0}>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n {/* The row is dimmed and inert while busy; the spinner in place of the\n thumbnail is what says so positively. Its label carries the reason\n to screen readers — the row itself has no other announcement. */}\n {busyMessage !== null ? (\n <Flex justifyContent=\"center\" width=\"3.2rem\" height=\"3.2rem\">\n <Loader small>{busyMessage}</Loader>\n </Flex>\n ) : (\n <AssetPreviewCell asset={asset} />\n )}\n <Flex direction=\"column\" alignItems=\"flex-start\" minWidth={0}>\n <NameButton type=\"button\" onClick={handleNameClick}>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {asset.name}\n </TruncatedText>\n </NameButton>\n {!isDesktop && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n {isMetadataMissing && (\n <Tooltip label={metadataMissingLabel}>\n <MetadataWarning aria-label={metadataMissingLabel} role=\"img\" />\n </Tooltip>\n )}\n </Flex>\n </StyledTd>\n {isDesktop && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </StyledTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would open the details drawer). */}\n <StyledTd onClick={stopRowEvent} onKeyDown={stopRowEvent} onPointerDown={stopRowEvent}>\n <Flex justifyContent=\"flex-end\">\n <AssetActionsMenu asset={asset} dragData={dragData} />\n </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\nconst FolderTr = styled(StyledTr)`\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n`;\n\ninterface FolderRowProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderRow = ({ folder, orderedItemKeys }: FolderRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n dragData,\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n\n // Folders share the selection mechanism with assets. Only the plain-click\n // semantic differs: it navigates into the folder instead of selecting it.\n //\n // The containment guard on this and the handlers below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // navigating into the folder or starting a drag.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n // Enter navigates into the folder, Space toggles selection (same as assets).\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <FolderTr\n ref={(node) => {\n setDragRef(node);\n setDropRef(node);\n }}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n tabIndex={0}\n role=\"row\"\n onDragStart={(e: React.DragEvent) => {\n if (isEventFromWithin(e)) {\n e.preventDefault();\n }\n }}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={isSelected(key)}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <StyledTd>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral600\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <FolderIcon width={20} height={20} />\n </Flex>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {folder.name}\n </TruncatedText>\n </Flex>\n </StyledTd>\n {isDesktop && (\n <>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </StyledTd>\n <StyledTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </StyledTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would navigate into the folder). */}\n <StyledTd onClick={stopRowEvent} onKeyDown={stopRowEvent} onPointerDown={stopRowEvent}>\n <Flex justifyContent=\"flex-end\">\n <FolderActionsMenu folder={folder} dragData={dragData} />\n </Flex>\n </StyledTd>\n </FolderTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n folders?: Folder[];\n /**\n * When set (\"Folders: Mixed with files\"), rows render in this interleaved\n * order instead of folders-first. Range selection follows the same order.\n */\n mixedItems?: MixedItem[] | null;\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = [],\n mixedItems = null,\n onAssetItemClick,\n}: AssetsTableProps) => {\n const isDesktop = useIsDesktop();\n const { formatMessage } = useIntl();\n const { selectedKeys, selectAll, clear } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { trackUsage } = useTracking();\n\n // Below the desktop breakpoint only the name (and actions) column is kept —\n // the date/size columns don't fit; size moves under the name as a subtitle.\n const visibleHeaders = isDesktop\n ? TABLE_HEADERS\n : TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions');\n\n // The checkbox column is a dedicated structural column (not part of\n // TABLE_HEADERS). Hidden only without the update permission — every bulk\n // action needs `assets.update`, so a read-only user has nothing to select for.\n const showCheckboxColumn = canUpdate;\n const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);\n\n const totalRows = folders.length + assets.length;\n\n // Render order — folders first by default, or the interleaved mixed order.\n // Range selection follows it.\n const orderedItemKeys: ItemKey[] = mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, orderedItemKeys);\n\n const handleSelectAll = () => {\n if (allSelected) {\n clear();\n } else {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(orderedItemKeys);\n }\n };\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty table renders nothing at all, not headers over an empty body.\n if (totalRows === 0) {\n return null;\n }\n\n return (\n <StyledTable colCount={colCount} rowCount={(mixedItems ? mixedItems.length : totalRows) + 1}>\n <StyledThead>\n <RawTr>\n {showCheckboxColumn && (\n <CheckboxTh>\n <Flex>\n <Checkbox\n checked={isIndeterminate ? 'indeterminate' : allSelected}\n disabled={orderedItemKeys.length === 0}\n onCheckedChange={handleSelectAll}\n aria-label={formatMessage({\n id: getTranslationKey('list.table.header.select-all'),\n defaultMessage: 'Select all',\n })}\n />\n </Flex>\n </CheckboxTh>\n )}\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {mixedItems?.map((item) =>\n item.kind === 'folder' ? (\n <FolderRow\n key={`folder-${item.folder.id}`}\n folder={item.folder}\n orderedItemKeys={orderedItemKeys}\n />\n ) : (\n <AssetRow\n key={item.asset.id}\n asset={item.asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n )\n )}\n {!mixedItems &&\n folders.map((folder) => (\n <FolderRow\n key={`folder-${folder.id}`}\n folder={folder}\n orderedItemKeys={orderedItemKeys}\n />\n ))}\n {!mixedItems &&\n assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n ))}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","breakpoints","large","StyledThead","RawThead","neutral100","StyledTh","RawTh","spaces","StyledTd","RawTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isBusy","$isInvalidDropTarget","$isDragging","$isValidDropTarget","css","primary600","CheckboxTd","CheckboxTh","MetadataWarning","WarningCircle","warning500","NameButton","button","stopRowEvent","e","isEventFromWithin","stopPropagation","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","orderedItemKeys","onAssetItemClick","isDesktop","useIsDesktop","formatDate","formatMessage","useIntl","isMovePending","useAssetsDndOptional","attributes","listeners","setNodeRef","isDragging","dragData","useFileDraggable","isSelected","toggle","selectRange","useAssetSelection","canUpdate","useMediaLibraryPermissions","busyMessage","useBusyAssetsOptional","getBusyMessage","id","key","assetKey","selected","isMetadataMissing","caption","alternativeText","metadataMissingLabel","getTranslationKey","defaultMessage","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","tabIndex","role","onDragStart","onClick","onKeyDown","onPointerDown","Checkbox","checked","aria-label","name","gap","minWidth","Loader","small","direction","type","TruncatedText","textColor","fontWeight","Typography","variant","size","formatBytes","Tooltip","label","_Fragment","createdAt","Date","dateStyle","updatedAt","AssetActionsMenu","FolderTr","FolderRow","folder","navigateToFolder","useFolderNavigation","draggable","setDragRef","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","folderKey","node","FolderIcon","FolderActionsMenu","AssetsTable","assets","folders","mixedItems","selectedKeys","selectAll","clear","trackUsage","useTracking","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","map","item","kind","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody"],"mappings":"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"}
@@ -1,19 +1,25 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { useIsMobile } from '@strapi/admin/strapi-admin';
3
- import { RawTr, Flex, Checkbox, VisuallyHidden, Typography, RawTbody, RawTable, RawThead, RawTh, IconButton, RawTd } from '@strapi/design-system';
4
- import { Folder, More } from '@strapi/icons';
2
+ import { useIsDesktop } from '@strapi/admin/strapi-admin';
3
+ import { RawTr, Flex, Checkbox, VisuallyHidden, Typography, RawTbody, RawTable, RawThead, RawTh, Loader, Tooltip, RawTd } from '@strapi/design-system';
4
+ import { Folder, WarningCircle } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { styled, css } from 'styled-components';
7
+ import { TruncatedText } from '../../../components/TruncatedText.mjs';
7
8
  import { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions.mjs';
9
+ import { useTracking } from '../../../hooks/useTracking.mjs';
8
10
  import { formatBytes } from '../../../utils/files.mjs';
9
11
  import { getAssetIcon } from '../../../utils/getAssetIcon.mjs';
12
+ import { isEventFromWithin } from '../../../utils/isEventFromWithin.mjs';
10
13
  import { getTranslationKey } from '../../../utils/translations.mjs';
11
14
  import { TABLE_HEADERS } from '../constants.mjs';
12
15
  import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
16
+ import { useBusyAssetsOptional } from '../hooks/useBusyAssets.mjs';
13
17
  import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
14
18
  import { folderKey, assetKey, getSelectAllState } from '../utils/selection.mjs';
19
+ import { AssetActionsMenu } from './AssetActionsMenu.mjs';
15
20
  import { useAssetsDndOptional } from './Dnd/AssetsDndProvider.mjs';
16
21
  import { useFolderDraggableDroppable, useFileDraggable } from './Dnd/useAssetDnd.mjs';
22
+ import { FolderActionsMenu } from './FolderActionsMenu.mjs';
17
23
 
18
24
  const StyledTable = styled(RawTable)`
19
25
  width: 100%;
@@ -22,6 +28,28 @@ const StyledTable = styled(RawTable)`
22
28
  border: 1px solid ${({ theme })=>theme.colors.neutral150};
23
29
  border-radius: 4px;
24
30
  overflow: hidden;
31
+
32
+ /* Below desktop only the name column remains. A fixed layout makes a long
33
+ name ellipsize instead of widening the table past the viewport — the
34
+ checkbox (first) and actions (last) columns keep a fixed width and the name
35
+ takes the rest. Desktop keeps the content-sized auto layout. */
36
+ table-layout: fixed;
37
+
38
+ & td:last-child,
39
+ & th:last-child {
40
+ width: 5.6rem;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ ${({ theme })=>theme.breakpoints.large} {
45
+ table-layout: auto;
46
+
47
+ & td:last-child,
48
+ & th:last-child {
49
+ width: auto;
50
+ white-space: normal;
51
+ }
52
+ }
25
53
  `;
26
54
  const StyledThead = styled(RawThead)`
27
55
  background: ${({ theme })=>theme.colors.neutral100};
@@ -43,14 +71,14 @@ const StyledTr = styled.tr`
43
71
  height: 48px;
44
72
  user-select: none;
45
73
  background: ${({ theme, $isSelected })=>$isSelected ? theme.colors.primary100 : theme.colors.neutral0};
46
- cursor: ${({ $isMovePending, $isInvalidDropTarget })=>{
47
- if ($isMovePending) {
74
+ cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget })=>{
75
+ if ($isMovePending || $isBusy) {
48
76
  return 'wait';
49
77
  }
50
78
  return $isInvalidDropTarget ? 'not-allowed' : 'pointer';
51
79
  }};
52
- opacity: ${({ $isDragging })=>$isDragging ? 0.4 : 1};
53
- pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
80
+ opacity: ${({ $isDragging, $isBusy })=>$isDragging || $isBusy ? 0.4 : 1};
81
+ pointer-events: ${({ $isMovePending, $isBusy })=>$isMovePending || $isBusy ? 'none' : 'auto'};
54
82
 
55
83
  ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
56
84
  background: ${theme.colors.primary100};
@@ -73,16 +101,29 @@ const StyledTr = styled.tr`
73
101
  }
74
102
  }
75
103
  `;
76
- // Leading checkbox column. Narrow + centred so the control sits flush against the
77
- // row's left edge.
104
+ // Leading checkbox column. Fixed narrow width so it holds its own column under
105
+ // the mobile fixed table-layout (a 1% width would collapse and let the name
106
+ // cell's preview overlap the control).
78
107
  const CheckboxTd = styled(StyledTd)`
79
- width: 1%;
108
+ width: 5.6rem;
80
109
  white-space: nowrap;
81
110
  `;
82
111
  const CheckboxTh = styled(StyledTh)`
83
- width: 1%;
112
+ width: 5.6rem;
84
113
  white-space: nowrap;
85
114
  `;
115
+ // Flags an asset whose caption or alternative text is empty — mirrors the
116
+ // per-field warning shown in the details drawer. Pushed to the far end of the
117
+ // name cell (shrink 0 so a long name never crowds it out).
118
+ const MetadataWarning = styled(WarningCircle)`
119
+ flex-shrink: 0;
120
+ width: 1.6rem;
121
+ height: 1.6rem;
122
+
123
+ path {
124
+ fill: ${({ theme })=>theme.colors.warning500};
125
+ }
126
+ `;
86
127
  // The asset filename is its own interactive element: clicking it opens the
87
128
  // details drawer instead of selecting the row.
88
129
  const NameButton = styled.button`
@@ -103,8 +144,14 @@ const NameButton = styled.button`
103
144
  border-radius: 2px;
104
145
  }
105
146
  `;
147
+ // Shields the row from its own controls (checkbox, "..." trigger) without
148
+ // severing propagation for the menu's portaled content — those events are React
149
+ // children of the cell but not DOM descendants, and Radix needs them to reach
150
+ // `document` to dismiss its layers.
106
151
  const stopRowEvent = (e)=>{
107
- e.stopPropagation();
152
+ if (isEventFromWithin(e)) {
153
+ e.stopPropagation();
154
+ }
108
155
  };
109
156
  const AssetPreviewCell = ({ asset })=>{
110
157
  const { ext, mime } = asset;
@@ -124,20 +171,35 @@ const AssetPreviewCell = ({ asset })=>{
124
171
  });
125
172
  };
126
173
  const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
127
- const isMobile = useIsMobile();
174
+ const isDesktop = useIsDesktop();
128
175
  const { formatDate, formatMessage } = useIntl();
129
176
  const { isMovePending } = useAssetsDndOptional() ?? {
130
177
  isMovePending: false
131
178
  };
132
- const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);
179
+ const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);
133
180
  const { isSelected, toggle, selectRange } = useAssetSelection();
134
181
  const { canUpdate } = useMediaLibraryPermissions();
182
+ const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;
135
183
  const key = assetKey(asset.id);
136
184
  const selected = isSelected(key);
185
+ // Caption and alternative text apply to every file type — same "empty =
186
+ // falsy" rule as the drawer's per-field warning.
187
+ const isMetadataMissing = !asset.caption || !asset.alternativeText;
188
+ const metadataMissingLabel = formatMessage({
189
+ id: getTranslationKey('list.table.row.metadata-missing'),
190
+ defaultMessage: 'This asset is missing metadata (caption or alternative text).'
191
+ });
137
192
  // Plain click opens the asset details; pointer selection lives on the
138
193
  // checkbox only. Modifier clicks keep the selection semantics: shift selects
139
194
  // a range, cmd/ctrl toggles.
195
+ //
196
+ // The containment guard on this and the handler below is what keeps the
197
+ // actions menu's portaled dialogs — React children of this row — from
198
+ // opening the details drawer or toggling the selection.
140
199
  const handleRowClick = (e)=>{
200
+ if (!isEventFromWithin(e)) {
201
+ return;
202
+ }
141
203
  if (e.shiftKey) {
142
204
  selectRange(orderedItemKeys, key);
143
205
  } else if (e.metaKey || e.ctrlKey) {
@@ -148,6 +210,9 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
148
210
  };
149
211
  // Desktop: Space toggles selection (additive), Enter opens the details drawer.
150
212
  const handleKeyDown = (e)=>{
213
+ if (!isEventFromWithin(e)) {
214
+ return;
215
+ }
151
216
  if (e.key === 'Enter') {
152
217
  e.preventDefault();
153
218
  onAssetItemClick(asset.id);
@@ -174,14 +239,20 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
174
239
  ...listeners,
175
240
  $isDragging: isDragging,
176
241
  $isMovePending: isMovePending,
242
+ $isBusy: busyMessage !== null,
177
243
  $isSelected: selected,
178
244
  tabIndex: 0,
179
245
  role: "row",
180
246
  onDragStart: (e)=>e.preventDefault(),
181
247
  onClick: handleRowClick,
182
248
  onKeyDown: handleKeyDown,
249
+ onPointerDown: (e)=>{
250
+ if (isEventFromWithin(e)) {
251
+ listeners?.onPointerDown?.(e);
252
+ }
253
+ },
183
254
  children: [
184
- !isMobile && canUpdate && /*#__PURE__*/ jsx(CheckboxTd, {
255
+ canUpdate && /*#__PURE__*/ jsx(CheckboxTd, {
185
256
  onClick: stopRowEvent,
186
257
  onKeyDown: stopRowEvent,
187
258
  children: /*#__PURE__*/ jsx(Flex, {
@@ -199,38 +270,61 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
199
270
  }),
200
271
  /*#__PURE__*/ jsx(StyledTd, {
201
272
  children: /*#__PURE__*/ jsxs(Flex, {
202
- gap: 3,
203
273
  alignItems: "center",
274
+ justifyContent: "space-between",
275
+ gap: 2,
276
+ minWidth: 0,
204
277
  children: [
205
- /*#__PURE__*/ jsx(AssetPreviewCell, {
206
- asset: asset
207
- }),
208
278
  /*#__PURE__*/ jsxs(Flex, {
209
- direction: "column",
210
- alignItems: "flex-start",
279
+ gap: 3,
280
+ alignItems: "center",
211
281
  minWidth: 0,
212
282
  children: [
213
- /*#__PURE__*/ jsx(NameButton, {
214
- type: "button",
215
- onClick: handleNameClick,
216
- children: /*#__PURE__*/ jsx(Typography, {
217
- textColor: "neutral800",
218
- fontWeight: "semiBold",
219
- ellipsis: true,
220
- children: asset.name
283
+ busyMessage !== null ? /*#__PURE__*/ jsx(Flex, {
284
+ justifyContent: "center",
285
+ width: "3.2rem",
286
+ height: "3.2rem",
287
+ children: /*#__PURE__*/ jsx(Loader, {
288
+ small: true,
289
+ children: busyMessage
221
290
  })
291
+ }) : /*#__PURE__*/ jsx(AssetPreviewCell, {
292
+ asset: asset
222
293
  }),
223
- isMobile && /*#__PURE__*/ jsx(Typography, {
224
- textColor: "neutral600",
225
- variant: "pi",
226
- children: asset.size ? formatBytes(asset.size, 1) : '-'
294
+ /*#__PURE__*/ jsxs(Flex, {
295
+ direction: "column",
296
+ alignItems: "flex-start",
297
+ minWidth: 0,
298
+ children: [
299
+ /*#__PURE__*/ jsx(NameButton, {
300
+ type: "button",
301
+ onClick: handleNameClick,
302
+ children: /*#__PURE__*/ jsx(TruncatedText, {
303
+ textColor: "neutral800",
304
+ fontWeight: "semiBold",
305
+ children: asset.name
306
+ })
307
+ }),
308
+ !isDesktop && /*#__PURE__*/ jsx(Typography, {
309
+ textColor: "neutral600",
310
+ variant: "pi",
311
+ children: asset.size ? formatBytes(asset.size, 1) : '-'
312
+ })
313
+ ]
227
314
  })
228
315
  ]
316
+ }),
317
+ isMetadataMissing && /*#__PURE__*/ jsx(Tooltip, {
318
+ label: metadataMissingLabel,
319
+ children: /*#__PURE__*/ jsx(MetadataWarning, {
320
+ "aria-label": metadataMissingLabel,
321
+ role: "img"
322
+ })
229
323
  })
230
324
  ]
231
325
  })
232
326
  }),
233
- !isMobile && /*#__PURE__*/ jsxs(Fragment, {
327
+ isDesktop && /*#__PURE__*/ jsxs(Fragment, {
234
328
  children: [
235
329
  /*#__PURE__*/ jsx(StyledTd, {
236
330
  children: /*#__PURE__*/ jsx(Typography, {
@@ -257,16 +351,14 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
257
351
  ]
258
352
  }),
259
353
  /*#__PURE__*/ jsx(StyledTd, {
354
+ onClick: stopRowEvent,
355
+ onKeyDown: stopRowEvent,
356
+ onPointerDown: stopRowEvent,
260
357
  children: /*#__PURE__*/ jsx(Flex, {
261
358
  justifyContent: "flex-end",
262
- children: /*#__PURE__*/ jsx(IconButton, {
263
- label: formatMessage({
264
- id: getTranslationKey('control-card.more-actions'),
265
- defaultMessage: 'More actions'
266
- }),
267
- variant: "ghost",
268
- onClick: (e)=>e.stopPropagation(),
269
- children: /*#__PURE__*/ jsx(More, {})
359
+ children: /*#__PURE__*/ jsx(AssetActionsMenu, {
360
+ asset: asset,
361
+ dragData: dragData
270
362
  })
271
363
  })
272
364
  })
@@ -279,7 +371,7 @@ const FolderTr = styled(StyledTr)`
279
371
  }
280
372
  `;
281
373
  const FolderRow = ({ folder, orderedItemKeys })=>{
282
- const isMobile = useIsMobile();
374
+ const isDesktop = useIsDesktop();
283
375
  const { formatDate, formatMessage } = useIntl();
284
376
  const { navigateToFolder } = useFolderNavigation();
285
377
  const { isSelected, toggle, selectRange } = useAssetSelection();
@@ -287,11 +379,18 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
287
379
  const { isMovePending } = useAssetsDndOptional() ?? {
288
380
  isMovePending: false
289
381
  };
290
- const { draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useFolderDraggableDroppable(folder);
382
+ const { dragData, draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useFolderDraggableDroppable(folder);
291
383
  const key = folderKey(folder.id);
292
384
  // Folders share the selection mechanism with assets. Only the plain-click
293
385
  // semantic differs: it navigates into the folder instead of selecting it.
386
+ //
387
+ // The containment guard on this and the handlers below is what keeps the
388
+ // actions menu's portaled dialogs — React children of this row — from
389
+ // navigating into the folder or starting a drag.
294
390
  const handleRowClick = (e)=>{
391
+ if (!isEventFromWithin(e)) {
392
+ return;
393
+ }
295
394
  if (e.shiftKey) {
296
395
  selectRange(orderedItemKeys, key);
297
396
  } else if (e.metaKey || e.ctrlKey) {
@@ -302,6 +401,9 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
302
401
  };
303
402
  // Enter navigates into the folder, Space toggles selection (same as assets).
304
403
  const handleKeyDown = (e)=>{
404
+ if (!isEventFromWithin(e)) {
405
+ return;
406
+ }
305
407
  if (e.key === 'Enter') {
306
408
  e.preventDefault();
307
409
  navigateToFolder(folder);
@@ -332,11 +434,20 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
332
434
  $isSelected: isSelected(key),
333
435
  tabIndex: 0,
334
436
  role: "row",
335
- onDragStart: (e)=>e.preventDefault(),
437
+ onDragStart: (e)=>{
438
+ if (isEventFromWithin(e)) {
439
+ e.preventDefault();
440
+ }
441
+ },
336
442
  onClick: handleRowClick,
337
443
  onKeyDown: handleKeyDown,
444
+ onPointerDown: (e)=>{
445
+ if (isEventFromWithin(e)) {
446
+ listeners?.onPointerDown?.(e);
447
+ }
448
+ },
338
449
  children: [
339
- !isMobile && canUpdate && /*#__PURE__*/ jsx(CheckboxTd, {
450
+ canUpdate && /*#__PURE__*/ jsx(CheckboxTd, {
340
451
  onClick: stopRowEvent,
341
452
  onKeyDown: stopRowEvent,
342
453
  children: /*#__PURE__*/ jsx(Flex, {
@@ -356,6 +467,7 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
356
467
  children: /*#__PURE__*/ jsxs(Flex, {
357
468
  gap: 3,
358
469
  alignItems: "center",
470
+ minWidth: 0,
359
471
  children: [
360
472
  /*#__PURE__*/ jsx(Flex, {
361
473
  justifyContent: "center",
@@ -370,16 +482,15 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
370
482
  height: 20
371
483
  })
372
484
  }),
373
- /*#__PURE__*/ jsx(Typography, {
485
+ /*#__PURE__*/ jsx(TruncatedText, {
374
486
  textColor: "neutral800",
375
487
  fontWeight: "semiBold",
376
- ellipsis: true,
377
488
  children: folder.name
378
489
  })
379
490
  ]
380
491
  })
381
492
  }),
382
- !isMobile && /*#__PURE__*/ jsxs(Fragment, {
493
+ isDesktop && /*#__PURE__*/ jsxs(Fragment, {
383
494
  children: [
384
495
  /*#__PURE__*/ jsx(StyledTd, {
385
496
  children: /*#__PURE__*/ jsx(Typography, {
@@ -406,16 +517,14 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
406
517
  ]
407
518
  }),
408
519
  /*#__PURE__*/ jsx(StyledTd, {
520
+ onClick: stopRowEvent,
521
+ onKeyDown: stopRowEvent,
522
+ onPointerDown: stopRowEvent,
409
523
  children: /*#__PURE__*/ jsx(Flex, {
410
524
  justifyContent: "flex-end",
411
- children: /*#__PURE__*/ jsx(IconButton, {
412
- label: formatMessage({
413
- id: getTranslationKey('control-card.more-actions'),
414
- defaultMessage: 'More actions'
415
- }),
416
- variant: "ghost",
417
- onClick: (e)=>e.stopPropagation(),
418
- children: /*#__PURE__*/ jsx(More, {})
525
+ children: /*#__PURE__*/ jsx(FolderActionsMenu, {
526
+ folder: folder,
527
+ dragData: dragData
419
528
  })
420
529
  })
421
530
  })
@@ -423,16 +532,18 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
423
532
  });
424
533
  };
425
534
  const AssetsTable = ({ assets, folders = [], mixedItems = null, onAssetItemClick })=>{
426
- const isMobile = useIsMobile();
535
+ const isDesktop = useIsDesktop();
427
536
  const { formatMessage } = useIntl();
428
537
  const { selectedKeys, selectAll, clear } = useAssetSelection();
429
538
  const { canUpdate } = useMediaLibraryPermissions();
430
- const visibleHeaders = isMobile ? TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions') : TABLE_HEADERS;
539
+ const { trackUsage } = useTracking();
540
+ // Below the desktop breakpoint only the name (and actions) column is kept —
541
+ // the date/size columns don't fit; size moves under the name as a subtitle.
542
+ const visibleHeaders = isDesktop ? TABLE_HEADERS : TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions');
431
543
  // The checkbox column is a dedicated structural column (not part of
432
- // TABLE_HEADERS). Hidden on mobile (multi-select deferred) and without the
433
- // update permission — every bulk action needs `assets.update`, so a
434
- // read-only user has nothing to select for.
435
- const showCheckboxColumn = !isMobile && canUpdate;
544
+ // TABLE_HEADERS). Hidden only without the update permission every bulk
545
+ // action needs `assets.update`, so a read-only user has nothing to select for.
546
+ const showCheckboxColumn = canUpdate;
436
547
  const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);
437
548
  const totalRows = folders.length + assets.length;
438
549
  // Render order — folders first by default, or the interleaved mixed order.
@@ -446,6 +557,7 @@ const AssetsTable = ({ assets, folders = [], mixedItems = null, onAssetItemClick
446
557
  if (allSelected) {
447
558
  clear();
448
559
  } else {
560
+ trackUsage('didSelectAllMediaLibraryElements');
449
561
  selectAll(orderedItemKeys);
450
562
  }
451
563
  };