@strapi/upload 5.58.0 → 5.60.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 (395) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  10. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  12. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  14. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  16. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  18. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  20. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  21. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +142 -0
  22. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
  23. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +140 -0
  24. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
  25. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  26. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  27. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  28. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  29. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  30. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  31. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  32. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +156 -0
  34. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
  35. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +154 -0
  36. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
  37. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetRow.js +211 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +208 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  46. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  47. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  48. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  49. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +439 -0
  50. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +433 -0
  52. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  54. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  55. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  56. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  57. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  58. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  60. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  61. package/dist/admin/components/UploadProgressDialog.js +2 -1
  62. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  63. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  64. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  65. package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
  66. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
  67. package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
  68. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
  69. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
  70. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  71. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
  72. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  73. package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -2
  74. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  75. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +16 -2
  76. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  77. package/dist/admin/hooks/useTracking.js +5 -1
  78. package/dist/admin/hooks/useTracking.js.map +1 -1
  79. package/dist/admin/hooks/useTracking.mjs +5 -1
  80. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  81. package/dist/admin/index.js +7 -2
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +7 -2
  84. package/dist/admin/index.mjs.map +1 -1
  85. package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
  86. package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
  87. package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
  88. package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
  89. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
  90. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
  91. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
  92. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
  93. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
  94. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
  95. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
  96. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  97. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
  98. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  99. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  100. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  101. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
  102. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
  103. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
  104. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
  105. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
  106. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  107. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
  108. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  109. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
  110. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  111. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
  112. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  113. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
  114. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  115. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
  116. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  117. package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
  118. package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
  119. package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
  120. package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
  121. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
  122. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
  123. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
  124. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  125. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
  126. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  127. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
  128. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  129. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
  130. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  131. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
  132. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  133. package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
  134. package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
  135. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
  136. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
  137. package/dist/admin/legacy/components/TableList/TableList.js +3 -1
  138. package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
  139. package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
  140. package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
  141. package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
  142. package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
  143. package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
  144. package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
  145. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
  146. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  147. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
  148. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  149. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  150. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  151. package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
  152. package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
  153. package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
  154. package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
  155. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
  156. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
  157. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
  158. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
  159. package/dist/admin/pages/Assets/AssetsPage.js +13 -302
  160. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  161. package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
  162. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  163. package/dist/admin/pages/Assets/components/AssetsGrid.js +143 -31
  164. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  165. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +146 -34
  166. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  167. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  168. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  169. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  170. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  171. package/dist/admin/pages/Assets/components/AssetsTable.js +60 -35
  172. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  173. package/dist/admin/pages/Assets/components/AssetsTable.mjs +62 -37
  174. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  175. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  176. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  177. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  178. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  179. package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
  180. package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
  181. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +4 -2
  182. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  183. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  184. package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
  185. package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
  186. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
  187. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
  188. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  189. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  190. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  191. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  192. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  193. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  194. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  195. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  196. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  197. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  198. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  199. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  200. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  201. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  202. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  203. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  204. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  205. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
  206. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  207. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
  208. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  209. package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
  210. package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
  211. package/dist/admin/pages/Assets/components/FilterBadges.mjs +35 -6
  212. package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
  213. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  214. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  215. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  216. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  217. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  218. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  219. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  220. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  221. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  222. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  223. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  224. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  225. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  226. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  227. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  228. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  229. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  230. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  231. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  232. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  233. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  234. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  235. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  236. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  237. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  238. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  239. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  240. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  241. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  242. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  243. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  244. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  245. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  246. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  247. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  248. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  249. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  250. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  251. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  252. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  253. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  254. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  255. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  256. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  257. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  258. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  259. package/dist/admin/services/api.js +106 -11
  260. package/dist/admin/services/api.js.map +1 -1
  261. package/dist/admin/services/api.mjs +105 -13
  262. package/dist/admin/services/api.mjs.map +1 -1
  263. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  264. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  265. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  266. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  267. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  268. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
  269. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  270. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  271. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +21 -0
  272. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  273. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +25 -0
  274. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  275. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +28 -0
  276. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  277. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  278. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +3 -0
  279. package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
  280. package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
  281. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  282. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  283. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  284. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  285. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  286. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  287. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  288. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  289. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  290. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  291. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  292. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  293. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  294. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  295. package/dist/admin/src/services/api.d.ts +30 -1
  296. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  297. package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
  298. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  299. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  300. package/dist/admin/store/uploadProgress.js +30 -3
  301. package/dist/admin/store/uploadProgress.js.map +1 -1
  302. package/dist/admin/store/uploadProgress.mjs +29 -4
  303. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  304. package/dist/admin/translations/ca.json.js +3 -3
  305. package/dist/admin/translations/ca.json.mjs +3 -3
  306. package/dist/admin/translations/da.json.js +1 -1
  307. package/dist/admin/translations/da.json.mjs +1 -1
  308. package/dist/admin/translations/de.json.js +1 -1
  309. package/dist/admin/translations/de.json.mjs +1 -1
  310. package/dist/admin/translations/en.json.js +29 -0
  311. package/dist/admin/translations/en.json.js.map +1 -1
  312. package/dist/admin/translations/en.json.mjs +29 -0
  313. package/dist/admin/translations/en.json.mjs.map +1 -1
  314. package/dist/admin/translations/es.json.js +1 -1
  315. package/dist/admin/translations/es.json.mjs +1 -1
  316. package/dist/admin/translations/sk.json.js +2 -2
  317. package/dist/admin/translations/sk.json.mjs +2 -2
  318. package/dist/admin/translations/tr.json.js +2 -2
  319. package/dist/admin/translations/tr.json.mjs +2 -2
  320. package/dist/admin/translations/zh-Hans.json.js +1 -1
  321. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  322. package/dist/admin/translations/zh.json.js +2 -2
  323. package/dist/admin/translations/zh.json.mjs +2 -2
  324. package/dist/admin/utils/allowedMediaTypes.js +42 -0
  325. package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
  326. package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
  327. package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
  328. package/dist/admin/utils/findFolderPath.js +26 -0
  329. package/dist/admin/utils/findFolderPath.js.map +1 -0
  330. package/dist/admin/utils/findFolderPath.mjs +24 -0
  331. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  332. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  333. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  334. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  335. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  336. package/dist/server/config.js +6 -0
  337. package/dist/server/config.js.map +1 -1
  338. package/dist/server/config.mjs +6 -0
  339. package/dist/server/config.mjs.map +1 -1
  340. package/dist/server/controllers/admin-settings.js +5 -1
  341. package/dist/server/controllers/admin-settings.js.map +1 -1
  342. package/dist/server/controllers/admin-settings.mjs +5 -1
  343. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  344. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  345. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  346. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  347. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  348. package/dist/server/mcp/ambient-instance.js +7 -5
  349. package/dist/server/mcp/ambient-instance.js.map +1 -1
  350. package/dist/server/mcp/ambient-instance.mjs +7 -5
  351. package/dist/server/mcp/ambient-instance.mjs.map +1 -1
  352. package/dist/server/mcp/handlers/folder-handlers.js +4 -16
  353. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
  354. package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
  355. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
  356. package/dist/server/mcp/handlers/read-handlers.js +6 -14
  357. package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
  358. package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
  359. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
  360. package/dist/server/mcp/handlers/write-handlers.js +3 -13
  361. package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
  362. package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
  363. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
  364. package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
  365. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
  366. package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
  367. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
  368. package/dist/server/services/image-manipulation.js +35 -16
  369. package/dist/server/services/image-manipulation.js.map +1 -1
  370. package/dist/server/services/image-manipulation.mjs +35 -16
  371. package/dist/server/services/image-manipulation.mjs.map +1 -1
  372. package/dist/server/services/upload.js.map +1 -1
  373. package/dist/server/services/upload.mjs.map +1 -1
  374. package/dist/server/src/config.d.ts +3 -0
  375. package/dist/server/src/config.d.ts.map +1 -1
  376. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  377. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  378. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  379. package/dist/server/src/index.d.ts +4 -1
  380. package/dist/server/src/index.d.ts.map +1 -1
  381. package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
  382. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  383. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
  384. package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
  385. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
  386. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
  387. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
  388. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
  389. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  390. package/dist/server/src/services/image-manipulation.d.ts +1 -1
  391. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  392. package/dist/server/src/services/index.d.ts +1 -1
  393. package/dist/server/src/types.d.ts +64 -12
  394. package/dist/server/src/types.d.ts.map +1 -1
  395. package/package.json +8 -6
