@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":"dndIds.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n\nexport const toFolderTreeTargetId = (id: number) => `folder-tree-target:${id}` as const;\n\nexport const HOME_TREE_TARGET_ID = 'folder-tree-target:home' as const;\n\nexport const parseFolderTreeTargetId = (dndId: string | number): number | 'root' | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n if (dndId === HOME_TREE_TARGET_ID) {\n return 'root';\n }\n\n const match = /^folder-tree-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number","toFolderTreeTargetId","HOME_TREE_TARGET_ID","parseFolderTreeTargetId"],"mappings":";;AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;AAEO,MAAMG,uBAAuB,CAACR,EAAAA,GAAe,CAAC,mBAAmB,EAAEA;AAEnE,MAAMS,sBAAsB;AAE5B,MAAMC,0BAA0B,CAACN,KAAAA,GAAAA;IACtC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,UAAUK,mBAAAA,EAAqB;QACjC,OAAO,MAAA;AACT,IAAA;IAEA,MAAMJ,KAAAA,GAAQ,4BAAA,CAA6BC,IAAI,CAACF,KAAAA,CAAAA;AAChD,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;;;;;;;"}
1
+ {"version":3,"file":"dndIds.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n\nexport const toFolderTreeTargetId = (id: number) => `folder-tree-target:${id}` as const;\n\n/**\n * The \"N parent folders\" row in the sidebar. Only there so hovering it during a\n * drag opens it; no parser recognises it, so a drop on it moves nothing.\n */\nexport const toFolderTreeSummaryId = (rootId: number) => `folder-tree-summary:${rootId}` as const;\n\nexport const HOME_TREE_TARGET_ID = 'folder-tree-target:home' as const;\n\nexport const parseFolderTreeTargetId = (dndId: string | number): number | 'root' | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n if (dndId === HOME_TREE_TARGET_ID) {\n return 'root';\n }\n\n const match = /^folder-tree-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number","toFolderTreeTargetId","toFolderTreeSummaryId","rootId","HOME_TREE_TARGET_ID","parseFolderTreeTargetId"],"mappings":";;AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;AAEO,MAAMG,uBAAuB,CAACR,EAAAA,GAAe,CAAC,mBAAmB,EAAEA;AAE1E;;;UAIaS,qBAAAA,GAAwB,CAACC,SAAmB,CAAC,oBAAoB,EAAEA,MAAAA,CAAAA;AAEzE,MAAMC,sBAAsB;AAE5B,MAAMC,0BAA0B,CAACR,KAAAA,GAAAA;IACtC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,UAAUO,mBAAAA,EAAqB;QACjC,OAAO,MAAA;AACT,IAAA;IAEA,MAAMN,KAAAA,GAAQ,4BAAA,CAA6BC,IAAI,CAACF,KAAAA,CAAAA;AAChD,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;;;;;;;;"}
@@ -9,6 +9,10 @@ const parseFolderTargetId = (dndId)=>{
9
9
  return match ? Number(match[1]) : null;
10
10
  };
11
11
  const toFolderTreeTargetId = (id)=>`folder-tree-target:${id}`;
12
+ /**
13
+ * The "N parent folders" row in the sidebar. Only there so hovering it during a
14
+ * drag opens it; no parser recognises it, so a drop on it moves nothing.
15
+ */ const toFolderTreeSummaryId = (rootId)=>`folder-tree-summary:${rootId}`;
12
16
  const HOME_TREE_TARGET_ID = 'folder-tree-target:home';
