@strapi/upload 5.57.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +141 -0
  2. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
  3. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +139 -0
  4. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
  5. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +129 -0
  6. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
  7. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +127 -0
  8. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
  9. package/dist/admin/components/MediaLibraryInput/AssetRow.js +144 -0
  10. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
  11. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +142 -0
  12. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
  13. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +397 -0
  14. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  15. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +395 -0
  16. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  17. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +45 -0
  18. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +1 -0
  19. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +43 -0
  20. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +1 -0
  21. package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
  22. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
  23. package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
  24. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
  25. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
  26. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  27. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
  28. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  29. package/dist/admin/hooks/useMediaLibraryPermissions.js +4 -0
  30. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  31. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +4 -0
  32. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  33. package/dist/admin/hooks/useTracking.js +5 -1
  34. package/dist/admin/hooks/useTracking.js.map +1 -1
  35. package/dist/admin/hooks/useTracking.mjs +5 -1
  36. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  37. package/dist/admin/index.js +7 -2
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/admin/index.mjs +7 -2
  40. package/dist/admin/index.mjs.map +1 -1
  41. package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
  42. package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
  43. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js +9 -1
  44. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js.map +1 -1
  45. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs +9 -1
  46. package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  47. package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
  48. package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
  49. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
  50. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
  51. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
  52. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
  53. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
  54. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
  55. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
  56. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  57. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
  58. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  59. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  60. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  61. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
  62. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
  63. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
  64. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
  65. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
  66. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  67. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
  68. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  69. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
  70. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  71. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
  72. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  73. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
  74. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  75. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
  76. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  77. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js +20 -6
  78. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  79. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +20 -6
  80. package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  81. package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
  82. package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
  83. package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
  84. package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
  85. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
  86. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
  87. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
  88. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  89. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
  90. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  91. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
  92. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  93. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
  94. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  95. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
  96. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  97. package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
  98. package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
  99. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
  100. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
  101. package/dist/admin/legacy/components/TableList/TableList.js +3 -1
  102. package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
  103. package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
  104. package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
  105. package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
  106. package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
  107. package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
  108. package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
  109. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
  110. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  111. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
  112. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  113. package/dist/admin/legacy/hooks/useEditAsset.js +11 -6
  114. package/dist/admin/legacy/hooks/useEditAsset.js.map +1 -1
  115. package/dist/admin/legacy/hooks/useEditAsset.mjs +12 -7
  116. package/dist/admin/legacy/hooks/useEditAsset.mjs.map +1 -1
  117. package/dist/admin/legacy/hooks/useUpload.js +6 -4
  118. package/dist/admin/legacy/hooks/useUpload.js.map +1 -1
  119. package/dist/admin/legacy/hooks/useUpload.mjs +6 -4
  120. package/dist/admin/legacy/hooks/useUpload.mjs.map +1 -1
  121. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  122. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  123. package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
  124. package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
  125. package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
  126. package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
  127. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
  128. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
  129. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
  130. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
  131. package/dist/admin/pages/Assets/components/AssetsGrid.js +2 -1
  132. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  133. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +2 -1
  134. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  135. package/dist/admin/pages/Assets/components/AssetsTable.js +2 -1
  136. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  137. package/dist/admin/pages/Assets/components/AssetsTable.mjs +2 -1
  138. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  139. package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
  140. package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
  141. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +3 -1
  142. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  143. package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
  144. package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
  145. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
  146. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
  147. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
  148. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  149. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
  150. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  151. package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
  152. package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
  153. package/dist/admin/pages/Assets/components/FilterBadges.mjs +33 -4
  154. package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
  155. package/dist/admin/services/api.js +15 -5
  156. package/dist/admin/services/api.js.map +1 -1
  157. package/dist/admin/services/api.mjs +15 -5
  158. package/dist/admin/services/api.mjs.map +1 -1
  159. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
  160. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +13 -0
  161. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +15 -0
  162. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +26 -0
  163. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +10 -0
  164. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +1 -0
  165. package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
  166. package/dist/admin/src/legacy/hooks/useEditAsset.d.ts +13 -22
  167. package/dist/admin/src/legacy/hooks/useUpload.d.ts +1 -1
  168. package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
  169. package/dist/admin/src/services/api.d.ts +6 -0
  170. package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
  171. package/dist/admin/translations/ca.json.js +3 -3
  172. package/dist/admin/translations/ca.json.mjs +3 -3
  173. package/dist/admin/translations/da.json.js +1 -1
  174. package/dist/admin/translations/da.json.mjs +1 -1
  175. package/dist/admin/translations/de.json.js +1 -1
  176. package/dist/admin/translations/de.json.mjs +1 -1
  177. package/dist/admin/translations/en.json.js +9 -0
  178. package/dist/admin/translations/en.json.js.map +1 -1
  179. package/dist/admin/translations/en.json.mjs +9 -0
  180. package/dist/admin/translations/en.json.mjs.map +1 -1
  181. package/dist/admin/translations/es.json.js +1 -1
  182. package/dist/admin/translations/es.json.mjs +1 -1
  183. package/dist/admin/translations/sk.json.js +2 -2
  184. package/dist/admin/translations/sk.json.mjs +2 -2
  185. package/dist/admin/translations/tr.json.js +2 -2
  186. package/dist/admin/translations/tr.json.mjs +2 -2
  187. package/dist/admin/translations/zh-Hans.json.js +1 -1
  188. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  189. package/dist/admin/translations/zh.json.js +2 -2
  190. package/dist/admin/translations/zh.json.mjs +2 -2
  191. package/dist/admin/utils/allowedMediaTypes.js +42 -0
  192. package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
  193. package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
  194. package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
  195. package/dist/server/config.js +6 -0
  196. package/dist/server/config.js.map +1 -1
  197. package/dist/server/config.mjs +6 -0
  198. package/dist/server/config.mjs.map +1 -1
  199. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  200. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  201. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  202. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  203. package/dist/server/mcp/ambient-instance.js +7 -5
  204. package/dist/server/mcp/ambient-instance.js.map +1 -1
  205. package/dist/server/mcp/ambient-instance.mjs +7 -5
  206. package/dist/server/mcp/ambient-instance.mjs.map +1 -1
  207. package/dist/server/mcp/handlers/folder-handlers.js +4 -16
  208. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
  209. package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
  210. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
  211. package/dist/server/mcp/handlers/read-handlers.js +6 -14
  212. package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
  213. package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
  214. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
  215. package/dist/server/mcp/handlers/write-handlers.js +3 -13
  216. package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
  217. package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
  218. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
  219. package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
  220. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
  221. package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
  222. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
  223. package/dist/server/services/extensions/utils.js +1 -1
  224. package/dist/server/services/extensions/utils.js.map +1 -1
  225. package/dist/server/services/extensions/utils.mjs +1 -1
  226. package/dist/server/services/extensions/utils.mjs.map +1 -1
  227. package/dist/server/services/image-manipulation.js +33 -14
  228. package/dist/server/services/image-manipulation.js.map +1 -1
  229. package/dist/server/services/image-manipulation.mjs +33 -14
  230. package/dist/server/services/image-manipulation.mjs.map +1 -1
  231. package/dist/server/src/config.d.ts +3 -0
  232. package/dist/server/src/config.d.ts.map +1 -1
  233. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  234. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  235. package/dist/server/src/index.d.ts +3 -0
  236. package/dist/server/src/index.d.ts.map +1 -1
  237. package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
  238. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  239. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
  240. package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
  241. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
  242. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
  243. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
  244. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
  245. package/dist/server/src/services/extensions/utils.d.ts +1 -1
  246. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  247. package/dist/server/src/types.d.ts +1 -0
  248. package/dist/server/src/types.d.ts.map +1 -1
  249. package/dist/server/utils/mime-validation.js +1 -1
  250. package/dist/server/utils/mime-validation.js.map +1 -1
  251. package/dist/server/utils/mime-validation.mjs +1 -1
  252. package/dist/server/utils/mime-validation.mjs.map +1 -1
  253. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsTable.mjs","sources":["../../../../../admin/src/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 { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS, 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 { buildRenderedKeys } from '../utils/renderedKeys';\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';\nimport { useItemContextMenuTrigger } from './ItemContextMenu';\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 /* An auto layout lets every column but the name size itself to its content,\n so the dates never wrap. The name cell is what absorbs the leftover and\n ellipsizes — see NameTd. */\n table-layout: auto;\n\n & td:last-child,\n & th:last-child {\n width: 5.6rem;\n white-space: nowrap;\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\n/**\n * Column sizing, applied to the header and body cells alike.\n *\n * `hug` shrinks a column to its content: `width: 1%` is a floor the content\n * overrides, and `nowrap` stops a date breaking across lines.\n *\n * `flex` claims everything left over. `width: 100%` asks for all of it and\n * `max-width: 0` is what allows the cell to be narrower than its content, which\n * is what lets the name inside ellipsize instead of widening the table.\n */\nconst hugColumn = css`\n width: 1%;\n white-space: nowrap;\n`;\n\nconst flexColumn = css`\n width: 100%;\n max-width: 0;\n overflow: hidden;\n`;\n\nconst StyledTh = styled(RawTh)<{ $flex?: boolean }>`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n\n ${({ $flex }) => ($flex ? flexColumn : hugColumn)}\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\n/** The name column: takes whatever the others leave and ellipsizes. */\nconst NameTd = styled(StyledTd)`\n ${flexColumn}\n`;\n\n/** Every other column: as wide as its content, never wrapping. */\nconst HugTd = styled(StyledTd)`\n ${hugColumn}\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 const openContextMenu = useItemContextMenuTrigger();\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 {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n // Right-click opens this asset's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'asset', asset, dragData });\n }\n }}\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 {...ASSET_ITEM_CONTROL_PROPS} 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 <NameTd>\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 </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </HugTd>\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\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopRowEvent}\n onKeyDown={stopRowEvent}\n onPointerDown={stopRowEvent}\n >\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 openContextMenu = useItemContextMenuTrigger();\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 // Right-click opens this folder's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'folder', folder, dragData });\n }\n }}\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 <NameTd>\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 </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </HugTd>\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 /** Keys of the rendered rows, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = [],\n mixedItems = null,\n renderedKeys,\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[] =\n renderedKeys ?? buildRenderedKeys({ folders, assets, mixedItems });\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} $flex={header.name === '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} $flex={header.name === '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","hugColumn","css","flexColumn","StyledTh","RawTh","spaces","$flex","StyledTd","RawTd","NameTd","HugTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isBusy","$isInvalidDropTarget","$isDragging","$isValidDropTarget","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","openContextMenu","useItemContextMenuTrigger","key","assetKey","selected","isMetadataMissing","caption","alternativeText","metadataMissingLabel","getTranslationKey","defaultMessage","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","ASSET_DETAILS_TRIGGER_PROPS","tabIndex","role","data-native-context-menu","onContextMenu","kind","onDragStart","onClick","onKeyDown","onPointerDown","ASSET_ITEM_CONTROL_PROPS","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","renderedKeys","selectedKeys","selectAll","clear","trackUsage","useTracking","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","buildRenderedKeys","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","item"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsTable.mjs","sources":["../../../../../admin/src/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 { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS, 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 { buildRenderedKeys } from '../utils/renderedKeys';\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';\nimport { useItemContextMenuTrigger } from './ItemContextMenu';\n\nimport type { File } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\n\nconst EMPTY_FOLDERS: NonNullable<AssetsTableProps['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 /* An auto layout lets every column but the name size itself to its content,\n so the dates never wrap. The name cell is what absorbs the leftover and\n ellipsizes — see NameTd. */\n table-layout: auto;\n\n & td:last-child,\n & th:last-child {\n width: 5.6rem;\n white-space: nowrap;\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\n/**\n * Column sizing, applied to the header and body cells alike.\n *\n * `hug` shrinks a column to its content: `width: 1%` is a floor the content\n * overrides, and `nowrap` stops a date breaking across lines.\n *\n * `flex` claims everything left over. `width: 100%` asks for all of it and\n * `max-width: 0` is what allows the cell to be narrower than its content, which\n * is what lets the name inside ellipsize instead of widening the table.\n */\nconst hugColumn = css`\n width: 1%;\n white-space: nowrap;\n`;\n\nconst flexColumn = css`\n width: 100%;\n max-width: 0;\n overflow: hidden;\n`;\n\nconst StyledTh = styled(RawTh)<{ $flex?: boolean }>`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n\n ${({ $flex }) => ($flex ? flexColumn : hugColumn)}\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\n/** The name column: takes whatever the others leave and ellipsizes. */\nconst NameTd = styled(StyledTd)`\n ${flexColumn}\n`;\n\n/** Every other column: as wide as its content, never wrapping. */\nconst HugTd = styled(StyledTd)`\n ${hugColumn}\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 const openContextMenu = useItemContextMenuTrigger();\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 {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n // Right-click opens this asset's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'asset', asset, dragData });\n }\n }}\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 {...ASSET_ITEM_CONTROL_PROPS} 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 <NameTd>\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 </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </HugTd>\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\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopRowEvent}\n onKeyDown={stopRowEvent}\n onPointerDown={stopRowEvent}\n >\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 openContextMenu = useItemContextMenuTrigger();\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 // Right-click opens this folder's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'folder', folder, dragData });\n }\n }}\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 <NameTd>\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 </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </HugTd>\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 /** Keys of the rendered rows, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = EMPTY_FOLDERS,\n mixedItems = null,\n renderedKeys,\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[] =\n renderedKeys ?? buildRenderedKeys({ folders, assets, mixedItems });\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} $flex={header.name === '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} $flex={header.name === '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":["EMPTY_FOLDERS","StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","hugColumn","css","flexColumn","StyledTh","RawTh","spaces","$flex","StyledTd","RawTd","NameTd","HugTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isBusy","$isInvalidDropTarget","$isDragging","$isValidDropTarget","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","openContextMenu","useItemContextMenuTrigger","key","assetKey","selected","isMetadataMissing","caption","alternativeText","metadataMissingLabel","getTranslationKey","defaultMessage","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","ASSET_DETAILS_TRIGGER_PROPS","tabIndex","role","data-native-context-menu","onContextMenu","kind","onDragStart","onClick","onKeyDown","onPointerDown","ASSET_ITEM_CONTROL_PROPS","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","renderedKeys","selectedKeys","selectAll","clear","trackUsage","useTracking","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","buildRenderedKeys","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","item"],"mappings":"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"}