@@ -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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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { Loader, Flex } from '@strapi/design-system';
2
+ import { Flex, Loader } from '@strapi/design-system';
3
3
  import { styled } from 'styled-components';
4
4
 
5
5
  /**
@@ -98,9 +98,12 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
98
98
  onSelect(start, end);
99
99
  };
100
100
  const weeks = buildWeeks(viewYear, viewMonth);
101
- const weekDayLabels = weeks[0].map((day)=>formatDate(day, {
102
- weekday: 'short'
103
- }).slice(0, 2));
101
+ const weekDays = weeks[0].map((day)=>({
102
+ key: day.getDay(),
103
+ label: formatDate(day, {
104
+ weekday: 'short'
105
+ }).slice(0, 2)
106
+ }));
104
107
  return(// role="group" (not "application"): these are plain buttons — hijacking
105
108
  // the screen reader's own key handling would take away navigation and
106
109
  // give nothing back.
@@ -148,7 +151,7 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
148
151
  ]
149
152
  }),
150
153
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
151
- children: weekDayLabels.map((label, index)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
154
+ children: weekDays.map(({ key, label })=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
152
155
  width: "3rem",
153
156
  height: "2.4rem",
154
157
  justifyContent: "center",
@@ -158,9 +161,9 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
158
161
  textColor: "neutral600",
159
162
  children: label
160
163
  })
161
- }, index))
164
+ }, key))
162
165
  }),
163
- weeks.map((week, weekIndex)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
166
+ weeks.map((week)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
164
167
  children: week.map((day)=>{
165
168
  const key = toKey(day);
166
169
  const isEdge = key === rangeStart || key === rangeEnd;
@@ -184,7 +187,7 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
184
187
  ]
185
188
  }, key);
186
189
  })
187
- }, weekIndex))
190
+ }, toKey(week[0])))
188
191
  ]
189
192
  }));
190
193
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeCalendar.js","sources":["../../../../../admin/src/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\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\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDayLabels = weeks[0].map((day) => formatDate(day, { weekday: 'short' }).slice(0, 2));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDayLabels.map((label, index) => (\n <Flex key={index} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week, weekIndex) => (\n <Flex key={weekIndex}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDayLabels","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","label","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","index","height","weekIndex","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangeCalendar.js","sources":["../../../../../admin/src/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\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\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDays = weeks[0].map((day) => ({\n key: day.getDay(),\n label: formatDate(day, { weekday: 'short' }).slice(0, 2),\n }));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDays.map(({ key, label }) => (\n <Flex key={key} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week) => (\n <Flex key={toKey(week[0])}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDays","label","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","height","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}
@@ -96,9 +96,12 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
96
96
  onSelect(start, end);
97
97
  };
98
98
  const weeks = buildWeeks(viewYear, viewMonth);
99
- const weekDayLabels = weeks[0].map((day)=>formatDate(day, {
100
- weekday: 'short'
101
- }).slice(0, 2));
99
+ const weekDays = weeks[0].map((day)=>({
100
+ key: day.getDay(),
101
+ label: formatDate(day, {
102
+ weekday: 'short'
103
+ }).slice(0, 2)
104
+ }));
102
105
  return(// role="group" (not "application"): these are plain buttons — hijacking
103
106
  // the screen reader's own key handling would take away navigation and
104
107
  // give nothing back.
@@ -146,7 +149,7 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
146
149
  ]
147
150
  }),
148
151
  /*#__PURE__*/ jsx(Flex, {
149
- children: weekDayLabels.map((label, index)=>/*#__PURE__*/ jsx(Flex, {
152
+ children: weekDays.map(({ key, label })=>/*#__PURE__*/ jsx(Flex, {
150
153
  width: "3rem",
151
154
  height: "2.4rem",
152
155
  justifyContent: "center",
@@ -156,9 +159,9 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
156
159
  textColor: "neutral600",
157
160
  children: label
158
161
  })
159
- }, index))
162
+ }, key))
160
163
  }),