13
17
  const parseFolderTreeTargetId = (dndId)=>{
14
18
  if (typeof dndId !== 'string') {
@@ -21,5 +25,5 @@ const parseFolderTreeTargetId = (dndId)=>{
21
25
  return match ? Number(match[1]) : null;
22
26
  };
23
27
 
24
- export { HOME_TREE_TARGET_ID, parseFolderTargetId, parseFolderTreeTargetId, toFileDraggableId, toFolderDraggableId, toFolderTargetId, toFolderTreeTargetId };
28
+ export { HOME_TREE_TARGET_ID, parseFolderTargetId, parseFolderTreeTargetId, toFileDraggableId, toFolderDraggableId, toFolderTargetId, toFolderTreeSummaryId, toFolderTreeTargetId };
25
29
  //# sourceMappingURL=dndIds.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dndIds.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n\nexport const toFolderTreeTargetId = (id: number) => `folder-tree-target:${id}` as const;\n\nexport const HOME_TREE_TARGET_ID = 'folder-tree-target:home' as const;\n\nexport const parseFolderTreeTargetId = (dndId: string | number): number | 'root' | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n if (dndId === HOME_TREE_TARGET_ID) {\n return 'root';\n }\n\n const match = /^folder-tree-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number","toFolderTreeTargetId","HOME_TREE_TARGET_ID","parseFolderTreeTargetId"],"mappings":"AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;AAEO,MAAMG,uBAAuB,CAACR,EAAAA,GAAe,CAAC,mBAAmB,EAAEA;AAEnE,MAAMS,sBAAsB;AAE5B,MAAMC,0BAA0B,CAACN,KAAAA,GAAAA;IACtC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,UAAUK,mBAAAA,EAAqB;QACjC,OAAO,MAAA;AACT,IAAA;IAEA,MAAMJ,KAAAA,GAAQ,4BAAA,CAA6BC,IAAI,CAACF,KAAAA,CAAAA;AAChD,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;"}
1
+ {"version":3,"file":"dndIds.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/dndIds.ts"],"sourcesContent":["export const toFileDraggableId = (id: number) => `file:${id}` as const;\n\nexport const toFolderDraggableId = (id: number) => `folder:${id}` as const;\n\nexport const toFolderTargetId = (id: number) => `folder-target:${id}` as const;\n\nexport const parseFolderTargetId = (dndId: string | number): number | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n const match = /^folder-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n\nexport const toFolderTreeTargetId = (id: number) => `folder-tree-target:${id}` as const;\n\n/**\n * The \"N parent folders\" row in the sidebar. Only there so hovering it during a\n * drag opens it; no parser recognises it, so a drop on it moves nothing.\n */\nexport const toFolderTreeSummaryId = (rootId: number) => `folder-tree-summary:${rootId}` as const;\n\nexport const HOME_TREE_TARGET_ID = 'folder-tree-target:home' as const;\n\nexport const parseFolderTreeTargetId = (dndId: string | number): number | 'root' | null => {\n if (typeof dndId !== 'string') {\n return null;\n }\n\n if (dndId === HOME_TREE_TARGET_ID) {\n return 'root';\n }\n\n const match = /^folder-tree-target:(\\d+)$/.exec(dndId);\n return match ? Number(match[1]) : null;\n};\n"],"names":["toFileDraggableId","id","toFolderDraggableId","toFolderTargetId","parseFolderTargetId","dndId","match","exec","Number","toFolderTreeTargetId","toFolderTreeSummaryId","rootId","HOME_TREE_TARGET_ID","parseFolderTreeTargetId"],"mappings":"AAAO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,CAAC,KAAK,EAAEA;AAElD,MAAMC,sBAAsB,CAACD,EAAAA,GAAe,CAAC,OAAO,EAAEA;AAEtD,MAAME,mBAAmB,CAACF,EAAAA,GAAe,CAAC,cAAc,EAAEA;AAE1D,MAAMG,sBAAsB,CAACC,KAAAA,GAAAA;IAClC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,KAAAA,GAAQ,uBAAA,CAAwBC,IAAI,CAACF,KAAAA,CAAAA;AAC3C,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;AAEO,MAAMG,uBAAuB,CAACR,EAAAA,GAAe,CAAC,mBAAmB,EAAEA;AAE1E;;;UAIaS,qBAAAA,GAAwB,CAACC,SAAmB,CAAC,oBAAoB,EAAEA,MAAAA,CAAAA;AAEzE,MAAMC,sBAAsB;AAE5B,MAAMC,0BAA0B,CAACR,KAAAA,GAAAA;IACtC,IAAI,OAAOA,UAAU,QAAA,EAAU;QAC7B,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,UAAUO,mBAAAA,EAAqB;QACjC,OAAO,MAAA;AACT,IAAA;IAEA,MAAMN,KAAAA,GAAQ,4BAAA,CAA6BC,IAAI,CAACF,KAAAA,CAAAA;AAChD,IAAA,OAAOC,KAAAA,GAAQE,MAAAA,CAAOF,KAAK,CAAC,EAAE,CAAA,GAAI,IAAA;AACpC;;;;"}
@@ -4,12 +4,23 @@ var React = require('react');
4
4
  var core = require('@dnd-kit/core');
5
5
  var getRelationId = require('../../../../utils/getRelationId.js');
6
6
  var AssetsDndProvider = require('./AssetsDndProvider.js');
7
+ var assetSortable = require('./assetSortable.js');
7
8
  var dndIds = require('./dndIds.js');
8
9
 
9
- const useFileDraggable = (asset)=>{
10
- const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
11
- isMovePending: false
10
+ /**
11
+ * Without an `AssetsDndProvider` (the Content Manager asset picker mounts none)
12
+ * items are not draggable: nothing handles the drop. Their drag attributes are
13
+ * withheld too, so they aren't announced as draggable.
14
+ */ const NO_DRAG_ATTRIBUTES = {};
15
+ const withoutDrag = (draggable, isDndEnabled)=>isDndEnabled ? draggable : {
16
+ ...draggable,
17
+ attributes: NO_DRAG_ATTRIBUTES,
18
+ listeners: undefined
12
19
  };
20
+ const useFileDraggable = (asset)=>{
21
+ const dnd = AssetsDndProvider.useAssetsDndOptional();
22
+ const isDndEnabled = dnd !== null;
23
+ const isMovePending = dnd?.isMovePending ?? false;
13
24
  const data = React.useMemo(()=>({
14
25
  kind: 'file',
15
26
  id: asset.id,
@@ -23,20 +34,37 @@ const useFileDraggable = (asset)=>{
23
34
  const draggable = core.useDraggable({
24
35
  id: dndIds.toFileDraggableId(asset.id),
25
36
  data,
26
- disabled: isMovePending
37
+ disabled: !isDndEnabled || isMovePending
27
38
  });
39
+ const sortable = assetSortable.useAssetSortable(asset.id);
40
+ // In a reorderable list (the picker's Selected tab) dragging reorders
41
+ // instead of moving between folders: the item takes the sortable's node,
42
+ // pointer listeners and transform, and exposes a grip for the keyboard.
43
+ if (sortable) {
44
+ return {
45
+ ...withoutDrag(draggable, false),
46
+ setNodeRef: sortable.setNodeRef,
47
+ isDragging: sortable.isDragging,
48
+ listeners: sortable.listeners,
49
+ dragStyle: sortable.style,
50
+ dragHandle: sortable.handle,
51
+ dragData: data
52
+ };
53
+ }
28
54
  // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the
29
55
  // row's actions menu can hand the move dialog the asset's real folder.
30
56
  return {
31
- ...draggable,
57
+ ...withoutDrag(draggable, isDndEnabled),
58
+ dragStyle: undefined,
59
+ dragHandle: undefined,
32
60
  dragData: data
33
61
  };
34
62
  };
35
63
  const useFolderDraggableDroppable = (folder)=>{
36
- const { isMovePending, isValidDropTarget } = AssetsDndProvider.useAssetsDndOptional() ?? {
37
- isMovePending: false,
38
- isValidDropTarget: ()=>false
39
- };
64
+ const dnd = AssetsDndProvider.useAssetsDndOptional();
65
+ const isDndEnabled = dnd !== null;
66
+ const isMovePending = dnd?.isMovePending ?? false;
67
+ const isValidDropTarget = dnd?.isValidDropTarget ?? (()=>false);
40
68
  const { active } = core.useDndContext();
41
69
  const parentId = getRelationId.getRelationId(folder.parent);
42
70
  const dragData = React.useMemo(()=>({
@@ -57,15 +85,15 @@ const useFolderDraggableDroppable = (folder)=>{
57
85
  folder.id,
58
86
  folder.name
59
87
  ]);
60
- const draggable = core.useDraggable({
88
+ const draggable = withoutDrag(core.useDraggable({
61
89
  id: dndIds.toFolderDraggableId(folder.id),
62
90
  data: dragData,
63
- disabled: isMovePending
64
- });
91
+ disabled: !isDndEnabled || isMovePending
92
+ }), isDndEnabled);
65
93
  const droppable = core.useDroppable({
66
94
  id: dndIds.toFolderTargetId(folder.id),
67
95
  data: dropData,
68
- disabled: isMovePending
96
+ disabled: !isDndEnabled || isMovePending
69
97
  });
70
98
  const isValidTarget = isValidDropTarget(folder.id);
71
99
  const isOver = droppable.isOver;
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetDnd.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';\n\nimport { getRelationId } from '../../../../utils/getRelationId';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type { DragFileData, DragFolderData, FolderTargetData } from '../../../../types/dnd';\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | { id?: number } | null;\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId: getRelationId(asset.folder),\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n const draggable = useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: isMovePending,\n });\n\n // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the\n // row's actions menu can hand the move dialog the asset's real folder.\n return { ...draggable, dragData: data };\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const { isMovePending, isValidDropTarget } = useAssetsDndOptional() ?? {\n isMovePending: false,\n isValidDropTarget: () => false,\n };\n const { active } = useDndContext();\n\n const parentId = getRelationId(folder.parent);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: isMovePending,\n });\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: isMovePending,\n });\n\n const isValidTarget = isValidDropTarget(folder.id);\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidTarget;\n const showInvalidDropCursor = isOver && !isValidTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["useFileDraggable","asset","isMovePending","useAssetsDndOptional","data","useMemo","kind","id","name","folderId","getRelationId","folder","draggable","useDraggable","toFileDraggableId","disabled","dragData","useFolderDraggableDroppable","isValidDropTarget","active","useDndContext","parentId","parent","dropData","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","isValidTarget","isOver","showValidDropHighlight","showInvalidDropCursor","isDragging"],"mappings":"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"}
1
+ {"version":3,"file":"useAssetDnd.js","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable, type DraggableAttributes } from '@dnd-kit/core';\n\nimport { getRelationId } from '../../../../utils/getRelationId';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { useAssetSortable } from './assetSortable';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type { DragFileData, DragFolderData, FolderTargetData } from '../../../../types/dnd';\n\n/**\n * Without an `AssetsDndProvider` (the Content Manager asset picker mounts none)\n * items are not draggable: nothing handles the drop. Their drag attributes are\n * withheld too, so they aren't announced as draggable.\n */\nconst NO_DRAG_ATTRIBUTES: Partial<DraggableAttributes> = {};\n\nconst withoutDrag = <T extends { attributes: DraggableAttributes }>(\n draggable: T,\n isDndEnabled: boolean\n) =>\n isDndEnabled ? draggable : { ...draggable, attributes: NO_DRAG_ATTRIBUTES, listeners: undefined };\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | { id?: number } | null;\n}) => {\n const dnd = useAssetsDndOptional();\n const isDndEnabled = dnd !== null;\n const isMovePending = dnd?.isMovePending ?? false;\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId: getRelationId(asset.folder),\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n const draggable = useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: !isDndEnabled || isMovePending,\n });\n\n const sortable = useAssetSortable(asset.id);\n\n // In a reorderable list (the picker's Selected tab) dragging reorders\n // instead of moving between folders: the item takes the sortable's node,\n // pointer listeners and transform, and exposes a grip for the keyboard.\n if (sortable) {\n return {\n ...withoutDrag(draggable, false),\n setNodeRef: sortable.setNodeRef,\n isDragging: sortable.isDragging,\n listeners: sortable.listeners,\n dragStyle: sortable.style,\n dragHandle: sortable.handle,\n dragData: data,\n };\n }\n\n // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the\n // row's actions menu can hand the move dialog the asset's real folder.\n return {\n ...withoutDrag(draggable, isDndEnabled),\n dragStyle: undefined,\n dragHandle: undefined,\n dragData: data,\n };\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const dnd = useAssetsDndOptional();\n const isDndEnabled = dnd !== null;\n const isMovePending = dnd?.isMovePending ?? false;\n const isValidDropTarget = dnd?.isValidDropTarget ?? (() => false);\n const { active } = useDndContext();\n\n const parentId = getRelationId(folder.parent);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = withoutDrag(\n useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: !isDndEnabled || isMovePending,\n }),\n isDndEnabled\n );\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: !isDndEnabled || isMovePending,\n });\n\n const isValidTarget = isValidDropTarget(folder.id);\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidTarget;\n const showInvalidDropCursor = isOver && !isValidTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["NO_DRAG_ATTRIBUTES","withoutDrag","draggable","isDndEnabled","attributes","listeners","undefined","useFileDraggable","asset","dnd","useAssetsDndOptional","isMovePending","data","useMemo","kind","id","name","folderId","getRelationId","folder","useDraggable","toFileDraggableId","disabled","sortable","useAssetSortable","setNodeRef","isDragging","dragStyle","style","dragHandle","handle","dragData","useFolderDraggableDroppable","isValidDropTarget","active","useDndContext","parentId","parent","dropData","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","isValidTarget","isOver","showValidDropHighlight","showInvalidDropCursor"],"mappings":"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"}
@@ -2,12 +2,23 @@ import { useMemo } from 'react';
2
2
  import { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';
3
3
  import { getRelationId } from '../../../../utils/getRelationId.mjs';
4
4
  import { useAssetsDndOptional } from './AssetsDndProvider.mjs';
5
+ import { useAssetSortable } from './assetSortable.mjs';
5
6
  import { toFolderDraggableId, toFolderTargetId, toFileDraggableId } from './dndIds.mjs';
6
7
 
7
- const useFileDraggable = (asset)=>{
8
- const { isMovePending } = useAssetsDndOptional() ?? {
9
- isMovePending: false
8
+ /**
9
+ * Without an `AssetsDndProvider` (the Content Manager asset picker mounts none)
10
+ * items are not draggable: nothing handles the drop. Their drag attributes are
11
+ * withheld too, so they aren't announced as draggable.
12
+ */ const NO_DRAG_ATTRIBUTES = {};
13
+ const withoutDrag = (draggable, isDndEnabled)=>isDndEnabled ? draggable : {
14
+ ...draggable,
15
+ attributes: NO_DRAG_ATTRIBUTES,
16
+ listeners: undefined
10
17
  };
18
+ const useFileDraggable = (asset)=>{
19
+ const dnd = useAssetsDndOptional();
20
+ const isDndEnabled = dnd !== null;
21
+ const isMovePending = dnd?.isMovePending ?? false;
11
22
  const data = useMemo(()=>({
12
23
  kind: 'file',
13
24
  id: asset.id,
@@ -21,20 +32,37 @@ const useFileDraggable = (asset)=>{
21
32
  const draggable = useDraggable({
22
33
  id: toFileDraggableId(asset.id),
23
34
  data,
24
- disabled: isMovePending
35
+ disabled: !isDndEnabled || isMovePending
25
36
  });
37
+ const sortable = useAssetSortable(asset.id);
38
+ // In a reorderable list (the picker's Selected tab) dragging reorders
39
+ // instead of moving between folders: the item takes the sortable's node,
40
+ // pointer listeners and transform, and exposes a grip for the keyboard.
41
+ if (sortable) {
42
+ return {
43
+ ...withoutDrag(draggable, false),
44
+ setNodeRef: sortable.setNodeRef,
45
+ isDragging: sortable.isDragging,
46
+ listeners: sortable.listeners,
47
+ dragStyle: sortable.style,
48
+ dragHandle: sortable.handle,
49
+ dragData: data
50
+ };
51
+ }
26
52
  // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the
27
53
  // row's actions menu can hand the move dialog the asset's real folder.
28
54
  return {
29
- ...draggable,
55
+ ...withoutDrag(draggable, isDndEnabled),
56
+ dragStyle: undefined,
57
+ dragHandle: undefined,
30
58
  dragData: data
31
59
  };
32
60
  };
33
61
  const useFolderDraggableDroppable = (folder)=>{
34
- const { isMovePending, isValidDropTarget } = useAssetsDndOptional() ?? {
35
- isMovePending: false,
36
- isValidDropTarget: ()=>false
37
- };
62
+ const dnd = useAssetsDndOptional();
63
+ const isDndEnabled = dnd !== null;
64
+ const isMovePending = dnd?.isMovePending ?? false;
65
+ const isValidDropTarget = dnd?.isValidDropTarget ?? (()=>false);
38
66
  const { active } = useDndContext();
39
67
  const parentId = getRelationId(folder.parent);
40
68
  const dragData = useMemo(()=>({
@@ -55,15 +83,15 @@ const useFolderDraggableDroppable = (folder)=>{
55
83
  folder.id,
56
84
  folder.name
57
85
  ]);
58
- const draggable = useDraggable({
86
+ const draggable = withoutDrag(useDraggable({
59
87
  id: toFolderDraggableId(folder.id),
60
88
  data: dragData,
61
- disabled: isMovePending
62
- });
89
+ disabled: !isDndEnabled || isMovePending
90
+ }), isDndEnabled);
63
91
  const droppable = useDroppable({
64
92
  id: toFolderTargetId(folder.id),
65
93
  data: dropData,
66
- disabled: isMovePending
94
+ disabled: !isDndEnabled || isMovePending
67
95
  });
68
96
  const isValidTarget = isValidDropTarget(folder.id);
69
97
  const isOver = droppable.isOver;
@@ -1 +1 @@
1
- {"version":3,"file":"useAssetDnd.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable } from '@dnd-kit/core';\n\nimport { getRelationId } from '../../../../utils/getRelationId';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type { DragFileData, DragFolderData, FolderTargetData } from '../../../../types/dnd';\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | { id?: number } | null;\n}) => {\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId: getRelationId(asset.folder),\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n const draggable = useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: isMovePending,\n });\n\n // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the\n // row's actions menu can hand the move dialog the asset's real folder.\n return { ...draggable, dragData: data };\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const { isMovePending, isValidDropTarget } = useAssetsDndOptional() ?? {\n isMovePending: false,\n isValidDropTarget: () => false,\n };\n const { active } = useDndContext();\n\n const parentId = getRelationId(folder.parent);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: isMovePending,\n });\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: isMovePending,\n });\n\n const isValidTarget = isValidDropTarget(folder.id);\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidTarget;\n const showInvalidDropCursor = isOver && !isValidTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["useFileDraggable","asset","isMovePending","useAssetsDndOptional","data","useMemo","kind","id","name","folderId","getRelationId","folder","draggable","useDraggable","toFileDraggableId","disabled","dragData","useFolderDraggableDroppable","isValidDropTarget","active","useDndContext","parentId","parent","dropData","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","isValidTarget","isOver","showValidDropHighlight","showInvalidDropCursor","isDragging"],"mappings":"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"}
1
+ {"version":3,"file":"useAssetDnd.mjs","sources":["../../../../../../admin/src/pages/Assets/components/Dnd/useAssetDnd.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { useDndContext, useDraggable, useDroppable, type DraggableAttributes } from '@dnd-kit/core';\n\nimport { getRelationId } from '../../../../utils/getRelationId';\n\nimport { useAssetsDndOptional } from './AssetsDndProvider';\nimport { useAssetSortable } from './assetSortable';\nimport { toFileDraggableId, toFolderDraggableId, toFolderTargetId } from './dndIds';\n\nimport type { DragFileData, DragFolderData, FolderTargetData } from '../../../../types/dnd';\n\n/**\n * Without an `AssetsDndProvider` (the Content Manager asset picker mounts none)\n * items are not draggable: nothing handles the drop. Their drag attributes are\n * withheld too, so they aren't announced as draggable.\n */\nconst NO_DRAG_ATTRIBUTES: Partial<DraggableAttributes> = {};\n\nconst withoutDrag = <T extends { attributes: DraggableAttributes }>(\n draggable: T,\n isDndEnabled: boolean\n) =>\n isDndEnabled ? draggable : { ...draggable, attributes: NO_DRAG_ATTRIBUTES, listeners: undefined };\n\nexport const useFileDraggable = (asset: {\n id: number;\n name: string;\n folder?: number | string | { id?: number } | null;\n}) => {\n const dnd = useAssetsDndOptional();\n const isDndEnabled = dnd !== null;\n const isMovePending = dnd?.isMovePending ?? false;\n\n const data = useMemo<DragFileData>(\n () => ({\n kind: 'file',\n id: asset.id,\n name: asset.name,\n folderId: getRelationId(asset.folder),\n }),\n [asset.folder, asset.id, asset.name]\n );\n\n const draggable = useDraggable({\n id: toFileDraggableId(asset.id),\n data,\n disabled: !isDndEnabled || isMovePending,\n });\n\n const sortable = useAssetSortable(asset.id);\n\n // In a reorderable list (the picker's Selected tab) dragging reorders\n // instead of moving between folders: the item takes the sortable's node,\n // pointer listeners and transform, and exposes a grip for the keyboard.\n if (sortable) {\n return {\n ...withoutDrag(draggable, false),\n setNodeRef: sortable.setNodeRef,\n isDragging: sortable.isDragging,\n listeners: sortable.listeners,\n dragStyle: sortable.style,\n dragHandle: sortable.handle,\n dragData: data,\n };\n }\n\n // `dragData` is re-exposed (like `useFolderDraggableDroppable` does) so the\n // row's actions menu can hand the move dialog the asset's real folder.\n return {\n ...withoutDrag(draggable, isDndEnabled),\n dragStyle: undefined,\n dragHandle: undefined,\n dragData: data,\n };\n};\n\nexport const useFolderDraggableDroppable = (folder: {\n id: number;\n name: string;\n parent?: number | null | { id?: number };\n}) => {\n const dnd = useAssetsDndOptional();\n const isDndEnabled = dnd !== null;\n const isMovePending = dnd?.isMovePending ?? false;\n const isValidDropTarget = dnd?.isValidDropTarget ?? (() => false);\n const { active } = useDndContext();\n\n const parentId = getRelationId(folder.parent);\n\n const dragData = useMemo<DragFolderData>(\n () => ({\n kind: 'folder',\n id: folder.id,\n name: folder.name,\n parentId,\n }),\n [folder.id, folder.name, parentId]\n );\n\n const dropData = useMemo<FolderTargetData>(\n () => ({\n kind: 'folder-target',\n id: folder.id,\n name: folder.name,\n }),\n [folder.id, folder.name]\n );\n\n const draggable = withoutDrag(\n useDraggable({\n id: toFolderDraggableId(folder.id),\n data: dragData,\n disabled: !isDndEnabled || isMovePending,\n }),\n isDndEnabled\n );\n\n const droppable = useDroppable({\n id: toFolderTargetId(folder.id),\n data: dropData,\n disabled: !isDndEnabled || isMovePending,\n });\n\n const isValidTarget = isValidDropTarget(folder.id);\n const isOver = droppable.isOver;\n const showValidDropHighlight = isOver && isValidTarget;\n const showInvalidDropCursor = isOver && !isValidTarget && active != null;\n\n return {\n dragData,\n draggable,\n droppable,\n isDragging: draggable.isDragging,\n showValidDropHighlight,\n showInvalidDropCursor,\n };\n};\n"],"names":["NO_DRAG_ATTRIBUTES","withoutDrag","draggable","isDndEnabled","attributes","listeners","undefined","useFileDraggable","asset","dnd","useAssetsDndOptional","isMovePending","data","useMemo","kind","id","name","folderId","getRelationId","folder","useDraggable","toFileDraggableId","disabled","sortable","useAssetSortable","setNodeRef","isDragging","dragStyle","style","dragHandle","handle","dragData","useFolderDraggableDroppable","isValidDropTarget","active","useDndContext","parentId","parent","dropData","toFolderDraggableId","droppable","useDroppable","toFolderTargetId","isValidTarget","isOver","showValidDropHighlight","showInvalidDropCursor"],"mappings":"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"}
@@ -19,9 +19,11 @@ var styledComponents = require('styled-components');
19
19
  const UploadDropZoneProvider = ({ children, onDrop, disabled = false })=>{
20
20
  const [isDragging, setIsDragging] = React.useState(false);
21
21
  const dragCounterRef = React.useRef(0);
22
- const contextValue = {
22
+ const contextValue = React.useMemo(()=>({
23
+ isDragging
24
+ }), [
23
25
  isDragging
24
- };
26
+ ]);
25
27
  React.useEffect(()=>{
26
28
  const handleDragEnd = ()=>{
27
29
  setIsDragging(false);
@@ -1 +1 @@
1
- {"version":3,"file":"UploadDropZoneContext.js","sources":["../../../../../../admin/src/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n /**\n * When true, the zone never enters the dragging state and never fires\n * `onDrop` — no overlay, no \"drop here\" invitation. Used to hide the whole\n * upload affordance from users without `assets.create`, so they don't drag a\n * file onto an inviting target that then silently discards it.\n */\n disabled?: boolean;\n}\n\nexport const UploadDropZoneProvider = ({\n children,\n onDrop,\n disabled = false,\n}: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue: UploadDropZoneContextValue = {\n isDragging,\n };\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // No upload permission → never light up the drop target.\n if (disabled) {\n return;\n }\n\n // Bidirectional guard with AssetsDndProvider — internal item drags must not\n // activate the upload overlay. See AssetsDndProvider.tsx.\n if (!e.dataTransfer.types.includes('Files')) {\n return;\n }\n\n dragCounterRef.current += 1;\n setIsDragging(true);\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n if (disabled) {\n return;\n }\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop, disabled]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","disabled","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
1
+ {"version":3,"file":"UploadDropZoneContext.js","sources":["../../../../../../admin/src/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n /**\n * When true, the zone never enters the dragging state and never fires\n * `onDrop` — no overlay, no \"drop here\" invitation. Used to hide the whole\n * upload affordance from users without `assets.create`, so they don't drag a\n * file onto an inviting target that then silently discards it.\n */\n disabled?: boolean;\n}\n\nexport const UploadDropZoneProvider = ({\n children,\n onDrop,\n disabled = false,\n}: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue = useMemo<UploadDropZoneContextValue>(() => ({ isDragging }), [isDragging]);\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // No upload permission → never light up the drop target.\n if (disabled) {\n return;\n }\n\n // Bidirectional guard with AssetsDndProvider — internal item drags must not\n // activate the upload overlay. See AssetsDndProvider.tsx.\n if (!e.dataTransfer.types.includes('Files')) {\n return;\n }\n\n dragCounterRef.current += 1;\n setIsDragging(true);\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n if (disabled) {\n return;\n }\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop, disabled]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","disabled","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useMemo","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { useState, useRef, useEffect, useCallback, createContext, useContext } from 'react';
2
+ import { useState, useRef, useMemo, useEffect, useCallback, createContext, useContext } from 'react';
3
3
  import { Box } from '@strapi/design-system';
4
4
  import { styled } from 'styled-components';
5
5
 
@@ -17,9 +17,11 @@ import { styled } from 'styled-components';
17
17
  const UploadDropZoneProvider = ({ children, onDrop, disabled = false })=>{
18
18
  const [isDragging, setIsDragging] = useState(false);
19
19
  const dragCounterRef = useRef(0);
20
- const contextValue = {
20
+ const contextValue = useMemo(()=>({
21
+ isDragging
22
+ }), [
21
23
  isDragging
22
- };
24
+ ]);
23
25
  useEffect(()=>{
24
26
  const handleDragEnd = ()=>{
25
27
  setIsDragging(false);
@@ -1 +1 @@
1
- {"version":3,"file":"UploadDropZoneContext.mjs","sources":["../../../../../../admin/src/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n /**\n * When true, the zone never enters the dragging state and never fires\n * `onDrop` — no overlay, no \"drop here\" invitation. Used to hide the whole\n * upload affordance from users without `assets.create`, so they don't drag a\n * file onto an inviting target that then silently discards it.\n */\n disabled?: boolean;\n}\n\nexport const UploadDropZoneProvider = ({\n children,\n onDrop,\n disabled = false,\n}: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue: UploadDropZoneContextValue = {\n isDragging,\n };\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // No upload permission → never light up the drop target.\n if (disabled) {\n return;\n }\n\n // Bidirectional guard with AssetsDndProvider — internal item drags must not\n // activate the upload overlay. See AssetsDndProvider.tsx.\n if (!e.dataTransfer.types.includes('Files')) {\n return;\n }\n\n dragCounterRef.current += 1;\n setIsDragging(true);\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n if (disabled) {\n return;\n }\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop, disabled]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","disabled","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
1
+ {"version":3,"file":"UploadDropZoneContext.mjs","sources":["../../../../../../admin/src/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n children: ReactNode;\n onDrop?: DropHandler;\n /**\n * When true, the zone never enters the dragging state and never fires\n * `onDrop` — no overlay, no \"drop here\" invitation. Used to hide the whole\n * upload affordance from users without `assets.create`, so they don't drag a\n * file onto an inviting target that then silently discards it.\n */\n disabled?: boolean;\n}\n\nexport const UploadDropZoneProvider = ({\n children,\n onDrop,\n disabled = false,\n}: UploadDropZoneProps) => {\n const [isDragging, setIsDragging] = useState(false);\n const dragCounterRef = useRef(0);\n\n const contextValue = useMemo<UploadDropZoneContextValue>(() => ({ isDragging }), [isDragging]);\n\n useEffect(() => {\n const handleDragEnd = () => {\n setIsDragging(false);\n dragCounterRef.current = 0;\n };\n\n // Handle drag leaving the entire document/window\n const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n // When relatedTarget is null, we're leaving the document entirely\n if (!e.relatedTarget) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n };\n\n document.addEventListener('dragend', handleDragEnd);\n document.addEventListener('dragleave', handleDocumentDragLeave);\n\n return () => {\n document.removeEventListener('dragend', handleDragEnd);\n document.removeEventListener('dragleave', handleDocumentDragLeave);\n };\n }, []);\n\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // No upload permission → never light up the drop target.\n if (disabled) {\n return;\n }\n\n // Bidirectional guard with AssetsDndProvider — internal item drags must not\n // activate the upload overlay. See AssetsDndProvider.tsx.\n if (!e.dataTransfer.types.includes('Files')) {\n return;\n }\n\n dragCounterRef.current += 1;\n setIsDragging(true);\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current -= 1;\n\n // Only set dragging to false if we've left the dropzone completely\n // (counter reaches 0 or negative)\n if (dragCounterRef.current <= 0) {\n setIsDragging(false);\n dragCounterRef.current = 0;\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'copy';\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n if (disabled) {\n return;\n }\n\n const { files } = e.dataTransfer;\n if (files?.length && onDrop) {\n onDrop(Array.from(files));\n }\n },\n [onDrop, disabled]\n );\n\n return (\n <UploadDropZoneContext.Provider value={contextValue}>\n <DropZoneWrapper\n data-testid=\"assets-dropzone\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </DropZoneWrapper>\n </UploadDropZoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n const context = useContext(UploadDropZoneContext);\n\n if (!context) {\n throw new Error('useUploadDropZone must be used within UploadDropZone');\n }\n\n return {\n isDragging: context.isDragging,\n };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","disabled","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useMemo","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}
@@ -397,6 +397,32 @@ const BadgesRoot = styledComponents.styled(designSystem.Flex)`
397
397
  `;
398
398
  const FilterBadges = ({ listFilters, compact = false })=>{
399
399
  const { filters, updateFilter, removeFilter } = listFilters;
400
+ /**
401
+ * Stable per-slot keys held in a ref. The ref is written during render, but
402
+ * the bookkeeping depends on the list length rather than on how often render
403
+ * runs, so the second pass of a StrictMode double render sees equal lengths
404
+ * and does nothing. A content-derived key fails twice over here: filters may
405
+ * legitimately repeat, and the key would change while the user edits a badge,
406
+ * remounting the badge under its open popover.
407
+ */ const filterKeyPrefix = React.useId();
408
+ const nextFilterKey = React.useRef(0);
409
+ const filterKeys = React.useRef([]);
410
+ while(filterKeys.current.length < filters.length){
411
+ filterKeys.current.push(`${filterKeyPrefix}-${nextFilterKey.current}`);
412
+ nextFilterKey.current += 1;
413
+ }
414
+ /**
415
+ * Keys are truncated from the tail. The `onRemove` closure below splices the
416
+ * removed slot out first, so removal through this component is correct. Any
417
+ * other shrink path (browser back or forward, an external filter reset)
418
+ * shifts the remaining keys and degrades to the index keys this replaced.
419
+ * Known and accepted.
420
+ */ filterKeys.current.length = filters.length;
421
+ const filtersWithKeys = filters.map((filter, index)=>({
422
+ filter,
423
+ index,
424
+ key: filterKeys.current[index]
425
+ }));
400
426
  if (filters.length === 0) {
401
427
  return null;
402
428
  }
@@ -405,11 +431,14 @@ const FilterBadges = ({ listFilters, compact = false })=>{
405
431
  gap: 2,
406
432
  wrap: "wrap",
407
433
  "data-testid": "filter-badges",
408
- children: filters.map((filter, index)=>/*#__PURE__*/ jsxRuntime.jsx(FilterBadge, {
434
+ children: filtersWithKeys.map(({ filter, index, key })=>/*#__PURE__*/ jsxRuntime.jsx(FilterBadge, {
409
435
  filter: filter,
410
436
  onChange: (next)=>updateFilter(index, next),
411
- onRemove: ()=>removeFilter(index)
412
- }, index))
437
+ onRemove: ()=>{
438
+ filterKeys.current.splice(index, 1);
439
+ removeFilter(index);
440
+ }
441
+ }, key))
413
442
  });
414
443
  };
415
444