@@ -22,6 +22,8 @@ var BulkMoveDialog = require('./BulkMoveDialog.js');
22
22
  var DeleteItemsDialog = require('./DeleteItemsDialog.js');
23
23
  var api = require('../../../services/api.js');
24
24
 
25
+ const EMPTY_ASSETS = [];
26
+ const EMPTY_RENDERED_KEYS = [];
25
27
  /**
26
28
  * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the
27
29
  * bottom edge (no radius, top border only). Desktop (medium+): a floating,
@@ -118,7 +120,7 @@ const VerticalDivider = styledComponents.styled(designSystem.Box)`
118
120
  background: ${({ theme })=>theme.colors.neutral150};
119
121
  margin-left: ${({ theme })=>theme.spaces[1]};
120
122
  `;
121
- const BulkActionsBar = ({ assets = [], locations = itemLocations.emptyItemLocations, renderedKeys = [] })=>{
123
+ const BulkActionsBar = ({ assets = EMPTY_ASSETS, locations = itemLocations.emptyItemLocations, renderedKeys = EMPTY_RENDERED_KEYS })=>{
122
124
  const { formatMessage } = reactIntl.useIntl();
123
125
  const { toggleNotification } = strapiAdmin.useNotification();
124
126
  // No mime argument: the action is selection-scoped, so the per-asset
@@ -1 +1 @@
1
- {"version":3,"file":"BulkActionsBar.js","sources":["../../../../../admin/src/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n TextButton,\n Tooltip,\n Typography,\n} from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { AI_METADATA_MAX_FILES, isAIMetadataSupportedMime } from '../../../../../shared/constants';\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useGenerateAiMetadataMutation } from '../../../services/assets';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { emptyItemLocations, type ItemLocations } from '../../../utils/itemLocations';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { useIsAssetDetailsOpen } from '../hooks/useIsAssetDetailsOpen';\nimport { type ItemKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\n/**\n * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the\n * bottom edge (no radius, top border only). Desktop (medium+): a floating,\n * centered pill.\n */\nconst Bar = styled(Flex)<{ $isDrawerOpen: boolean; $isStacked: boolean }>`\n position: fixed;\n z-index: ${({ theme }) => theme.zIndices.popover};\n left: 0;\n right: 0;\n bottom: 0;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 0;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 0;\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n\n /* Docked full-bleed at the bottom on mobile, which is exactly where the open\n drawer keeps its own actions — so it steps aside there, and only there. */\n display: ${({ $isDrawerOpen }) => ($isDrawerOpen ? 'none' : 'flex')};\n\n /* Mobile with the metadata action present: the labelled button plus the icons\n no longer fit beside the count on one line, so the count takes a row of its\n own and every button drops to the next.\n\n Addressed by slot rather than by position: these rules used to use\n nth-child, which silently retargeted the moment a control was inserted\n into the row. */\n ${({ $isStacked }) =>\n $isStacked &&\n css`\n flex-wrap: wrap;\n justify-content: space-between;\n\n > [data-bar-slot='count'] {\n flex-basis: 100%;\n margin-right: 0;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: 0;\n }\n\n /* The divider only existed to set the clear action apart from the rest;\n with the row spread it would hang in mid-air between them. */\n > [data-bar-slot='divider'] {\n display: none;\n }\n `}\n\n ${({ theme }) => theme.breakpoints.medium} {\n display: flex;\n left: 50%;\n right: auto;\n bottom: ${({ theme }) => theme.spaces[4]};\n transform: translateX(-50%);\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n /* Sized by its content, capped so the pill can never span the whole\n viewport. The nowrap is what lets the content set that width — without it\n the labels wrap and the bar reads as narrow and tall. Inherited, so it\n covers every label inside.\n\n Deliberately not applied on mobile: there the bar is full-bleed and\n cannot grow, so refusing to wrap would clip the last action on a narrow\n phone rather than widen anything. */\n white-space: nowrap;\n max-width: 90%;\n\n /* One line again from tablet up, where it fits. */\n flex-wrap: nowrap;\n\n > [data-bar-slot='count'] {\n flex-basis: auto;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: auto;\n }\n\n > [data-bar-slot='divider'] {\n display: block;\n }\n }\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\ninterface BulkActionsBarProps {\n /**\n * The assets currently rendered in the list, used to resolve the mime types\n * of the selection — the bar needs them to know which selected assets the AI\n * provider can actually read.\n *\n * Selection is page-scoped and cleared whenever the list identity changes, so\n * every selected asset id is guaranteed to appear here.\n */\n assets?: File[];\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent. Defaults to a lookup that misses\n * everything, which falls back to the folder currently open.\n */\n locations?: ItemLocations;\n /**\n * Keys of the items on screen, in render order. Owned by the view so\n * select-all covers exactly what the user can see — in mixed mode that is not\n * every folder.\n */\n renderedKeys?: ItemKey[];\n}\n\nexport const BulkActionsBar = ({\n assets = [],\n locations = emptyItemLocations,\n renderedKeys = [],\n}: BulkActionsBarProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n // No mime argument: the action is selection-scoped, so the per-asset\n // allowlist check happens below in `eligibleCount`.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n // Every bulk action (move, delete, metadata) is an `assets.update` mutation\n // server-side — one flag gates the whole cluster.\n const { canUpdate } = useMediaLibraryPermissions();\n const { selectedIds, selectedFolderIds, selectAll, clear } = useAssetSelection();\n const { trackUsage } = useTracking();\n const { currentFolderId } = useFolderNavigation();\n const isDetailsDrawerOpen = useIsAssetDetailsOpen();\n const [generateAiMetadata, { isLoading: isGeneratingMetadata }] = useGenerateAiMetadataMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n // The delete request lives in DeleteItemsDialog; the bar mirrors its pending\n // state so the rest of the controls stay disabled for the duration.\n const [isDeleting, setIsDeleting] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n // `innerHeight - top` rather than the bar's height: it also spans the gap the\n // bar floats above the viewport edge (0 docked on mobile, `spaces[4]` for the\n // desktop pill), so one measurement covers both layouts and no height is\n // hardcoded.\n const [barEl, setBarEl] = useState<HTMLElement | null>(null);\n const [reservedSpace, setReservedSpace] = useState(0);\n\n useEffect(() => {\n if (!barEl) {\n setReservedSpace(0);\n return;\n }\n\n const measure = () => {\n const rect = barEl.getBoundingClientRect();\n // Zero height means the CSS has hidden the bar (drawer open on mobile) —\n // reserving anything then would leave a gap under nothing.\n setReservedSpace(rect.height === 0 ? 0 : Math.max(0, window.innerHeight - rect.top));\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(barEl);\n window.addEventListener('resize', measure);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', measure);\n };\n // `isDetailsDrawerOpen` toggles the bar's `display`, which a ResizeObserver\n // is not guaranteed to report.\n }, [barEl, isDetailsDrawerOpen]);\n\n const handleSelectAll = () => {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(renderedKeys);\n };\n const isBusy = isDeleting || isGeneratingMetadata;\n\n // Stable identity: the move dialog memoizes its destination walk on it. Each\n // item's real location comes from `locations`, so a selection made under a\n // global search validates against each item's own parent rather than the\n // folder currently open.\n const moveItems = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, locations, currentFolderId),\n [selectedIds, selectedFolderIds, locations, currentFolderId]\n );\n\n /**\n * The server processes the whole selection inside a single request and\n * rejects anything above the cap with a 400. Disable the action up front so\n * the limit is discoverable before the user commits to a request.\n */\n const isOverMetadataLimit = selectedIds.size > AI_METADATA_MAX_FILES;\n\n /**\n * How many selected assets the AI provider can actually read. The server\n * stays authoritative — it still reports what it skipped — but a selection\n * with nothing eligible (a lone PDF, say) would only ever come back fully\n * skipped, so there is no point sending it.\n */\n const eligibleCount = useMemo(() => {\n const mimeById = new Map(assets.map(({ id, mime }) => [id, mime]));\n\n return [...selectedIds].filter((id) => isAIMetadataSupportedMime(mimeById.get(id))).length;\n }, [assets, selectedIds]);\n\n const hasNoEligibleAssets = selectedIds.size > 0 && eligibleCount === 0;\n\n /**\n * Why the action is unavailable, surfaced on hover. `undefined` leaves the\n * button without a tooltip — either it is usable, or it is disabled for a\n * reason the selection count already makes obvious.\n */\n let metadataDisabledReason: string | undefined;\n\n if (isOverMetadataLimit) {\n metadataDisabledReason = formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.too-many'),\n defaultMessage:\n 'Metadata can be generated for up to {max} assets at a time. Select fewer assets to continue.',\n },\n { max: AI_METADATA_MAX_FILES }\n );\n } else if (hasNoEligibleAssets) {\n metadataDisabledReason = formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.no-eligible'),\n defaultMessage:\n 'Metadata can only be generated for images. None of the selected assets are supported.',\n });\n }\n\n /**\n * Metadata generation only applies to images — folders and unsupported files\n * in the selection are reported back rather than blocking the action.\n */\n const handleCreateMetadata = async () => {\n // Guard re-entry while pending, and never send a selection the server\n // would reject outright or skip in full.\n if (isGeneratingMetadata || isOverMetadataLimit || hasNoEligibleAssets) {\n return;\n }\n\n const fileIds = Array.from(selectedIds);\n const res = await generateAiMetadata({ fileIds });\n\n if ('error' in res) {\n // Keep the selection intact so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n const successCount = res.data.filter(({ status }) => status === 'success').length;\n const skippedCount = res.data.filter(({ status }) => status === 'skipped').length;\n const errorCount = res.data.filter(({ status }) => status === 'error').length;\n // Folders are never sent, so they are not part of the response — but the\n // user selected them, and a silent omission reads as a bug.\n const folderCount = selectedFolderIds.size;\n\n if (errorCount === res.data.length) {\n // Nothing was written — treat it like a request-level failure and keep\n // the selection so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n if (skippedCount === 0 && errorCount === 0 && folderCount === 0) {\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.success'),\n defaultMessage:\n '{count, plural, =1 {Metadata generated for # asset} other {Metadata generated for # assets}}',\n },\n { count: successCount }\n ),\n });\n } else {\n // Partial outcome: report every bucket so the user knows what was left\n // out — including folders, which were never eligible in the first place.\n toggleNotification({\n type: 'warning',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.partial'),\n defaultMessage:\n '{successCount} generated, {skippedCount} skipped (unsupported file type), {errorCount} failed{folderCount, plural, =0 {} one {, # folder ignored} other {, # folders ignored}}',\n },\n { successCount, skippedCount, errorCount, folderCount }\n ),\n });\n }\n\n clear();\n };\n\n // Every bulk action is behind `assets.update`; with nothing selected, or\n // without the permission, the bar has nothing to offer — drop it entirely\n // rather than show a count + \"Clear selection\" over no actions (mirrors the\n // drawer footer, which hides when no permitted action survives).\n //\n // With the drawer open the bar is hidden on mobile only, in CSS: there the two\n // are stacked at `bottom: 0` and the bar (popover, 500) would cover the\n // drawer's footer actions, since the drawer sits below the overlay token at\n // 200. From `medium` up the drawer is a side panel and the bar is a centered\n // pill, so they no longer collide.\n if (count === 0 || !canUpdate) {\n return null;\n }\n\n return (\n <>\n <Box aria-hidden height={`${reservedSpace}px`} data-bar-spacer />\n <Bar\n ref={setBarEl}\n $isDrawerOpen={isDetailsDrawerOpen}\n $isStacked={isAiMetadataEnabled}\n tag=\"section\"\n role=\"region\"\n // The bar floats over the list but is not part of its background: a\n // right-click on it keeps the browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography data-bar-slot=\"count\" fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <TextButton onClick={handleSelectAll} marginRight={4} disabled={isBusy}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.select-all'),\n defaultMessage: 'Select all',\n })}\n </TextButton>\n\n {/* Past the early return the user always has `assets.update`, so the\n individual actions no longer re-check it. */}\n <ActionCluster data-bar-slot=\"actions\">\n {isAiMetadataEnabled && (\n <Tooltip label={metadataDisabledReason}>\n {/* Wrapped so the tooltip still receives pointer events while the\n button itself is disabled. */}\n <Box>\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={\n isBusy || selectedIds.size === 0 || isOverMetadataLimit || hasNoEligibleAssets\n }\n loading={isGeneratingMetadata}\n onClick={handleCreateMetadata}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n </Box>\n </Tooltip>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog\n open={isMoveDialogOpen}\n onClose={() => setIsMoveDialogOpen(false)}\n items={moveItems}\n onSuccess={clear}\n />\n\n <IconButton\n variant=\"danger-light\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n onClick={() => setIsDeleteDialogOpen(true)}\n >\n <Trash />\n </IconButton>\n <DeleteItemsDialog\n open={isDeleteDialogOpen}\n onClose={() => setIsDeleteDialogOpen(false)}\n target={{\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n }}\n onSuccess={clear}\n onPendingChange={setIsDeleting}\n />\n </ActionCluster>\n\n <VerticalDivider data-bar-slot=\"divider\" aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isBusy}\n >\n <Cross />\n </IconButton>\n </Bar>\n </>\n );\n};\n"],"names":["Bar","styled","Flex","theme","zIndices","popover","spaces","colors","neutral0","neutral150","shadows","popupShadow","$isDrawerOpen","$isStacked","css","breakpoints","medium","borderRadius","ActionCluster","VerticalDivider","Box","BulkActionsBar","assets","locations","emptyItemLocations","renderedKeys","formatMessage","useIntl","toggleNotification","useNotification","isAiMetadataEnabled","useAIMetadataEnabled","canUpdate","useMediaLibraryPermissions","selectedIds","selectedFolderIds","selectAll","clear","useAssetSelection","trackUsage","useTracking","currentFolderId","useFolderNavigation","isDetailsDrawerOpen","useIsAssetDetailsOpen","generateAiMetadata","isLoading","isGeneratingMetadata","useGenerateAiMetadataMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","isDeleting","setIsDeleting","count","size","barEl","setBarEl","reservedSpace","setReservedSpace","useEffect","measure","rect","getBoundingClientRect","height","Math","max","window","innerHeight","top","observer","ResizeObserver","observe","addEventListener","disconnect","removeEventListener","handleSelectAll","isBusy","moveItems","useMemo","buildDragSetFromSelection","isOverMetadataLimit","AI_METADATA_MAX_FILES","eligibleCount","mimeById","Map","map","id","mime","filter","isAIMetadataSupportedMime","get","length","hasNoEligibleAssets","metadataDisabledReason","getTranslationKey","defaultMessage","handleCreateMetadata","fileIds","Array","from","res","type","message","successCount","data","status","skippedCount","errorCount","folderCount","_jsxs","_Fragment","_jsx","aria-hidden","data-bar-spacer","ref","tag","role","data-native-context-menu","aria-label","Typography","data-bar-slot","fontWeight","textColor","marginRight","TextButton","onClick","disabled","Tooltip","label","Button","startIcon","Sparkle","loading","IconButton","variant","ArrowRight","BulkMoveDialog","open","onClose","items","onSuccess","Trash","DeleteItemsDialog","target","folderIds","onPendingChange","Cross"],"mappings":"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"}
1
+ {"version":3,"file":"BulkActionsBar.js","sources":["../../../../../admin/src/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n TextButton,\n Tooltip,\n Typography,\n} from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { AI_METADATA_MAX_FILES, isAIMetadataSupportedMime } from '../../../../../shared/constants';\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useGenerateAiMetadataMutation } from '../../../services/assets';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { emptyItemLocations, type ItemLocations } from '../../../utils/itemLocations';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { useIsAssetDetailsOpen } from '../hooks/useIsAssetDetailsOpen';\nimport { type ItemKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\nconst EMPTY_ASSETS: NonNullable<BulkActionsBarProps['assets']> = [];\nconst EMPTY_RENDERED_KEYS: NonNullable<BulkActionsBarProps['renderedKeys']> = [];\n\n/**\n * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the\n * bottom edge (no radius, top border only). Desktop (medium+): a floating,\n * centered pill.\n */\nconst Bar = styled(Flex)<{ $isDrawerOpen: boolean; $isStacked: boolean }>`\n position: fixed;\n z-index: ${({ theme }) => theme.zIndices.popover};\n left: 0;\n right: 0;\n bottom: 0;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 0;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 0;\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n\n /* Docked full-bleed at the bottom on mobile, which is exactly where the open\n drawer keeps its own actions — so it steps aside there, and only there. */\n display: ${({ $isDrawerOpen }) => ($isDrawerOpen ? 'none' : 'flex')};\n\n /* Mobile with the metadata action present: the labelled button plus the icons\n no longer fit beside the count on one line, so the count takes a row of its\n own and every button drops to the next.\n\n Addressed by slot rather than by position: these rules used to use\n nth-child, which silently retargeted the moment a control was inserted\n into the row. */\n ${({ $isStacked }) =>\n $isStacked &&\n css`\n flex-wrap: wrap;\n justify-content: space-between;\n\n > [data-bar-slot='count'] {\n flex-basis: 100%;\n margin-right: 0;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: 0;\n }\n\n /* The divider only existed to set the clear action apart from the rest;\n with the row spread it would hang in mid-air between them. */\n > [data-bar-slot='divider'] {\n display: none;\n }\n `}\n\n ${({ theme }) => theme.breakpoints.medium} {\n display: flex;\n left: 50%;\n right: auto;\n bottom: ${({ theme }) => theme.spaces[4]};\n transform: translateX(-50%);\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n /* Sized by its content, capped so the pill can never span the whole\n viewport. The nowrap is what lets the content set that width — without it\n the labels wrap and the bar reads as narrow and tall. Inherited, so it\n covers every label inside.\n\n Deliberately not applied on mobile: there the bar is full-bleed and\n cannot grow, so refusing to wrap would clip the last action on a narrow\n phone rather than widen anything. */\n white-space: nowrap;\n max-width: 90%;\n\n /* One line again from tablet up, where it fits. */\n flex-wrap: nowrap;\n\n > [data-bar-slot='count'] {\n flex-basis: auto;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: auto;\n }\n\n > [data-bar-slot='divider'] {\n display: block;\n }\n }\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\ninterface BulkActionsBarProps {\n /**\n * The assets currently rendered in the list, used to resolve the mime types\n * of the selection — the bar needs them to know which selected assets the AI\n * provider can actually read.\n *\n * Selection is page-scoped and cleared whenever the list identity changes, so\n * every selected asset id is guaranteed to appear here.\n */\n assets?: File[];\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent. Defaults to a lookup that misses\n * everything, which falls back to the folder currently open.\n */\n locations?: ItemLocations;\n /**\n * Keys of the items on screen, in render order. Owned by the view so\n * select-all covers exactly what the user can see — in mixed mode that is not\n * every folder.\n */\n renderedKeys?: ItemKey[];\n}\n\nexport const BulkActionsBar = ({\n assets = EMPTY_ASSETS,\n locations = emptyItemLocations,\n renderedKeys = EMPTY_RENDERED_KEYS,\n}: BulkActionsBarProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n // No mime argument: the action is selection-scoped, so the per-asset\n // allowlist check happens below in `eligibleCount`.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n // Every bulk action (move, delete, metadata) is an `assets.update` mutation\n // server-side — one flag gates the whole cluster.\n const { canUpdate } = useMediaLibraryPermissions();\n const { selectedIds, selectedFolderIds, selectAll, clear } = useAssetSelection();\n const { trackUsage } = useTracking();\n const { currentFolderId } = useFolderNavigation();\n const isDetailsDrawerOpen = useIsAssetDetailsOpen();\n const [generateAiMetadata, { isLoading: isGeneratingMetadata }] = useGenerateAiMetadataMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n // The delete request lives in DeleteItemsDialog; the bar mirrors its pending\n // state so the rest of the controls stay disabled for the duration.\n const [isDeleting, setIsDeleting] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n // `innerHeight - top` rather than the bar's height: it also spans the gap the\n // bar floats above the viewport edge (0 docked on mobile, `spaces[4]` for the\n // desktop pill), so one measurement covers both layouts and no height is\n // hardcoded.\n const [barEl, setBarEl] = useState<HTMLElement | null>(null);\n const [reservedSpace, setReservedSpace] = useState(0);\n\n useEffect(() => {\n if (!barEl) {\n setReservedSpace(0);\n return;\n }\n\n const measure = () => {\n const rect = barEl.getBoundingClientRect();\n // Zero height means the CSS has hidden the bar (drawer open on mobile) —\n // reserving anything then would leave a gap under nothing.\n setReservedSpace(rect.height === 0 ? 0 : Math.max(0, window.innerHeight - rect.top));\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(barEl);\n window.addEventListener('resize', measure);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', measure);\n };\n // `isDetailsDrawerOpen` toggles the bar's `display`, which a ResizeObserver\n // is not guaranteed to report.\n }, [barEl, isDetailsDrawerOpen]);\n\n const handleSelectAll = () => {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(renderedKeys);\n };\n const isBusy = isDeleting || isGeneratingMetadata;\n\n // Stable identity: the move dialog memoizes its destination walk on it. Each\n // item's real location comes from `locations`, so a selection made under a\n // global search validates against each item's own parent rather than the\n // folder currently open.\n const moveItems = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, locations, currentFolderId),\n [selectedIds, selectedFolderIds, locations, currentFolderId]\n );\n\n /**\n * The server processes the whole selection inside a single request and\n * rejects anything above the cap with a 400. Disable the action up front so\n * the limit is discoverable before the user commits to a request.\n */\n const isOverMetadataLimit = selectedIds.size > AI_METADATA_MAX_FILES;\n\n /**\n * How many selected assets the AI provider can actually read. The server\n * stays authoritative — it still reports what it skipped — but a selection\n * with nothing eligible (a lone PDF, say) would only ever come back fully\n * skipped, so there is no point sending it.\n */\n const eligibleCount = useMemo(() => {\n const mimeById = new Map(assets.map(({ id, mime }) => [id, mime]));\n\n return [...selectedIds].filter((id) => isAIMetadataSupportedMime(mimeById.get(id))).length;\n }, [assets, selectedIds]);\n\n const hasNoEligibleAssets = selectedIds.size > 0 && eligibleCount === 0;\n\n /**\n * Why the action is unavailable, surfaced on hover. `undefined` leaves the\n * button without a tooltip — either it is usable, or it is disabled for a\n * reason the selection count already makes obvious.\n */\n let metadataDisabledReason: string | undefined;\n\n if (isOverMetadataLimit) {\n metadataDisabledReason = formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.too-many'),\n defaultMessage:\n 'Metadata can be generated for up to {max} assets at a time. Select fewer assets to continue.',\n },\n { max: AI_METADATA_MAX_FILES }\n );\n } else if (hasNoEligibleAssets) {\n metadataDisabledReason = formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.no-eligible'),\n defaultMessage:\n 'Metadata can only be generated for images. None of the selected assets are supported.',\n });\n }\n\n /**\n * Metadata generation only applies to images — folders and unsupported files\n * in the selection are reported back rather than blocking the action.\n */\n const handleCreateMetadata = async () => {\n // Guard re-entry while pending, and never send a selection the server\n // would reject outright or skip in full.\n if (isGeneratingMetadata || isOverMetadataLimit || hasNoEligibleAssets) {\n return;\n }\n\n const fileIds = Array.from(selectedIds);\n const res = await generateAiMetadata({ fileIds });\n\n if ('error' in res) {\n // Keep the selection intact so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n const successCount = res.data.filter(({ status }) => status === 'success').length;\n const skippedCount = res.data.filter(({ status }) => status === 'skipped').length;\n const errorCount = res.data.filter(({ status }) => status === 'error').length;\n // Folders are never sent, so they are not part of the response — but the\n // user selected them, and a silent omission reads as a bug.\n const folderCount = selectedFolderIds.size;\n\n if (errorCount === res.data.length) {\n // Nothing was written — treat it like a request-level failure and keep\n // the selection so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n if (skippedCount === 0 && errorCount === 0 && folderCount === 0) {\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.success'),\n defaultMessage:\n '{count, plural, =1 {Metadata generated for # asset} other {Metadata generated for # assets}}',\n },\n { count: successCount }\n ),\n });\n } else {\n // Partial outcome: report every bucket so the user knows what was left\n // out — including folders, which were never eligible in the first place.\n toggleNotification({\n type: 'warning',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.partial'),\n defaultMessage:\n '{successCount} generated, {skippedCount} skipped (unsupported file type), {errorCount} failed{folderCount, plural, =0 {} one {, # folder ignored} other {, # folders ignored}}',\n },\n { successCount, skippedCount, errorCount, folderCount }\n ),\n });\n }\n\n clear();\n };\n\n // Every bulk action is behind `assets.update`; with nothing selected, or\n // without the permission, the bar has nothing to offer — drop it entirely\n // rather than show a count + \"Clear selection\" over no actions (mirrors the\n // drawer footer, which hides when no permitted action survives).\n //\n // With the drawer open the bar is hidden on mobile only, in CSS: there the two\n // are stacked at `bottom: 0` and the bar (popover, 500) would cover the\n // drawer's footer actions, since the drawer sits below the overlay token at\n // 200. From `medium` up the drawer is a side panel and the bar is a centered\n // pill, so they no longer collide.\n if (count === 0 || !canUpdate) {\n return null;\n }\n\n return (\n <>\n <Box aria-hidden height={`${reservedSpace}px`} data-bar-spacer />\n <Bar\n ref={setBarEl}\n $isDrawerOpen={isDetailsDrawerOpen}\n $isStacked={isAiMetadataEnabled}\n tag=\"section\"\n role=\"region\"\n // The bar floats over the list but is not part of its background: a\n // right-click on it keeps the browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography data-bar-slot=\"count\" fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <TextButton onClick={handleSelectAll} marginRight={4} disabled={isBusy}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.select-all'),\n defaultMessage: 'Select all',\n })}\n </TextButton>\n\n {/* Past the early return the user always has `assets.update`, so the\n individual actions no longer re-check it. */}\n <ActionCluster data-bar-slot=\"actions\">\n {isAiMetadataEnabled && (\n <Tooltip label={metadataDisabledReason}>\n {/* Wrapped so the tooltip still receives pointer events while the\n button itself is disabled. */}\n <Box>\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={\n isBusy || selectedIds.size === 0 || isOverMetadataLimit || hasNoEligibleAssets\n }\n loading={isGeneratingMetadata}\n onClick={handleCreateMetadata}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n </Box>\n </Tooltip>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog\n open={isMoveDialogOpen}\n onClose={() => setIsMoveDialogOpen(false)}\n items={moveItems}\n onSuccess={clear}\n />\n\n <IconButton\n variant=\"danger-light\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n onClick={() => setIsDeleteDialogOpen(true)}\n >\n <Trash />\n </IconButton>\n <DeleteItemsDialog\n open={isDeleteDialogOpen}\n onClose={() => setIsDeleteDialogOpen(false)}\n target={{\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n }}\n onSuccess={clear}\n onPendingChange={setIsDeleting}\n />\n </ActionCluster>\n\n <VerticalDivider data-bar-slot=\"divider\" aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isBusy}\n >\n <Cross />\n </IconButton>\n </Bar>\n </>\n );\n};\n"],"names":["EMPTY_ASSETS","EMPTY_RENDERED_KEYS","Bar","styled","Flex","theme","zIndices","popover","spaces","colors","neutral0","neutral150","shadows","popupShadow","$isDrawerOpen","$isStacked","css","breakpoints","medium","borderRadius","ActionCluster","VerticalDivider","Box","BulkActionsBar","assets","locations","emptyItemLocations","renderedKeys","formatMessage","useIntl","toggleNotification","useNotification","isAiMetadataEnabled","useAIMetadataEnabled","canUpdate","useMediaLibraryPermissions","selectedIds","selectedFolderIds","selectAll","clear","useAssetSelection","trackUsage","useTracking","currentFolderId","useFolderNavigation","isDetailsDrawerOpen","useIsAssetDetailsOpen","generateAiMetadata","isLoading","isGeneratingMetadata","useGenerateAiMetadataMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","isDeleting","setIsDeleting","count","size","barEl","setBarEl","reservedSpace","setReservedSpace","useEffect","measure","rect","getBoundingClientRect","height","Math","max","window","innerHeight","top","observer","ResizeObserver","observe","addEventListener","disconnect","removeEventListener","handleSelectAll","isBusy","moveItems","useMemo","buildDragSetFromSelection","isOverMetadataLimit","AI_METADATA_MAX_FILES","eligibleCount","mimeById","Map","map","id","mime","filter","isAIMetadataSupportedMime","get","length","hasNoEligibleAssets","metadataDisabledReason","getTranslationKey","defaultMessage","handleCreateMetadata","fileIds","Array","from","res","type","message","successCount","data","status","skippedCount","errorCount","folderCount","_jsxs","_Fragment","_jsx","aria-hidden","data-bar-spacer","ref","tag","role","data-native-context-menu","aria-label","Typography","data-bar-slot","fontWeight","textColor","marginRight","TextButton","onClick","disabled","Tooltip","label","Button","startIcon","Sparkle","loading","IconButton","variant","ArrowRight","BulkMoveDialog","open","onClose","items","onSuccess","Trash","DeleteItemsDialog","target","folderIds","onPendingChange","Cross"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAMA,eAA2D,EAAE;AACnE,MAAMC,sBAAwE,EAAE;AAEhF;;;;AAIC,IACD,MAAMC,GAAAA,GAAMC,uBAAAA,CAAOC,iBAAAA,CAAsD;;WAE9D,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,QAAQ,CAACC,OAAO,CAAC;;;;;OAK5C,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC;AAC7B,WAAA,EAAE,CAAC,EAAEH,KAAK,EAAE,GACnB,CAAA,EAAGA,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAEH,MAAMG,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAEH,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAEH,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,EAAE,CAAC;cACpE,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMI,MAAM,CAACC,QAAQ,CAAC;;wBAE7B,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMI,MAAM,CAACE,UAAU,CAAC;;cAEnD,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAAA,CAAMO,OAAO,CAACC,WAAW,CAAC;;;;AAI9C,WAAA,EAAE,CAAC,EAAEC,aAAa,EAAE,GAAMA,aAAAA,GAAgB,SAAS,MAAA,CAAQ;;;;;;;;;AASpE,EAAA,EAAE,CAAC,EAAEC,UAAU,EAAE,GACfA,UAAAA,IACAC,oBAAG;;;;;;;;;;;;;;;;;;AAkBH,IAAA,CAAC;;EAEH,EAAE,CAAC,EAAEX,KAAK,EAAE,GAAKA,KAAAA,CAAMY,WAAW,CAACC,MAAM,CAAC;;;;YAIhC,EAAE,CAAC,EAAEb,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC;;sBAEvB,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMI,MAAM,CAACE,UAAU,CAAC;AAC5C,mBAAA,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAAA,CAAMc,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BvD,CAAC;AAED,MAAMC,aAAAA,GAAgBjB,uBAAAA,CAAOC,iBAAAA,CAAK;;;OAG3B,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC;AACxC,CAAC;AAED,MAAMa,eAAAA,GAAkBlB,uBAAAA,CAAOmB,gBAAAA,CAAI;;;cAGrB,EAAE,CAAC,EAAEjB,KAAK,EAAE,GAAKA,KAAAA,CAAMI,MAAM,CAACE,UAAU,CAAC;eACxC,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAKA,KAAAA,CAAMG,MAAM,CAAC,CAAA,CAAE,CAAC;AAChD,CAAC;AA0BM,MAAMe,cAAAA,GAAiB,CAAC,EAC7BC,MAAAA,GAASxB,YAAY,EACrByB,SAAAA,GAAYC,gCAAkB,EAC9BC,YAAAA,GAAe1B,mBAAmB,EACd,GAAA;IACpB,MAAM,EAAE2B,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;;;AAG/B,IAAA,MAAMC,mBAAAA,GAAsBC,yCAAAA,EAAAA;;;IAG5B,MAAM,EAAEC,SAAS,EAAE,GAAGC,qDAAAA,EAAAA;IACtB,MAAM,EAAEC,WAAW,EAAEC,iBAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGC,mCAAAA,EAAAA;IAC7D,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;IACvB,MAAM,EAAEC,eAAe,EAAE,GAAGC,uCAAAA,EAAAA;AAC5B,IAAA,MAAMC,mBAAAA,GAAsBC,2CAAAA,EAAAA;AAC5B,IAAA,MAAM,CAACC,kBAAAA,EAAoB,EAAEC,WAAWC,oBAAoB,EAAE,CAAC,GAAGC,iCAAAA,EAAAA;AAClE,IAAA,MAAM,CAACC,kBAAAA,EAAoBC,qBAAAA,CAAsB,GAAGC,cAAAA,CAAS,KAAA,CAAA;AAC7D,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGF,cAAAA,CAAS,KAAA,CAAA;;;AAGzD,IAAA,MAAM,CAACG,UAAAA,EAAYC,aAAAA,CAAc,GAAGJ,cAAAA,CAAS,KAAA,CAAA;AAE7C,IAAA,MAAMK,KAAAA,GAAQtB,WAAAA,CAAYuB,IAAI,GAAGtB,kBAAkBsB,IAAI;;;;;AAMvD,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGR,cAAAA,CAA6B,IAAA,CAAA;AACvD,IAAA,MAAM,CAACS,aAAAA,EAAeC,gBAAAA,CAAiB,GAAGV,cAAAA,CAAS,CAAA,CAAA;IAEnDW,eAAAA,CAAU,IAAA;AACR,QAAA,IAAI,CAACJ,KAAAA,EAAO;YACVG,gBAAAA,CAAiB,CAAA,CAAA;AACjB,YAAA;AACF,QAAA;AAEA,QAAA,MAAME,OAAAA,GAAU,IAAA;YACd,MAAMC,IAAAA,GAAON,MAAMO,qBAAqB,EAAA;;;AAGxCJ,YAAAA,gBAAAA,CAAiBG,IAAAA,CAAKE,MAAM,KAAK,CAAA,GAAI,CAAA,GAAIC,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGC,MAAAA,CAAOC,WAAW,GAAGN,KAAKO,GAAG,CAAA,CAAA;AACpF,QAAA,CAAA;AAEAR,QAAAA,OAAAA,EAAAA;QAEA,MAAMS,QAAAA,GAAW,IAAIC,cAAAA,CAAeV,OAAAA,CAAAA;AACpCS,QAAAA,QAAAA,CAASE,OAAO,CAAChB,KAAAA,CAAAA;QACjBW,MAAAA,CAAOM,gBAAgB,CAAC,QAAA,EAAUZ,OAAAA,CAAAA;QAElC,OAAO,IAAA;AACLS,YAAAA,QAAAA,CAASI,UAAU,EAAA;YACnBP,MAAAA,CAAOQ,mBAAmB,CAAC,QAAA,EAAUd,OAAAA,CAAAA;AACvC,QAAA,CAAA;;;IAGF,CAAA,EAAG;AAACL,QAAAA,KAAAA;AAAOf,QAAAA;AAAoB,KAAA,CAAA;AAE/B,IAAA,MAAMmC,eAAAA,GAAkB,IAAA;QACtBvC,UAAAA,CAAW,kCAAA,CAAA;QACXH,SAAAA,CAAUX,YAAAA,CAAAA;AACZ,IAAA,CAAA;AACA,IAAA,MAAMsD,SAASzB,UAAAA,IAAcP,oBAAAA;;;;;AAM7B,IAAA,MAAMiC,YAAYC,aAAAA,CAChB,IAAMC,oDAA0BhD,WAAAA,EAAaC,iBAAAA,EAAmBZ,WAAWkB,eAAAA,CAAAA,EAC3E;AAACP,QAAAA,WAAAA;AAAaC,QAAAA,iBAAAA;AAAmBZ,QAAAA,SAAAA;AAAWkB,QAAAA;AAAgB,KAAA,CAAA;AAG9D;;;;AAIC,MACD,MAAM0C,mBAAAA,GAAsBjD,WAAAA,CAAYuB,IAAI,GAAG2B,+BAAAA;AAE/C;;;;;MAMA,MAAMC,gBAAgBJ,aAAAA,CAAQ,IAAA;AAC5B,QAAA,MAAMK,QAAAA,GAAW,IAAIC,GAAAA,CAAIjE,MAAAA,CAAOkE,GAAG,CAAC,CAAC,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAK;AAACD,gBAAAA,EAAAA;AAAIC,gBAAAA;AAAK,aAAA,CAAA,CAAA;QAEhE,OAAO;AAAIxD,YAAAA,GAAAA;SAAY,CAACyD,MAAM,CAAC,CAACF,EAAAA,GAAOG,oCAA0BN,QAAAA,CAASO,GAAG,CAACJ,EAAAA,CAAAA,CAAAA,CAAAA,CAAMK,MAAM;IAC5F,CAAA,EAAG;AAACxE,QAAAA,MAAAA;AAAQY,QAAAA;AAAY,KAAA,CAAA;AAExB,IAAA,MAAM6D,mBAAAA,GAAsB7D,WAAAA,CAAYuB,IAAI,GAAG,KAAK4B,aAAAA,KAAkB,CAAA;AAEtE;;;;AAIC,MACD,IAAIW,sBAAAA;AAEJ,IAAA,IAAIb,mBAAAA,EAAqB;AACvBa,QAAAA,sBAAAA,GAAyBtE,aAAAA,CACvB;AACE+D,YAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,4CAAA,CAAA;YACtBC,cAAAA,EACE;SACJ,EACA;YAAE9B,GAAAA,EAAKgB;AAAsB,SAAA,CAAA;AAEjC,IAAA,CAAA,MAAO,IAAIW,mBAAAA,EAAqB;AAC9BC,QAAAA,sBAAAA,GAAyBtE,aAAAA,CAAc;AACrC+D,YAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,+CAAA,CAAA;YACtBC,cAAAA,EACE;AACJ,SAAA,CAAA;AACF,IAAA;AAEA;;;AAGC,MACD,MAAMC,oBAAAA,GAAuB,UAAA;;;QAG3B,IAAIpD,oBAAAA,IAAwBoC,uBAAuBY,mBAAAA,EAAqB;AACtE,YAAA;AACF,QAAA;QAEA,MAAMK,OAAAA,GAAUC,KAAAA,CAAMC,IAAI,CAACpE,WAAAA,CAAAA;QAC3B,MAAMqE,GAAAA,GAAM,MAAM1D,kBAAAA,CAAmB;AAAEuD,YAAAA;AAAQ,SAAA,CAAA;AAE/C,QAAA,IAAI,WAAWG,GAAAA,EAAK;;YAElB3E,kBAAAA,CAAmB;gBACjB4E,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAS/E,aAAAA,CAAc;AACrB+D,oBAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,yCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,MAAMQ,YAAAA,GAAeH,GAAAA,CAAII,IAAI,CAAChB,MAAM,CAAC,CAAC,EAAEiB,MAAM,EAAE,GAAKA,MAAAA,KAAW,WAAWd,MAAM;AACjF,QAAA,MAAMe,YAAAA,GAAeN,GAAAA,CAAII,IAAI,CAAChB,MAAM,CAAC,CAAC,EAAEiB,MAAM,EAAE,GAAKA,MAAAA,KAAW,WAAWd,MAAM;AACjF,QAAA,MAAMgB,UAAAA,GAAaP,GAAAA,CAAII,IAAI,CAAChB,MAAM,CAAC,CAAC,EAAEiB,MAAM,EAAE,GAAKA,MAAAA,KAAW,SAASd,MAAM;;;QAG7E,MAAMiB,WAAAA,GAAc5E,kBAAkBsB,IAAI;AAE1C,QAAA,IAAIqD,UAAAA,KAAeP,GAAAA,CAAII,IAAI,CAACb,MAAM,EAAE;;;YAGlClE,kBAAAA,CAAmB;gBACjB4E,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAS/E,aAAAA,CAAc;AACrB+D,oBAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,yCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,IAAIW,YAAAA,KAAiB,CAAA,IAAKC,UAAAA,KAAe,CAAA,IAAKC,gBAAgB,CAAA,EAAG;YAC/DnF,kBAAAA,CAAmB;gBACjB4E,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAAS/E,aAAAA,CACP;AACE+D,oBAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,2CAAA,CAAA;oBACtBC,cAAAA,EACE;iBACJ,EACA;oBAAE1C,KAAAA,EAAOkD;AAAa,iBAAA;AAE1B,aAAA,CAAA;QACF,CAAA,MAAO;;;YAGL9E,kBAAAA,CAAmB;gBACjB4E,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAAS/E,aAAAA,CACP;AACE+D,oBAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,2CAAA,CAAA;oBACtBC,cAAAA,EACE;iBACJ,EACA;AAAEQ,oBAAAA,YAAAA;AAAcG,oBAAAA,YAAAA;AAAcC,oBAAAA,UAAAA;AAAYC,oBAAAA;AAAY,iBAAA;AAE1D,aAAA,CAAA;AACF,QAAA;AAEA1E,QAAAA,KAAAA,EAAAA;AACF,IAAA,CAAA;;;;;;;;;;;IAYA,IAAImB,KAAAA,KAAU,CAAA,IAAK,CAACxB,SAAAA,EAAW;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,qBACEgF,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAAA,CAAC9F,gBAAAA,EAAAA;gBAAI+F,aAAW,EAAA,IAAA;gBAACjD,MAAAA,EAAQ,CAAA,EAAGN,aAAAA,CAAc,EAAE,CAAC;gBAAEwD,iBAAe,EAAA;;0BAC9DJ,eAAA,CAAChH,GAAAA,EAAAA;gBACCqH,GAAAA,EAAK1D,QAAAA;gBACL/C,aAAAA,EAAe+B,mBAAAA;gBACf9B,UAAAA,EAAYiB,mBAAAA;gBACZwF,GAAAA,EAAI,SAAA;gBACJC,IAAAA,EAAK,QAAA;;;gBAGLC,0BAAwB,EAAA,IAAA;AACxBC,gBAAAA,YAAAA,EAAY/F,aAAAA,CAAc;AACxB+D,oBAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,yBAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;;kCAEAgB,cAAA,CAACQ,uBAAAA,EAAAA;wBAAWC,eAAAA,EAAc,OAAA;wBAAQC,UAAAA,EAAW,MAAA;wBAAOC,SAAAA,EAAU,YAAA;wBAAaC,WAAAA,EAAa,CAAA;kCACrFpG,aAAAA,CACC;AACE+D,4BAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,kCAAA,CAAA;4BACtBC,cAAAA,EAAgB;yBAClB,EACA;AAAE1C,4BAAAA;AAAM,yBAAA;;kCAIZ0D,cAAA,CAACa,uBAAAA,EAAAA;wBAAWC,OAAAA,EAASlD,eAAAA;wBAAiBgD,WAAAA,EAAa,CAAA;wBAAGG,QAAAA,EAAUlD,MAAAA;kCAC7DrD,aAAAA,CAAc;AACb+D,4BAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,8BAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA;;kCAKFc,eAAA,CAAC9F,aAAAA,EAAAA;wBAAcyG,eAAAA,EAAc,SAAA;;AAC1B7F,4BAAAA,mBAAAA,kBACCoF,cAAA,CAACgB,oBAAAA,EAAAA;gCAAQC,KAAAA,EAAOnC,sBAAAA;AAGd,gCAAA,QAAA,gBAAAkB,cAAA,CAAC9F,gBAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAA8F,cAAA,CAACkB,mBAAAA,EAAAA;wCACC3E,IAAAA,EAAK,GAAA;AACL4E,wCAAAA,SAAAA,gBAAWnB,cAAA,CAACoB,aAAAA,EAAAA,EAAAA,CAAAA;AACZL,wCAAAA,QAAAA,EACElD,MAAAA,IAAU7C,WAAAA,CAAYuB,IAAI,KAAK,KAAK0B,mBAAAA,IAAuBY,mBAAAA;wCAE7DwC,OAAAA,EAASxF,oBAAAA;wCACTiF,OAAAA,EAAS7B,oBAAAA;kDAERzE,aAAAA,CAAc;AACb+D,4CAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,mCAAA,CAAA;4CACtBC,cAAAA,EAAgB;AAClB,yCAAA;;;;0CAMRgB,cAAA,CAACsB,uBAAAA,EAAAA;gCACCC,OAAAA,EAAQ,UAAA;gCACRR,QAAAA,EAAUlD,MAAAA;AACVoD,gCAAAA,KAAAA,EAAOzG,aAAAA,CAAc;AACnB+D,oCAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,wBAAA,CAAA;oCACtBC,cAAAA,EAAgB;AAClB,iCAAA,CAAA;AACA8B,gCAAAA,OAAAA,EAAS,IAAM3E,mBAAAA,CAAoB,IAAA,CAAA;AAEnC,gCAAA,QAAA,gBAAA6D,cAAA,CAACwB,gBAAAA,EAAAA,EAAAA;;0CAEHxB,cAAA,CAACyB,6BAAAA,EAAAA;gCACCC,IAAAA,EAAMxF,gBAAAA;AACNyF,gCAAAA,OAAAA,EAAS,IAAMxF,mBAAAA,CAAoB,KAAA,CAAA;gCACnCyF,KAAAA,EAAO9D,SAAAA;gCACP+D,SAAAA,EAAW1G;;0CAGb6E,cAAA,CAACsB,uBAAAA,EAAAA;gCACCC,OAAAA,EAAQ,cAAA;gCACRR,QAAAA,EAAUlD,MAAAA;AACVoD,gCAAAA,KAAAA,EAAOzG,aAAAA,CAAc;AACnB+D,oCAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,0BAAA,CAAA;oCACtBC,cAAAA,EAAgB;AAClB,iCAAA,CAAA;AACA8B,gCAAAA,OAAAA,EAAS,IAAM9E,qBAAAA,CAAsB,IAAA,CAAA;AAErC,gCAAA,QAAA,gBAAAgE,cAAA,CAAC8B,WAAAA,EAAAA,EAAAA;;0CAEH9B,cAAA,CAAC+B,mCAAAA,EAAAA;gCACCL,IAAAA,EAAM3F,kBAAAA;AACN4F,gCAAAA,OAAAA,EAAS,IAAM3F,qBAAAA,CAAsB,KAAA,CAAA;gCACrCgG,MAAAA,EAAQ;oCACN9C,OAAAA,EAASC,KAAAA,CAAMC,IAAI,CAACpE,WAAAA,CAAAA;oCACpBiH,SAAAA,EAAW9C,KAAAA,CAAMC,IAAI,CAACnE,iBAAAA;AACxB,iCAAA;gCACA4G,SAAAA,EAAW1G,KAAAA;gCACX+G,eAAAA,EAAiB7F;;;;kCAIrB2D,cAAA,CAAC/F,eAAAA,EAAAA;wBAAgBwG,eAAAA,EAAc,SAAA;wBAAUR,aAAW,EAAA;;kCAEpDD,cAAA,CAACsB,uBAAAA,EAAAA;wBACCC,OAAAA,EAAQ,OAAA;AACRN,wBAAAA,KAAAA,EAAOzG,aAAAA,CAAc;AACnB+D,4BAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,yBAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA,CAAA;wBACA8B,OAAAA,EAAS3F,KAAAA;wBACT4F,QAAAA,EAAUlD,MAAAA;AAEV,wBAAA,QAAA,gBAAAmC,cAAA,CAACmC,WAAAA,EAAAA,EAAAA;;;;;;AAKX;;;;"}
@@ -20,6 +20,8 @@ import { BulkMoveDialog } from './BulkMoveDialog.mjs';
20
20
  import { DeleteItemsDialog } from './DeleteItemsDialog.mjs';
21
21
  import { useGenerateAiMetadataMutation } from '../../../services/api.mjs';
22
22
 
23
+ const EMPTY_ASSETS = [];
24
+ const EMPTY_RENDERED_KEYS = [];
23
25
  /**
24
26
  * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the
25
27
  * bottom edge (no radius, top border only). Desktop (medium+): a floating,
@@ -116,7 +118,7 @@ const VerticalDivider = styled(Box)`
116
118
  background: ${({ theme })=>theme.colors.neutral150};
117
119
  margin-left: ${({ theme })=>theme.spaces[1]};
118
120
  `;
119
- const BulkActionsBar = ({ assets = [], locations = emptyItemLocations, renderedKeys = [] })=>{
121
+ const BulkActionsBar = ({ assets = EMPTY_ASSETS, locations = emptyItemLocations, renderedKeys = EMPTY_RENDERED_KEYS })=>{
120
122
  const { formatMessage } = useIntl();
121
123
  const { toggleNotification } = useNotification();
122
124
  // No mime argument: the action is selection-scoped, so the per-asset
@@ -1 +1 @@
1
- {"version":3,"file":"BulkActionsBar.mjs","sources":["../../../../../admin/src/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n TextButton,\n Tooltip,\n Typography,\n} from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { AI_METADATA_MAX_FILES, isAIMetadataSupportedMime } from '../../../../../shared/constants';\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useGenerateAiMetadataMutation } from '../../../services/assets';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { emptyItemLocations, type ItemLocations } from '../../../utils/itemLocations';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { useIsAssetDetailsOpen } from '../hooks/useIsAssetDetailsOpen';\nimport { type ItemKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\n/**\n * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the\n * bottom edge (no radius, top border only). Desktop (medium+): a floating,\n * centered pill.\n */\nconst Bar = styled(Flex)<{ $isDrawerOpen: boolean; $isStacked: boolean }>`\n position: fixed;\n z-index: ${({ theme }) => theme.zIndices.popover};\n left: 0;\n right: 0;\n bottom: 0;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 0;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 0;\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n\n /* Docked full-bleed at the bottom on mobile, which is exactly where the open\n drawer keeps its own actions — so it steps aside there, and only there. */\n display: ${({ $isDrawerOpen }) => ($isDrawerOpen ? 'none' : 'flex')};\n\n /* Mobile with the metadata action present: the labelled button plus the icons\n no longer fit beside the count on one line, so the count takes a row of its\n own and every button drops to the next.\n\n Addressed by slot rather than by position: these rules used to use\n nth-child, which silently retargeted the moment a control was inserted\n into the row. */\n ${({ $isStacked }) =>\n $isStacked &&\n css`\n flex-wrap: wrap;\n justify-content: space-between;\n\n > [data-bar-slot='count'] {\n flex-basis: 100%;\n margin-right: 0;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: 0;\n }\n\n /* The divider only existed to set the clear action apart from the rest;\n with the row spread it would hang in mid-air between them. */\n > [data-bar-slot='divider'] {\n display: none;\n }\n `}\n\n ${({ theme }) => theme.breakpoints.medium} {\n display: flex;\n left: 50%;\n right: auto;\n bottom: ${({ theme }) => theme.spaces[4]};\n transform: translateX(-50%);\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n /* Sized by its content, capped so the pill can never span the whole\n viewport. The nowrap is what lets the content set that width — without it\n the labels wrap and the bar reads as narrow and tall. Inherited, so it\n covers every label inside.\n\n Deliberately not applied on mobile: there the bar is full-bleed and\n cannot grow, so refusing to wrap would clip the last action on a narrow\n phone rather than widen anything. */\n white-space: nowrap;\n max-width: 90%;\n\n /* One line again from tablet up, where it fits. */\n flex-wrap: nowrap;\n\n > [data-bar-slot='count'] {\n flex-basis: auto;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: auto;\n }\n\n > [data-bar-slot='divider'] {\n display: block;\n }\n }\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\ninterface BulkActionsBarProps {\n /**\n * The assets currently rendered in the list, used to resolve the mime types\n * of the selection — the bar needs them to know which selected assets the AI\n * provider can actually read.\n *\n * Selection is page-scoped and cleared whenever the list identity changes, so\n * every selected asset id is guaranteed to appear here.\n */\n assets?: File[];\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent. Defaults to a lookup that misses\n * everything, which falls back to the folder currently open.\n */\n locations?: ItemLocations;\n /**\n * Keys of the items on screen, in render order. Owned by the view so\n * select-all covers exactly what the user can see — in mixed mode that is not\n * every folder.\n */\n renderedKeys?: ItemKey[];\n}\n\nexport const BulkActionsBar = ({\n assets = [],\n locations = emptyItemLocations,\n renderedKeys = [],\n}: BulkActionsBarProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n // No mime argument: the action is selection-scoped, so the per-asset\n // allowlist check happens below in `eligibleCount`.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n // Every bulk action (move, delete, metadata) is an `assets.update` mutation\n // server-side — one flag gates the whole cluster.\n const { canUpdate } = useMediaLibraryPermissions();\n const { selectedIds, selectedFolderIds, selectAll, clear } = useAssetSelection();\n const { trackUsage } = useTracking();\n const { currentFolderId } = useFolderNavigation();\n const isDetailsDrawerOpen = useIsAssetDetailsOpen();\n const [generateAiMetadata, { isLoading: isGeneratingMetadata }] = useGenerateAiMetadataMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n // The delete request lives in DeleteItemsDialog; the bar mirrors its pending\n // state so the rest of the controls stay disabled for the duration.\n const [isDeleting, setIsDeleting] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n // `innerHeight - top` rather than the bar's height: it also spans the gap the\n // bar floats above the viewport edge (0 docked on mobile, `spaces[4]` for the\n // desktop pill), so one measurement covers both layouts and no height is\n // hardcoded.\n const [barEl, setBarEl] = useState<HTMLElement | null>(null);\n const [reservedSpace, setReservedSpace] = useState(0);\n\n useEffect(() => {\n if (!barEl) {\n setReservedSpace(0);\n return;\n }\n\n const measure = () => {\n const rect = barEl.getBoundingClientRect();\n // Zero height means the CSS has hidden the bar (drawer open on mobile) —\n // reserving anything then would leave a gap under nothing.\n setReservedSpace(rect.height === 0 ? 0 : Math.max(0, window.innerHeight - rect.top));\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(barEl);\n window.addEventListener('resize', measure);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', measure);\n };\n // `isDetailsDrawerOpen` toggles the bar's `display`, which a ResizeObserver\n // is not guaranteed to report.\n }, [barEl, isDetailsDrawerOpen]);\n\n const handleSelectAll = () => {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(renderedKeys);\n };\n const isBusy = isDeleting || isGeneratingMetadata;\n\n // Stable identity: the move dialog memoizes its destination walk on it. Each\n // item's real location comes from `locations`, so a selection made under a\n // global search validates against each item's own parent rather than the\n // folder currently open.\n const moveItems = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, locations, currentFolderId),\n [selectedIds, selectedFolderIds, locations, currentFolderId]\n );\n\n /**\n * The server processes the whole selection inside a single request and\n * rejects anything above the cap with a 400. Disable the action up front so\n * the limit is discoverable before the user commits to a request.\n */\n const isOverMetadataLimit = selectedIds.size > AI_METADATA_MAX_FILES;\n\n /**\n * How many selected assets the AI provider can actually read. The server\n * stays authoritative — it still reports what it skipped — but a selection\n * with nothing eligible (a lone PDF, say) would only ever come back fully\n * skipped, so there is no point sending it.\n */\n const eligibleCount = useMemo(() => {\n const mimeById = new Map(assets.map(({ id, mime }) => [id, mime]));\n\n return [...selectedIds].filter((id) => isAIMetadataSupportedMime(mimeById.get(id))).length;\n }, [assets, selectedIds]);\n\n const hasNoEligibleAssets = selectedIds.size > 0 && eligibleCount === 0;\n\n /**\n * Why the action is unavailable, surfaced on hover. `undefined` leaves the\n * button without a tooltip — either it is usable, or it is disabled for a\n * reason the selection count already makes obvious.\n */\n let metadataDisabledReason: string | undefined;\n\n if (isOverMetadataLimit) {\n metadataDisabledReason = formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.too-many'),\n defaultMessage:\n 'Metadata can be generated for up to {max} assets at a time. Select fewer assets to continue.',\n },\n { max: AI_METADATA_MAX_FILES }\n );\n } else if (hasNoEligibleAssets) {\n metadataDisabledReason = formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.no-eligible'),\n defaultMessage:\n 'Metadata can only be generated for images. None of the selected assets are supported.',\n });\n }\n\n /**\n * Metadata generation only applies to images — folders and unsupported files\n * in the selection are reported back rather than blocking the action.\n */\n const handleCreateMetadata = async () => {\n // Guard re-entry while pending, and never send a selection the server\n // would reject outright or skip in full.\n if (isGeneratingMetadata || isOverMetadataLimit || hasNoEligibleAssets) {\n return;\n }\n\n const fileIds = Array.from(selectedIds);\n const res = await generateAiMetadata({ fileIds });\n\n if ('error' in res) {\n // Keep the selection intact so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n const successCount = res.data.filter(({ status }) => status === 'success').length;\n const skippedCount = res.data.filter(({ status }) => status === 'skipped').length;\n const errorCount = res.data.filter(({ status }) => status === 'error').length;\n // Folders are never sent, so they are not part of the response — but the\n // user selected them, and a silent omission reads as a bug.\n const folderCount = selectedFolderIds.size;\n\n if (errorCount === res.data.length) {\n // Nothing was written — treat it like a request-level failure and keep\n // the selection so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n if (skippedCount === 0 && errorCount === 0 && folderCount === 0) {\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.success'),\n defaultMessage:\n '{count, plural, =1 {Metadata generated for # asset} other {Metadata generated for # assets}}',\n },\n { count: successCount }\n ),\n });\n } else {\n // Partial outcome: report every bucket so the user knows what was left\n // out — including folders, which were never eligible in the first place.\n toggleNotification({\n type: 'warning',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.partial'),\n defaultMessage:\n '{successCount} generated, {skippedCount} skipped (unsupported file type), {errorCount} failed{folderCount, plural, =0 {} one {, # folder ignored} other {, # folders ignored}}',\n },\n { successCount, skippedCount, errorCount, folderCount }\n ),\n });\n }\n\n clear();\n };\n\n // Every bulk action is behind `assets.update`; with nothing selected, or\n // without the permission, the bar has nothing to offer — drop it entirely\n // rather than show a count + \"Clear selection\" over no actions (mirrors the\n // drawer footer, which hides when no permitted action survives).\n //\n // With the drawer open the bar is hidden on mobile only, in CSS: there the two\n // are stacked at `bottom: 0` and the bar (popover, 500) would cover the\n // drawer's footer actions, since the drawer sits below the overlay token at\n // 200. From `medium` up the drawer is a side panel and the bar is a centered\n // pill, so they no longer collide.\n if (count === 0 || !canUpdate) {\n return null;\n }\n\n return (\n <>\n <Box aria-hidden height={`${reservedSpace}px`} data-bar-spacer />\n <Bar\n ref={setBarEl}\n $isDrawerOpen={isDetailsDrawerOpen}\n $isStacked={isAiMetadataEnabled}\n tag=\"section\"\n role=\"region\"\n // The bar floats over the list but is not part of its background: a\n // right-click on it keeps the browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography data-bar-slot=\"count\" fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <TextButton onClick={handleSelectAll} marginRight={4} disabled={isBusy}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.select-all'),\n defaultMessage: 'Select all',\n })}\n </TextButton>\n\n {/* Past the early return the user always has `assets.update`, so the\n individual actions no longer re-check it. */}\n <ActionCluster data-bar-slot=\"actions\">\n {isAiMetadataEnabled && (\n <Tooltip label={metadataDisabledReason}>\n {/* Wrapped so the tooltip still receives pointer events while the\n button itself is disabled. */}\n <Box>\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={\n isBusy || selectedIds.size === 0 || isOverMetadataLimit || hasNoEligibleAssets\n }\n loading={isGeneratingMetadata}\n onClick={handleCreateMetadata}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n </Box>\n </Tooltip>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog\n open={isMoveDialogOpen}\n onClose={() => setIsMoveDialogOpen(false)}\n items={moveItems}\n onSuccess={clear}\n />\n\n <IconButton\n variant=\"danger-light\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n onClick={() => setIsDeleteDialogOpen(true)}\n >\n <Trash />\n </IconButton>\n <DeleteItemsDialog\n open={isDeleteDialogOpen}\n onClose={() => setIsDeleteDialogOpen(false)}\n target={{\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n }}\n onSuccess={clear}\n onPendingChange={setIsDeleting}\n />\n </ActionCluster>\n\n <VerticalDivider data-bar-slot=\"divider\" aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isBusy}\n >\n <Cross />\n </IconButton>\n </Bar>\n </>\n );\n};\n"],"names":["Bar","styled","Flex","theme","zIndices","popover","spaces","colors","neutral0","neutral150","shadows","popupShadow","$isDrawerOpen","$isStacked","css","breakpoints","medium","borderRadius","ActionCluster","VerticalDivider","Box","BulkActionsBar","assets","locations","emptyItemLocations","renderedKeys","formatMessage","useIntl","toggleNotification","useNotification","isAiMetadataEnabled","useAIMetadataEnabled","canUpdate","useMediaLibraryPermissions","selectedIds","selectedFolderIds","selectAll","clear","useAssetSelection","trackUsage","useTracking","currentFolderId","useFolderNavigation","isDetailsDrawerOpen","useIsAssetDetailsOpen","generateAiMetadata","isLoading","isGeneratingMetadata","useGenerateAiMetadataMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","isDeleting","setIsDeleting","count","size","barEl","setBarEl","reservedSpace","setReservedSpace","useEffect","measure","rect","getBoundingClientRect","height","Math","max","window","innerHeight","top","observer","ResizeObserver","observe","addEventListener","disconnect","removeEventListener","handleSelectAll","isBusy","moveItems","useMemo","buildDragSetFromSelection","isOverMetadataLimit","AI_METADATA_MAX_FILES","eligibleCount","mimeById","Map","map","id","mime","filter","isAIMetadataSupportedMime","get","length","hasNoEligibleAssets","metadataDisabledReason","getTranslationKey","defaultMessage","handleCreateMetadata","fileIds","Array","from","res","type","message","successCount","data","status","skippedCount","errorCount","folderCount","_jsxs","_Fragment","_jsx","aria-hidden","data-bar-spacer","ref","tag","role","data-native-context-menu","aria-label","Typography","data-bar-slot","fontWeight","textColor","marginRight","TextButton","onClick","disabled","Tooltip","label","Button","startIcon","Sparkle","loading","IconButton","variant","ArrowRight","BulkMoveDialog","open","onClose","items","onSuccess","Trash","DeleteItemsDialog","target","folderIds","onPendingChange","Cross"],"mappings":"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"}
1
+ {"version":3,"file":"BulkActionsBar.mjs","sources":["../../../../../admin/src/pages/Assets/components/BulkActionsBar.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Button,\n Flex,\n IconButton,\n TextButton,\n Tooltip,\n Typography,\n} from '@strapi/design-system';\nimport { ArrowRight, Cross, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { AI_METADATA_MAX_FILES, isAIMetadataSupportedMime } from '../../../../../shared/constants';\nimport { useAIMetadataEnabled } from '../../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useGenerateAiMetadataMutation } from '../../../services/assets';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { emptyItemLocations, type ItemLocations } from '../../../utils/itemLocations';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { useIsAssetDetailsOpen } from '../hooks/useIsAssetDetailsOpen';\nimport { type ItemKey } from '../utils/selection';\n\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\n\nimport type { File } from '../../../../../shared/contracts/files';\n\nconst EMPTY_ASSETS: NonNullable<BulkActionsBarProps['assets']> = [];\nconst EMPTY_RENDERED_KEYS: NonNullable<BulkActionsBarProps['renderedKeys']> = [];\n\n/**\n * Bulk action bar for the future Media Library. Mobile: docked full-bleed to the\n * bottom edge (no radius, top border only). Desktop (medium+): a floating,\n * centered pill.\n */\nconst Bar = styled(Flex)<{ $isDrawerOpen: boolean; $isStacked: boolean }>`\n position: fixed;\n z-index: ${({ theme }) => theme.zIndices.popover};\n left: 0;\n right: 0;\n bottom: 0;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n padding: ${({ theme }) =>\n `${theme.spaces[3]} ${theme.spaces[2]} ${theme.spaces[3]} ${theme.spaces[6]}`};\n background: ${({ theme }) => theme.colors.neutral0};\n border: 0;\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 0;\n box-shadow: ${({ theme }) => theme.shadows.popupShadow};\n\n /* Docked full-bleed at the bottom on mobile, which is exactly where the open\n drawer keeps its own actions — so it steps aside there, and only there. */\n display: ${({ $isDrawerOpen }) => ($isDrawerOpen ? 'none' : 'flex')};\n\n /* Mobile with the metadata action present: the labelled button plus the icons\n no longer fit beside the count on one line, so the count takes a row of its\n own and every button drops to the next.\n\n Addressed by slot rather than by position: these rules used to use\n nth-child, which silently retargeted the moment a control was inserted\n into the row. */\n ${({ $isStacked }) =>\n $isStacked &&\n css`\n flex-wrap: wrap;\n justify-content: space-between;\n\n > [data-bar-slot='count'] {\n flex-basis: 100%;\n margin-right: 0;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: 0;\n }\n\n /* The divider only existed to set the clear action apart from the rest;\n with the row spread it would hang in mid-air between them. */\n > [data-bar-slot='divider'] {\n display: none;\n }\n `}\n\n ${({ theme }) => theme.breakpoints.medium} {\n display: flex;\n left: 50%;\n right: auto;\n bottom: ${({ theme }) => theme.spaces[4]};\n transform: translateX(-50%);\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n /* Sized by its content, capped so the pill can never span the whole\n viewport. The nowrap is what lets the content set that width — without it\n the labels wrap and the bar reads as narrow and tall. Inherited, so it\n covers every label inside.\n\n Deliberately not applied on mobile: there the bar is full-bleed and\n cannot grow, so refusing to wrap would clip the last action on a narrow\n phone rather than widen anything. */\n white-space: nowrap;\n max-width: 90%;\n\n /* One line again from tablet up, where it fits. */\n flex-wrap: nowrap;\n\n > [data-bar-slot='count'] {\n flex-basis: auto;\n }\n\n > [data-bar-slot='actions'] {\n margin-left: auto;\n }\n\n > [data-bar-slot='divider'] {\n display: block;\n }\n }\n`;\n\nconst ActionCluster = styled(Flex)`\n margin-left: auto;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n`;\n\nconst VerticalDivider = styled(Box)`\n width: 1px;\n align-self: stretch;\n background: ${({ theme }) => theme.colors.neutral150};\n margin-left: ${({ theme }) => theme.spaces[1]};\n`;\n\ninterface BulkActionsBarProps {\n /**\n * The assets currently rendered in the list, used to resolve the mime types\n * of the selection — the bar needs them to know which selected assets the AI\n * provider can actually read.\n *\n * Selection is page-scoped and cleared whenever the list identity changes, so\n * every selected asset id is guaranteed to appear here.\n */\n assets?: File[];\n /**\n * Real location of every loaded row, so the move dialog validates each\n * selected item against its own parent. Defaults to a lookup that misses\n * everything, which falls back to the folder currently open.\n */\n locations?: ItemLocations;\n /**\n * Keys of the items on screen, in render order. Owned by the view so\n * select-all covers exactly what the user can see — in mixed mode that is not\n * every folder.\n */\n renderedKeys?: ItemKey[];\n}\n\nexport const BulkActionsBar = ({\n assets = EMPTY_ASSETS,\n locations = emptyItemLocations,\n renderedKeys = EMPTY_RENDERED_KEYS,\n}: BulkActionsBarProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n // No mime argument: the action is selection-scoped, so the per-asset\n // allowlist check happens below in `eligibleCount`.\n const isAiMetadataEnabled = useAIMetadataEnabled();\n // Every bulk action (move, delete, metadata) is an `assets.update` mutation\n // server-side — one flag gates the whole cluster.\n const { canUpdate } = useMediaLibraryPermissions();\n const { selectedIds, selectedFolderIds, selectAll, clear } = useAssetSelection();\n const { trackUsage } = useTracking();\n const { currentFolderId } = useFolderNavigation();\n const isDetailsDrawerOpen = useIsAssetDetailsOpen();\n const [generateAiMetadata, { isLoading: isGeneratingMetadata }] = useGenerateAiMetadataMutation();\n const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n const [isMoveDialogOpen, setIsMoveDialogOpen] = useState(false);\n // The delete request lives in DeleteItemsDialog; the bar mirrors its pending\n // state so the rest of the controls stay disabled for the duration.\n const [isDeleting, setIsDeleting] = useState(false);\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n // `innerHeight - top` rather than the bar's height: it also spans the gap the\n // bar floats above the viewport edge (0 docked on mobile, `spaces[4]` for the\n // desktop pill), so one measurement covers both layouts and no height is\n // hardcoded.\n const [barEl, setBarEl] = useState<HTMLElement | null>(null);\n const [reservedSpace, setReservedSpace] = useState(0);\n\n useEffect(() => {\n if (!barEl) {\n setReservedSpace(0);\n return;\n }\n\n const measure = () => {\n const rect = barEl.getBoundingClientRect();\n // Zero height means the CSS has hidden the bar (drawer open on mobile) —\n // reserving anything then would leave a gap under nothing.\n setReservedSpace(rect.height === 0 ? 0 : Math.max(0, window.innerHeight - rect.top));\n };\n\n measure();\n\n const observer = new ResizeObserver(measure);\n observer.observe(barEl);\n window.addEventListener('resize', measure);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', measure);\n };\n // `isDetailsDrawerOpen` toggles the bar's `display`, which a ResizeObserver\n // is not guaranteed to report.\n }, [barEl, isDetailsDrawerOpen]);\n\n const handleSelectAll = () => {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(renderedKeys);\n };\n const isBusy = isDeleting || isGeneratingMetadata;\n\n // Stable identity: the move dialog memoizes its destination walk on it. Each\n // item's real location comes from `locations`, so a selection made under a\n // global search validates against each item's own parent rather than the\n // folder currently open.\n const moveItems = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, locations, currentFolderId),\n [selectedIds, selectedFolderIds, locations, currentFolderId]\n );\n\n /**\n * The server processes the whole selection inside a single request and\n * rejects anything above the cap with a 400. Disable the action up front so\n * the limit is discoverable before the user commits to a request.\n */\n const isOverMetadataLimit = selectedIds.size > AI_METADATA_MAX_FILES;\n\n /**\n * How many selected assets the AI provider can actually read. The server\n * stays authoritative — it still reports what it skipped — but a selection\n * with nothing eligible (a lone PDF, say) would only ever come back fully\n * skipped, so there is no point sending it.\n */\n const eligibleCount = useMemo(() => {\n const mimeById = new Map(assets.map(({ id, mime }) => [id, mime]));\n\n return [...selectedIds].filter((id) => isAIMetadataSupportedMime(mimeById.get(id))).length;\n }, [assets, selectedIds]);\n\n const hasNoEligibleAssets = selectedIds.size > 0 && eligibleCount === 0;\n\n /**\n * Why the action is unavailable, surfaced on hover. `undefined` leaves the\n * button without a tooltip — either it is usable, or it is disabled for a\n * reason the selection count already makes obvious.\n */\n let metadataDisabledReason: string | undefined;\n\n if (isOverMetadataLimit) {\n metadataDisabledReason = formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.too-many'),\n defaultMessage:\n 'Metadata can be generated for up to {max} assets at a time. Select fewer assets to continue.',\n },\n { max: AI_METADATA_MAX_FILES }\n );\n } else if (hasNoEligibleAssets) {\n metadataDisabledReason = formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.no-eligible'),\n defaultMessage:\n 'Metadata can only be generated for images. None of the selected assets are supported.',\n });\n }\n\n /**\n * Metadata generation only applies to images — folders and unsupported files\n * in the selection are reported back rather than blocking the action.\n */\n const handleCreateMetadata = async () => {\n // Guard re-entry while pending, and never send a selection the server\n // would reject outright or skip in full.\n if (isGeneratingMetadata || isOverMetadataLimit || hasNoEligibleAssets) {\n return;\n }\n\n const fileIds = Array.from(selectedIds);\n const res = await generateAiMetadata({ fileIds });\n\n if ('error' in res) {\n // Keep the selection intact so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n const successCount = res.data.filter(({ status }) => status === 'success').length;\n const skippedCount = res.data.filter(({ status }) => status === 'skipped').length;\n const errorCount = res.data.filter(({ status }) => status === 'error').length;\n // Folders are never sent, so they are not part of the response — but the\n // user selected them, and a silent omission reads as a bug.\n const folderCount = selectedFolderIds.size;\n\n if (errorCount === res.data.length) {\n // Nothing was written — treat it like a request-level failure and keep\n // the selection so the user can retry.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata.error'),\n defaultMessage: 'An error occurred while generating metadata.',\n }),\n });\n return;\n }\n\n if (skippedCount === 0 && errorCount === 0 && folderCount === 0) {\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.success'),\n defaultMessage:\n '{count, plural, =1 {Metadata generated for # asset} other {Metadata generated for # assets}}',\n },\n { count: successCount }\n ),\n });\n } else {\n // Partial outcome: report every bucket so the user knows what was left\n // out — including folders, which were never eligible in the first place.\n toggleNotification({\n type: 'warning',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.create-metadata.partial'),\n defaultMessage:\n '{successCount} generated, {skippedCount} skipped (unsupported file type), {errorCount} failed{folderCount, plural, =0 {} one {, # folder ignored} other {, # folders ignored}}',\n },\n { successCount, skippedCount, errorCount, folderCount }\n ),\n });\n }\n\n clear();\n };\n\n // Every bulk action is behind `assets.update`; with nothing selected, or\n // without the permission, the bar has nothing to offer — drop it entirely\n // rather than show a count + \"Clear selection\" over no actions (mirrors the\n // drawer footer, which hides when no permitted action survives).\n //\n // With the drawer open the bar is hidden on mobile only, in CSS: there the two\n // are stacked at `bottom: 0` and the bar (popover, 500) would cover the\n // drawer's footer actions, since the drawer sits below the overlay token at\n // 200. From `medium` up the drawer is a side panel and the bar is a centered\n // pill, so they no longer collide.\n if (count === 0 || !canUpdate) {\n return null;\n }\n\n return (\n <>\n <Box aria-hidden height={`${reservedSpace}px`} data-bar-spacer />\n <Bar\n ref={setBarEl}\n $isDrawerOpen={isDetailsDrawerOpen}\n $isStacked={isAiMetadataEnabled}\n tag=\"section\"\n role=\"region\"\n // The bar floats over the list but is not part of its background: a\n // right-click on it keeps the browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n aria-label={formatMessage({\n id: getTranslationKey('list.bulk-actions.label'),\n defaultMessage: 'Bulk actions',\n })}\n >\n <Typography data-bar-slot=\"count\" fontWeight=\"bold\" textColor=\"neutral800\" marginRight={4}>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.selected-count'),\n defaultMessage: '{count, plural, =1 {# item selected} other {# items selected}}',\n },\n { count }\n )}\n </Typography>\n\n <TextButton onClick={handleSelectAll} marginRight={4} disabled={isBusy}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.select-all'),\n defaultMessage: 'Select all',\n })}\n </TextButton>\n\n {/* Past the early return the user always has `assets.update`, so the\n individual actions no longer re-check it. */}\n <ActionCluster data-bar-slot=\"actions\">\n {isAiMetadataEnabled && (\n <Tooltip label={metadataDisabledReason}>\n {/* Wrapped so the tooltip still receives pointer events while the\n button itself is disabled. */}\n <Box>\n <Button\n size=\"S\"\n startIcon={<Sparkle />}\n disabled={\n isBusy || selectedIds.size === 0 || isOverMetadataLimit || hasNoEligibleAssets\n }\n loading={isGeneratingMetadata}\n onClick={handleCreateMetadata}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.create-metadata'),\n defaultMessage: 'Create metadata',\n })}\n </Button>\n </Box>\n </Tooltip>\n )}\n\n <IconButton\n variant=\"tertiary\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.move'),\n defaultMessage: 'Move',\n })}\n onClick={() => setIsMoveDialogOpen(true)}\n >\n <ArrowRight />\n </IconButton>\n <BulkMoveDialog\n open={isMoveDialogOpen}\n onClose={() => setIsMoveDialogOpen(false)}\n items={moveItems}\n onSuccess={clear}\n />\n\n <IconButton\n variant=\"danger-light\"\n disabled={isBusy}\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.delete'),\n defaultMessage: 'Delete',\n })}\n onClick={() => setIsDeleteDialogOpen(true)}\n >\n <Trash />\n </IconButton>\n <DeleteItemsDialog\n open={isDeleteDialogOpen}\n onClose={() => setIsDeleteDialogOpen(false)}\n target={{\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n }}\n onSuccess={clear}\n onPendingChange={setIsDeleting}\n />\n </ActionCluster>\n\n <VerticalDivider data-bar-slot=\"divider\" aria-hidden />\n\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.bulk-actions.clear'),\n defaultMessage: 'Clear selection',\n })}\n onClick={clear}\n disabled={isBusy}\n >\n <Cross />\n </IconButton>\n </Bar>\n </>\n );\n};\n"],"names":["EMPTY_ASSETS","EMPTY_RENDERED_KEYS","Bar","styled","Flex","theme","zIndices","popover","spaces","colors","neutral0","neutral150","shadows","popupShadow","$isDrawerOpen","$isStacked","css","breakpoints","medium","borderRadius","ActionCluster","VerticalDivider","Box","BulkActionsBar","assets","locations","emptyItemLocations","renderedKeys","formatMessage","useIntl","toggleNotification","useNotification","isAiMetadataEnabled","useAIMetadataEnabled","canUpdate","useMediaLibraryPermissions","selectedIds","selectedFolderIds","selectAll","clear","useAssetSelection","trackUsage","useTracking","currentFolderId","useFolderNavigation","isDetailsDrawerOpen","useIsAssetDetailsOpen","generateAiMetadata","isLoading","isGeneratingMetadata","useGenerateAiMetadataMutation","isDeleteDialogOpen","setIsDeleteDialogOpen","useState","isMoveDialogOpen","setIsMoveDialogOpen","isDeleting","setIsDeleting","count","size","barEl","setBarEl","reservedSpace","setReservedSpace","useEffect","measure","rect","getBoundingClientRect","height","Math","max","window","innerHeight","top","observer","ResizeObserver","observe","addEventListener","disconnect","removeEventListener","handleSelectAll","isBusy","moveItems","useMemo","buildDragSetFromSelection","isOverMetadataLimit","AI_METADATA_MAX_FILES","eligibleCount","mimeById","Map","map","id","mime","filter","isAIMetadataSupportedMime","get","length","hasNoEligibleAssets","metadataDisabledReason","getTranslationKey","defaultMessage","handleCreateMetadata","fileIds","Array","from","res","type","message","successCount","data","status","skippedCount","errorCount","folderCount","_jsxs","_Fragment","_jsx","aria-hidden","data-bar-spacer","ref","tag","role","data-native-context-menu","aria-label","Typography","data-bar-slot","fontWeight","textColor","marginRight","TextButton","onClick","disabled","Tooltip","label","Button","startIcon","Sparkle","loading","IconButton","variant","ArrowRight","BulkMoveDialog","open","onClose","items","onSuccess","Trash","DeleteItemsDialog","target","folderIds","onPendingChange","Cross"],"mappings":"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"}