161
- weeks.map((week, weekIndex)=>/*#__PURE__*/ jsx(Flex, {
164
+ weeks.map((week)=>/*#__PURE__*/ jsx(Flex, {
162
165
  children: week.map((day)=>{
163
166
  const key = toKey(day);
164
167
  const isEdge = key === rangeStart || key === rangeEnd;
@@ -182,7 +185,7 @@ const DateRangeCalendar = ({ from, to, onSelect })=>{
182
185
  ]
183
186
  }, key);
184
187
  })
185
- }, weekIndex))
188
+ }, toKey(week[0])))
186
189
  ]
187
190
  }));
188
191
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeCalendar.mjs","sources":["../../../../../admin/src/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\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\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDayLabels = weeks[0].map((day) => formatDate(day, { weekday: 'short' }).slice(0, 2));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDayLabels.map((label, index) => (\n <Flex key={index} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week, weekIndex) => (\n <Flex key={weekIndex}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDayLabels","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","label","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","index","height","weekIndex","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangeCalendar.mjs","sources":["../../../../../admin/src/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\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\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDays = weeks[0].map((day) => ({\n key: day.getDay(),\n label: formatDate(day, { weekday: 'short' }).slice(0, 2),\n }));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDays.map(({ key, label }) => (\n <Flex key={key} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week) => (\n <Flex key={toKey(week[0])}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDays","label","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","height","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Typography, Flex } from '@strapi/design-system';
2
+ import { Flex, Typography } from '@strapi/design-system';
3
3
  import { Folder, File } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { styled } from 'styled-components';
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var translations = require('../../../../utils/translations.js');
8
+ var assetSortable = require('./assetSortable.js');
9
+
10
+ /**
11
+ * The keyboard path into reordering (Space picks the item up, arrows move it,
12
+ * Space drops it). Pointer drags start from anywhere on the item, this grip
13
+ * included.
14
+ */ const ReorderHandle = ({ name, handle })=>{
15
+ const { formatMessage } = reactIntl.useIntl();
16
+ const { ref, onKeyDown, ...attributes } = handle;
17
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
18
+ ...attributes,
19
+ ref: ref,
20
+ size: "XS",
21
+ variant: "ghost",
22
+ withTooltip: false,
23
+ label: formatMessage({
24
+ id: translations.getTranslationKey('list.item.reorder'),
25
+ defaultMessage: 'Reorder {name}'
26
+ }, {
27
+ name
28
+ }),
29
+ ...assetSortable.REORDER_HANDLE_PROPS,
30
+ // Not stopped: once a drag starts, the arrows and the drop key are read on
31
+ // the document. The item ignores keys from here (`isFromReorderHandle`).
32
+ onKeyDown: onKeyDown,
33
+ // A click on the grip is not a click on the item.
34
+ onClick: (event)=>event.stopPropagation(),
35
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Drag, {})
36
+ });
37
+ };
38
+
39
+ exports.ReorderHandle = ReorderHandle;
40
+ //# sourceMappingURL=ReorderHandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderHandle.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/ReorderHandle.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport { REORDER_HANDLE_PROPS, type AssetSortable } from './assetSortable';\n\ninterface ReorderHandleProps {\n name: string;\n handle: AssetSortable['handle'];\n}\n\n/**\n * The keyboard path into reordering (Space picks the item up, arrows move it,\n * Space drops it). Pointer drags start from anywhere on the item, this grip\n * included.\n */\nexport const ReorderHandle = ({ name, handle }: ReorderHandleProps) => {\n const { formatMessage } = useIntl();\n const { ref, onKeyDown, ...attributes } = handle;\n\n return (\n <IconButton\n {...attributes}\n ref={ref}\n size=\"XS\"\n variant=\"ghost\"\n withTooltip={false}\n label={formatMessage(\n { id: getTranslationKey('list.item.reorder'), defaultMessage: 'Reorder {name}' },\n { name }\n )}\n {...REORDER_HANDLE_PROPS}\n // Not stopped: once a drag starts, the arrows and the drop key are read on\n // the document. The item ignores keys from here (`isFromReorderHandle`).\n onKeyDown={onKeyDown}\n // A click on the grip is not a click on the item.\n onClick={(event) => event.stopPropagation()}\n >\n <Drag />\n </IconButton>\n );\n};\n"],"names":["ReorderHandle","name","handle","formatMessage","useIntl","ref","onKeyDown","attributes","_jsx","IconButton","size","variant","withTooltip","label","id","getTranslationKey","defaultMessage","REORDER_HANDLE_PROPS","onClick","event","stopPropagation","Drag"],"mappings":";;;;;;;;;AAaA;;;;UAKaA,aAAAA,GAAgB,CAAC,EAAEC,IAAI,EAAEC,MAAM,EAAsB,GAAA;IAChE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAE,GAAGC,YAAY,GAAGL,MAAAA;AAE1C,IAAA,qBACEM,cAAA,CAACC,uBAAAA,EAAAA;AACE,QAAA,GAAGF,UAAU;QACdF,GAAAA,EAAKA,GAAAA;QACLK,IAAAA,EAAK,IAAA;QACLC,OAAAA,EAAQ,OAAA;QACRC,WAAAA,EAAa,KAAA;AACbC,QAAAA,KAAAA,EAAOV,aAAAA,CACL;AAAEW,YAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,mBAAA,CAAA;YAAsBC,cAAAA,EAAgB;SAAiB,EAC/E;AAAEf,YAAAA;AAAK,SAAA,CAAA;AAER,QAAA,GAAGgB,kCAAoB;;;QAGxBX,SAAAA,EAAWA,SAAAA;;QAEXY,OAAAA,EAAS,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,eAAe,EAAA;AAEzC,QAAA,QAAA,gBAAAZ,cAAA,CAACa,UAAAA,EAAAA,EAAAA;;AAGP;;;;"}
@@ -0,0 +1,38 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { IconButton } from '@strapi/design-system';
3
+ import { Drag } from '@strapi/icons';
4
+ import { useIntl } from 'react-intl';
5
+ import { getTranslationKey } from '../../../../utils/translations.mjs';
6
+ import { REORDER_HANDLE_PROPS } from './assetSortable.mjs';
7
+
8
+ /**
9
+ * The keyboard path into reordering (Space picks the item up, arrows move it,
10
+ * Space drops it). Pointer drags start from anywhere on the item, this grip
11
+ * included.
12
+ */ const ReorderHandle = ({ name, handle })=>{
13
+ const { formatMessage } = useIntl();
14
+ const { ref, onKeyDown, ...attributes } = handle;
15
+ return /*#__PURE__*/ jsx(IconButton, {
16
+ ...attributes,
17
+ ref: ref,
18
+ size: "XS",
19
+ variant: "ghost",
20
+ withTooltip: false,
21
+ label: formatMessage({
22
+ id: getTranslationKey('list.item.reorder'),
23
+ defaultMessage: 'Reorder {name}'
24
+ }, {
25
+ name
26
+ }),
27
+ ...REORDER_HANDLE_PROPS,
28
+ // Not stopped: once a drag starts, the arrows and the drop key are read on
29
+ // the document. The item ignores keys from here (`isFromReorderHandle`).
30
+ onKeyDown: onKeyDown,
31
+ // A click on the grip is not a click on the item.
32
+ onClick: (event)=>event.stopPropagation(),
33
+ children: /*#__PURE__*/ jsx(Drag, {})
34
+ });
35
+ };
36
+
37
+ export { ReorderHandle };
38
+ //# sourceMappingURL=ReorderHandle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReorderHandle.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/ReorderHandle.tsx"],"sourcesContent":["import { IconButton } from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport { REORDER_HANDLE_PROPS, type AssetSortable } from './assetSortable';\n\ninterface ReorderHandleProps {\n name: string;\n handle: AssetSortable['handle'];\n}\n\n/**\n * The keyboard path into reordering (Space picks the item up, arrows move it,\n * Space drops it). Pointer drags start from anywhere on the item, this grip\n * included.\n */\nexport const ReorderHandle = ({ name, handle }: ReorderHandleProps) => {\n const { formatMessage } = useIntl();\n const { ref, onKeyDown, ...attributes } = handle;\n\n return (\n <IconButton\n {...attributes}\n ref={ref}\n size=\"XS\"\n variant=\"ghost\"\n withTooltip={false}\n label={formatMessage(\n { id: getTranslationKey('list.item.reorder'), defaultMessage: 'Reorder {name}' },\n { name }\n )}\n {...REORDER_HANDLE_PROPS}\n // Not stopped: once a drag starts, the arrows and the drop key are read on\n // the document. The item ignores keys from here (`isFromReorderHandle`).\n onKeyDown={onKeyDown}\n // A click on the grip is not a click on the item.\n onClick={(event) => event.stopPropagation()}\n >\n <Drag />\n </IconButton>\n );\n};\n"],"names":["ReorderHandle","name","handle","formatMessage","useIntl","ref","onKeyDown","attributes","_jsx","IconButton","size","variant","withTooltip","label","id","getTranslationKey","defaultMessage","REORDER_HANDLE_PROPS","onClick","event","stopPropagation","Drag"],"mappings":";;;;;;;AAaA;;;;UAKaA,aAAAA,GAAgB,CAAC,EAAEC,IAAI,EAAEC,MAAM,EAAsB,GAAA;IAChE,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,GAAG,EAAEC,SAAS,EAAE,GAAGC,YAAY,GAAGL,MAAAA;AAE1C,IAAA,qBACEM,GAAA,CAACC,UAAAA,EAAAA;AACE,QAAA,GAAGF,UAAU;QACdF,GAAAA,EAAKA,GAAAA;QACLK,IAAAA,EAAK,IAAA;QACLC,OAAAA,EAAQ,OAAA;QACRC,WAAAA,EAAa,KAAA;AACbC,QAAAA,KAAAA,EAAOV,aAAAA,CACL;AAAEW,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,mBAAA,CAAA;YAAsBC,cAAAA,EAAgB;SAAiB,EAC/E;AAAEf,YAAAA;AAAK,SAAA,CAAA;AAER,QAAA,GAAGgB,oBAAoB;;;QAGxBX,SAAAA,EAAWA,SAAAA;;QAEXY,OAAAA,EAAS,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,eAAe,EAAA;AAEzC,QAAA,QAAA,gBAAAZ,GAAA,CAACa,IAAAA,EAAAA,EAAAA;;AAGP;;;;"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const useNotSortable = ()=>null;
6
+ /**
7
+ * Holds the hook that makes an asset sortable, rather than a value: the hook
8
+ * needs each item's id. A given subtree always gets the same hook, so calling
9
+ * it from `useAssetSortable` keeps the rules of hooks.
10
+ */ const AssetSortableContext = React.createContext(useNotSortable);
11
+ const useAssetSortable = (assetId)=>{
12
+ const useSortableAsset = React.useContext(AssetSortableContext);
13
+ return useSortableAsset(assetId);
14
+ };
15
+ const REORDER_HANDLE_ATTRIBUTE = 'data-reorder-handle';
16
+ /** Marks the reorder grip, so the item can tell its keys apart. */ const REORDER_HANDLE_PROPS = {
17
+ [REORDER_HANDLE_ATTRIBUTE]: ''
18
+ };
19
+ /**
20
+ * Keys pressed on the grip, including the arrows and the drop key mid-drag,
21
+ * belong to reordering. The item must not also read them as its own
22
+ * Enter/Space.
23
+ */ const isFromReorderHandle = (event)=>event.target instanceof Element && event.target.closest(`[${REORDER_HANDLE_ATTRIBUTE}]`) !== null;
24
+
25
+ exports.AssetSortableContext = AssetSortableContext;
26
+ exports.REORDER_HANDLE_PROPS = REORDER_HANDLE_PROPS;
27
+ exports.isFromReorderHandle = isFromReorderHandle;
28
+ exports.useAssetSortable = useAssetSortable;
29
+ //# sourceMappingURL=assetSortable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetSortable.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/assetSortable.ts"],"sourcesContent":["import {\n createContext,\n useContext,\n type CSSProperties,\n type KeyboardEvent,\n type SyntheticEvent,\n} from 'react';\n\nimport type { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';\n\n/**\n * What a list item needs to take part in reordering: the whole item drags with\n * the pointer, and a grip button carries the keyboard path (Space to pick up,\n * arrows to move) so it doesn't collide with the item's own Space/click.\n */\nexport interface AssetSortable {\n setNodeRef: (node: HTMLElement | null) => void;\n isDragging: boolean;\n style: CSSProperties;\n /** Pointer activation, for the item itself. */\n listeners: DraggableSyntheticListeners;\n handle: Partial<DraggableAttributes> & {\n ref: (node: HTMLElement | null) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n };\n}\n\ntype UseAssetSortable = (assetId: number) => AssetSortable | null;\n\nconst useNotSortable: UseAssetSortable = () => null;\n\n/**\n * Holds the hook that makes an asset sortable, rather than a value: the hook\n * needs each item's id. A given subtree always gets the same hook, so calling\n * it from `useAssetSortable` keeps the rules of hooks.\n */\nexport const AssetSortableContext = createContext<UseAssetSortable>(useNotSortable);\n\nexport const useAssetSortable = (assetId: number) => {\n const useSortableAsset = useContext(AssetSortableContext);\n\n return useSortableAsset(assetId);\n};\n\nconst REORDER_HANDLE_ATTRIBUTE = 'data-reorder-handle';\n\n/** Marks the reorder grip, so the item can tell its keys apart. */\nexport const REORDER_HANDLE_PROPS = { [REORDER_HANDLE_ATTRIBUTE]: '' };\n\n/**\n * Keys pressed on the grip, including the arrows and the drop key mid-drag,\n * belong to reordering. The item must not also read them as its own\n * Enter/Space.\n */\nexport const isFromReorderHandle = (event: SyntheticEvent) =>\n event.target instanceof Element && event.target.closest(`[${REORDER_HANDLE_ATTRIBUTE}]`) !== null;\n"],"names":["useNotSortable","AssetSortableContext","createContext","useAssetSortable","assetId","useSortableAsset","useContext","REORDER_HANDLE_ATTRIBUTE","REORDER_HANDLE_PROPS","isFromReorderHandle","event","target","Element","closest"],"mappings":";;;;AA6BA,MAAMA,iBAAmC,IAAM,IAAA;AAE/C;;;;AAIC,IACM,MAAMC,oBAAAA,GAAuBC,mBAAAA,CAAgCF,cAAAA;AAE7D,MAAMG,mBAAmB,CAACC,OAAAA,GAAAA;AAC/B,IAAA,MAAMC,mBAAmBC,gBAAAA,CAAWL,oBAAAA,CAAAA;AAEpC,IAAA,OAAOI,gBAAAA,CAAiBD,OAAAA,CAAAA;AAC1B;AAEA,MAAMG,wBAAAA,GAA2B,qBAAA;AAEjC,oEACO,MAAMC,oBAAAA,GAAuB;AAAE,IAAA,CAACD,2BAA2B;AAAG;AAErE;;;;UAKaE,mBAAAA,GAAsB,CAACC,QAClCA,KAAAA,CAAMC,MAAM,YAAYC,OAAAA,IAAWF,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAAC,CAAC,CAAC,EAAEN,wBAAAA,CAAyB,CAAC,CAAC,CAAA,KAAM;;;;;;;"}
@@ -0,0 +1,24 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const useNotSortable = ()=>null;
4
+ /**
5
+ * Holds the hook that makes an asset sortable, rather than a value: the hook
6
+ * needs each item's id. A given subtree always gets the same hook, so calling
7
+ * it from `useAssetSortable` keeps the rules of hooks.
8
+ */ const AssetSortableContext = createContext(useNotSortable);
9
+ const useAssetSortable = (assetId)=>{
10
+ const useSortableAsset = useContext(AssetSortableContext);
11
+ return useSortableAsset(assetId);
12
+ };
13
+ const REORDER_HANDLE_ATTRIBUTE = 'data-reorder-handle';
14
+ /** Marks the reorder grip, so the item can tell its keys apart. */ const REORDER_HANDLE_PROPS = {
15
+ [REORDER_HANDLE_ATTRIBUTE]: ''
16
+ };
17
+ /**
18
+ * Keys pressed on the grip, including the arrows and the drop key mid-drag,
19
+ * belong to reordering. The item must not also read them as its own
20
+ * Enter/Space.
21
+ */ const isFromReorderHandle = (event)=>event.target instanceof Element && event.target.closest(`[${REORDER_HANDLE_ATTRIBUTE}]`) !== null;
22
+
23
+ export { AssetSortableContext, REORDER_HANDLE_PROPS, isFromReorderHandle, useAssetSortable };
24
+ //# sourceMappingURL=assetSortable.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetSortable.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/assetSortable.ts"],"sourcesContent":["import {\n createContext,\n useContext,\n type CSSProperties,\n type KeyboardEvent,\n type SyntheticEvent,\n} from 'react';\n\nimport type { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';\n\n/**\n * What a list item needs to take part in reordering: the whole item drags with\n * the pointer, and a grip button carries the keyboard path (Space to pick up,\n * arrows to move) so it doesn't collide with the item's own Space/click.\n */\nexport interface AssetSortable {\n setNodeRef: (node: HTMLElement | null) => void;\n isDragging: boolean;\n style: CSSProperties;\n /** Pointer activation, for the item itself. */\n listeners: DraggableSyntheticListeners;\n handle: Partial<DraggableAttributes> & {\n ref: (node: HTMLElement | null) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n };\n}\n\ntype UseAssetSortable = (assetId: number) => AssetSortable | null;\n\nconst useNotSortable: UseAssetSortable = () => null;\n\n/**\n * Holds the hook that makes an asset sortable, rather than a value: the hook\n * needs each item's id. A given subtree always gets the same hook, so calling\n * it from `useAssetSortable` keeps the rules of hooks.\n */\nexport const AssetSortableContext = createContext<UseAssetSortable>(useNotSortable);\n\nexport const useAssetSortable = (assetId: number) => {\n const useSortableAsset = useContext(AssetSortableContext);\n\n return useSortableAsset(assetId);\n};\n\nconst REORDER_HANDLE_ATTRIBUTE = 'data-reorder-handle';\n\n/** Marks the reorder grip, so the item can tell its keys apart. */\nexport const REORDER_HANDLE_PROPS = { [REORDER_HANDLE_ATTRIBUTE]: '' };\n\n/**\n * Keys pressed on the grip, including the arrows and the drop key mid-drag,\n * belong to reordering. The item must not also read them as its own\n * Enter/Space.\n */\nexport const isFromReorderHandle = (event: SyntheticEvent) =>\n event.target instanceof Element && event.target.closest(`[${REORDER_HANDLE_ATTRIBUTE}]`) !== null;\n"],"names":["useNotSortable","AssetSortableContext","createContext","useAssetSortable","assetId","useSortableAsset","useContext","REORDER_HANDLE_ATTRIBUTE","REORDER_HANDLE_PROPS","isFromReorderHandle","event","target","Element","closest"],"mappings":";;AA6BA,MAAMA,iBAAmC,IAAM,IAAA;AAE/C;;;;AAIC,IACM,MAAMC,oBAAAA,GAAuBC,aAAAA,CAAgCF,cAAAA;AAE7D,MAAMG,mBAAmB,CAACC,OAAAA,GAAAA;AAC/B,IAAA,MAAMC,mBAAmBC,UAAAA,CAAWL,oBAAAA,CAAAA;AAEpC,IAAA,OAAOI,gBAAAA,CAAiBD,OAAAA,CAAAA;AAC1B;AAEA,MAAMG,wBAAAA,GAA2B,qBAAA;AAEjC,oEACO,MAAMC,oBAAAA,GAAuB;AAAE,IAAA,CAACD,2BAA2B;AAAG;AAErE;;;;UAKaE,mBAAAA,GAAsB,CAACC,QAClCA,KAAAA,CAAMC,MAAM,YAAYC,OAAAA,IAAWF,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAAC,CAAC,CAAC,EAAEN,wBAAAA,CAAyB,CAAC,CAAC,CAAA,KAAM;;;;"}
@@ -11,6 +11,10 @@ const parseFolderTargetId = (dndId)=>{
11
11
  return match ? Number(match[1]) : null;
12
12
  };
13
13
  const toFolderTreeTargetId = (id)=>`folder-tree-target:${id}`;
14
+ /**
15
+ * The "N parent folders" row in the sidebar. Only there so hovering it during a
16
+ * drag opens it; no parser recognises it, so a drop on it moves nothing.
17
+ */ const toFolderTreeSummaryId = (rootId)=>`folder-tree-summary:${rootId}`;
14
18
  const HOME_TREE_TARGET_ID = 'folder-tree-target:home';
15
19
  const parseFolderTreeTargetId = (dndId)=>{
16
20
  if (typeof dndId !== 'string') {
@@ -29,5 +33,6 @@ exports.parseFolderTreeTargetId = parseFolderTreeTargetId;
29
33
  exports.toFileDraggableId = toFileDraggableId;
30
34
  exports.toFolderDraggableId = toFolderDraggableId;
31
35
  exports.toFolderTargetId = toFolderTargetId;
36
+ exports.toFolderTreeSummaryId = toFolderTreeSummaryId;
32
37
  exports.toFolderTreeTargetId = toFolderTreeTargetId;
33
38
  //# sourceMappingURL=dndIds.js.map