@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
@@ -0,0 +1,89 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Breadcrumbs, CrumbSimpleMenu, MenuItem, Crumb } from '@strapi/design-system';
3
+ import { useIntl } from 'react-intl';
4
+ import { styled } from 'styled-components';
5
+ import { useGetFolderStructureQuery } from '../../services/folders.mjs';
6
+ import { findFolderPath } from '../../utils/findFolderPath.mjs';
7
+ import { getTranslationKey } from '../../utils/translations.mjs';
8
+
9
+ // Past this many folders, the ones between the first and the parent collapse
10
+ // into a menu, so a deep tree doesn't wrap the trail over several lines.
11
+ const MAX_VISIBLE_FOLDERS = 3;
12
+ // `CrumbLink`'s look on a real button. `CrumbLink` only renders an anchor, and
13
+ // one without an `href` is neither announced as a button nor reachable by Tab.
14
+ const CrumbButton = styled.button`
15
+ border: none;
16
+ background: none;
17
+ cursor: pointer;
18
+ border-radius: ${({ theme })=>theme.borderRadius};
19
+ color: ${({ theme })=>theme.colors.neutral600};
20
+ font-size: ${({ theme })=>theme.fontSizes[1]};
21
+ line-height: ${({ theme })=>theme.lineHeights[4]};
22
+ padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
23
+
24
+ &:hover,
25
+ &:focus-visible {
26
+ background-color: ${({ theme })=>theme.colors.neutral200};
27
+ color: ${({ theme })=>theme.colors.neutral700};
28
+ }
29
+ `;
30
+ /**
31
+ * Home › … › parent › current. Every crumb but the current folder navigates,
32
+ * so a user deep in the tree can climb back without a sidebar.
33
+ */ const FolderBreadcrumbs = ({ currentFolderId, onSelectFolder })=>{
34
+ const { formatMessage } = useIntl();
35
+ const { data: folderStructure = [] } = useGetFolderStructureQuery();
36
+ const path = findFolderPath(folderStructure, currentFolderId);
37
+ const current = path?.at(-1);
38
+ // The tree has not loaded yet, or no longer holds the folder (deleted
39
+ // elsewhere — `useAssetsList` sends the list back to the root on its own).
40
+ if (!path || !current) {
41
+ return null;
42
+ }
43
+ const ancestors = path.slice(0, -1);
44
+ const isCollapsed = path.length > MAX_VISIBLE_FOLDERS;
45
+ const leading = isCollapsed ? ancestors.slice(0, 1) : ancestors;
46
+ const hidden = isCollapsed ? ancestors.slice(1, -1) : [];
47
+ const trailing = isCollapsed ? ancestors.slice(-1) : [];
48
+ const renderLink = (folder)=>/*#__PURE__*/ jsx(CrumbButton, {
49
+ type: "button",
50
+ onClick: ()=>onSelectFolder(folder.id ?? null),
51
+ children: folder.name
52
+ }, folder.id);
53
+ return /*#__PURE__*/ jsxs(Breadcrumbs, {
54
+ label: formatMessage({
55
+ id: getTranslationKey('asset-picker.breadcrumbs.label'),
56
+ defaultMessage: 'Folder navigation'
57
+ }),
58
+ children: [
59
+ /*#__PURE__*/ jsx(CrumbButton, {
60
+ type: "button",
61
+ onClick: ()=>onSelectFolder(null),
62
+ children: formatMessage({
63
+ id: getTranslationKey('plugin.home'),
64
+ defaultMessage: 'Home'
65
+ })
66
+ }),
67
+ leading.map(renderLink),
68
+ hidden.length > 0 && /*#__PURE__*/ jsx(CrumbSimpleMenu, {
69
+ "aria-label": formatMessage({
70
+ id: getTranslationKey('asset-picker.breadcrumbs.more'),
71
+ defaultMessage: 'Show more folders'
72
+ }),
73
+ label: "…",
74
+ children: hidden.map((folder)=>/*#__PURE__*/ jsx(MenuItem, {
75
+ onSelect: ()=>onSelectFolder(folder.id ?? null),
76
+ children: folder.name
77
+ }, folder.id))
78
+ }),
79
+ trailing.map(renderLink),
80
+ /*#__PURE__*/ jsx(Crumb, {
81
+ isCurrent: true,
82
+ children: current.name
83
+ })
84
+ ]
85
+ });
86
+ };
87
+
88
+ export { FolderBreadcrumbs };
89
+ //# sourceMappingURL=FolderBreadcrumbs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderBreadcrumbs.mjs","sources":["../../../../admin/src/components/AssetPickerDialog/FolderBreadcrumbs.tsx"],"sourcesContent":["import { Breadcrumbs, Crumb, CrumbSimpleMenu, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../services/folders';\nimport { findFolderPath } from '../../utils/findFolderPath';\nimport { getTranslationKey } from '../../utils/translations';\n\n// Past this many folders, the ones between the first and the parent collapse\n// into a menu, so a deep tree doesn't wrap the trail over several lines.\nconst MAX_VISIBLE_FOLDERS = 3;\n\n// `CrumbLink`'s look on a real button. `CrumbLink` only renders an anchor, and\n// one without an `href` is neither announced as a button nor reachable by Tab.\nconst CrumbButton = styled.button`\n border: none;\n background: none;\n cursor: pointer;\n border-radius: ${({ theme }) => theme.borderRadius};\n color: ${({ theme }) => theme.colors.neutral600};\n font-size: ${({ theme }) => theme.fontSizes[1]};\n line-height: ${({ theme }) => theme.lineHeights[4]};\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n\n &:hover,\n &:focus-visible {\n background-color: ${({ theme }) => theme.colors.neutral200};\n color: ${({ theme }) => theme.colors.neutral700};\n }\n`;\n\ninterface FolderBreadcrumbsProps {\n currentFolderId: number;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Home › … › parent › current. Every crumb but the current folder navigates,\n * so a user deep in the tree can climb back without a sidebar.\n */\nexport const FolderBreadcrumbs = ({ currentFolderId, onSelectFolder }: FolderBreadcrumbsProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n\n const path = findFolderPath(folderStructure, currentFolderId);\n const current = path?.at(-1);\n\n // The tree has not loaded yet, or no longer holds the folder (deleted\n // elsewhere — `useAssetsList` sends the list back to the root on its own).\n if (!path || !current) {\n return null;\n }\n\n const ancestors = path.slice(0, -1);\n const isCollapsed = path.length > MAX_VISIBLE_FOLDERS;\n const leading = isCollapsed ? ancestors.slice(0, 1) : ancestors;\n const hidden = isCollapsed ? ancestors.slice(1, -1) : [];\n const trailing = isCollapsed ? ancestors.slice(-1) : [];\n\n const renderLink = (folder: (typeof path)[number]) => (\n <CrumbButton key={folder.id} type=\"button\" onClick={() => onSelectFolder(folder.id ?? null)}>\n {folder.name}\n </CrumbButton>\n );\n\n return (\n <Breadcrumbs\n label={formatMessage({\n id: getTranslationKey('asset-picker.breadcrumbs.label'),\n defaultMessage: 'Folder navigation',\n })}\n >\n <CrumbButton type=\"button\" onClick={() => onSelectFolder(null)}>\n {formatMessage({ id: getTranslationKey('plugin.home'), defaultMessage: 'Home' })}\n </CrumbButton>\n {leading.map(renderLink)}\n {hidden.length > 0 && (\n <CrumbSimpleMenu\n aria-label={formatMessage({\n id: getTranslationKey('asset-picker.breadcrumbs.more'),\n defaultMessage: 'Show more folders',\n })}\n label=\"…\"\n >\n {hidden.map((folder) => (\n <MenuItem key={folder.id} onSelect={() => onSelectFolder(folder.id ?? null)}>\n {folder.name}\n </MenuItem>\n ))}\n </CrumbSimpleMenu>\n )}\n {trailing.map(renderLink)}\n <Crumb isCurrent>{current.name}</Crumb>\n </Breadcrumbs>\n );\n};\n"],"names":["MAX_VISIBLE_FOLDERS","CrumbButton","styled","button","theme","borderRadius","colors","neutral600","fontSizes","lineHeights","spaces","neutral200","neutral700","FolderBreadcrumbs","currentFolderId","onSelectFolder","formatMessage","useIntl","data","folderStructure","useGetFolderStructureQuery","path","findFolderPath","current","at","ancestors","slice","isCollapsed","length","leading","hidden","trailing","renderLink","folder","_jsx","type","onClick","id","name","_jsxs","Breadcrumbs","label","getTranslationKey","defaultMessage","map","CrumbSimpleMenu","aria-label","MenuItem","onSelect","Crumb","isCurrent"],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var useAssetSelection = require('../../pages/Assets/hooks/useAssetSelection.js');
6
+ var selection = require('../../pages/Assets/utils/selection.js');
7
+ var isAllowedAssetType = require('../../utils/isAllowedAssetType.js');
8
+ var pickerSelection = require('./pickerSelection.js');
9
+
10
+ const PickerSelectionContext = /*#__PURE__*/ React.createContext(null);
11
+ const usePickerSelection = ()=>{
12
+ const context = React.useContext(PickerSelectionContext);
13
+ if (!context) {
14
+ throw new Error('usePickerSelection must be used within a PickerSelectionProvider');
15
+ }
16
+ return context;
17
+ };
18
+ const parseAssetId = (key)=>{
19
+ const [kind, id] = key.split(':');
20
+ return kind === 'asset' ? Number(id) : null;
21
+ };
22
+ const NO_FOLDERS = new Set();
23
+ /**
24
+ * The Content Manager picker's selection, behind the same `AssetSelection`
25
+ * interface the Media Library views read: only assets are selectable, assets
26
+ * outside `allowedTypes` are shown but cannot be picked, and the selection
27
+ * survives folder changes, search, filters and sort.
28
+ */ const PickerSelectionProvider = ({ children, initialSelection, multiple, allowedTypes, knownFiles })=>{
29
+ const [selection$1, setSelection] = React.useState(initialSelection);
30
+ const filesById = React.useMemo(()=>{
31
+ const map = new Map();
32
+ [
33
+ ...knownFiles,
34
+ ...selection$1
35
+ ].forEach((file)=>map.set(file.id, file));
36
+ return map;
37
+ }, [
38
+ knownFiles,
39
+ selection$1
40
+ ]);
41
+ const selectedIds = React.useMemo(()=>new Set(selection$1.map((file)=>file.id)), [
42
+ selection$1
43
+ ]);
44
+ const resolveSelectableFile = React.useCallback((key)=>{
45
+ const id = parseAssetId(key);
46
+ const file = id === null ? undefined : filesById.get(id);
47
+ return file && isAllowedAssetType.isAllowedAssetType(allowedTypes, file.mime) ? file : null;
48
+ }, [
49
+ allowedTypes,
50
+ filesById
51
+ ]);
52
+ const getSelectability = React.useCallback((key)=>{
53
+ const id = parseAssetId(key);
54
+ if (id === null) {
55
+ return 'hidden';
56
+ }
57
+ // `allowedTypes` only stops adding an asset. One the field already holds,
58
+ // for example from before the schema was narrowed, must stay removable.
59
+ if (selectedIds.has(id)) {
60
+ return 'enabled';
61
+ }
62
+ const file = filesById.get(id);
63
+ return file && !isAllowedAssetType.isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';
64
+ }, [
65
+ allowedTypes,
66
+ filesById,
67
+ selectedIds
68
+ ]);
69
+ const toggle = React.useCallback((key)=>{
70
+ const id = parseAssetId(key);
71
+ if (id !== null && selectedIds.has(id)) {
72
+ setSelection((prev)=>pickerSelection.removeFile(prev, id));
73
+ return;
74
+ }
75
+ const file = resolveSelectableFile(key);
76
+ if (file) {
77
+ setSelection((prev)=>pickerSelection.toggleFile(prev, file, {
78
+ multiple
79
+ }));
80
+ }
81
+ }, [
82
+ multiple,
83
+ resolveSelectableFile,
84
+ selectedIds
85
+ ]);
86
+ // Select-all over the assets on screen that can be picked, appended in their
87
+ // on-screen order. Only a multiple-value field offers it.
88
+ const selectAll = React.useCallback((orderedKeys)=>{
89
+ if (!multiple) {
90
+ return;
91
+ }
92
+ const files = orderedKeys.map((key)=>resolveSelectableFile(key)).filter((file)=>file !== null);
93
+ setSelection((prev)=>pickerSelection.addFiles(prev, files));
94
+ }, [
95
+ multiple,
96
+ resolveSelectableFile
97
+ ]);
98
+ const selectOnly = React.useCallback((key)=>{
99
+ const file = resolveSelectableFile(key);
100
+ if (file) {
101
+ setSelection([
102
+ file
103
+ ]);
104
+ }
105
+ }, [
106
+ resolveSelectableFile
107
+ ]);
108
+ const deselect = React.useCallback((key)=>{
109
+ const id = parseAssetId(key);
110
+ if (id !== null) {
111
+ setSelection((prev)=>pickerSelection.removeFile(prev, id));
112
+ }
113
+ }, []);
114
+ const deselectAll = React.useCallback((orderedKeys)=>{
115
+ const ids = new Set(orderedKeys.map((key)=>parseAssetId(key)).filter((id)=>id !== null));
116
+ setSelection((prev)=>pickerSelection.removeFiles(prev, ids));
117
+ }, []);
118
+ const clear = React.useCallback(()=>setSelection([]), []);
119
+ const selectedKeys = React.useMemo(()=>new Set(selection$1.map((file)=>selection.assetKey(file.id))), [
120
+ selection$1
121
+ ]);
122
+ const isSelected = React.useCallback((key)=>{
123
+ const id = parseAssetId(key);
124
+ return id !== null && pickerSelection.hasFile(selection$1, id);
125
+ }, [
126
+ selection$1
127
+ ]);
128
+ const assetSelection = React.useMemo(()=>({
129
+ isEnabled: true,
130
+ // A single-value field holds one asset: nothing to select all of.
131
+ canSelectAll: multiple,
132
+ getSelectability,
133
+ selectedKeys,
134
+ selectedIds,
135
+ selectedFolderIds: NO_FOLDERS,
136
+ anchorKey: null,
137
+ isSelected,
138
+ toggle,
139
+ // Picking is one asset at a time; a Shift+click range picks the target.
140
+ selectRange: (_orderedKeys, targetKey)=>toggle(targetKey),
141
+ selectAll,
142
+ selectOnly,
143
+ deselect,
144
+ deselectAll,
145
+ clear
146
+ }), [
147
+ multiple,
148
+ getSelectability,
149
+ selectedKeys,
150
+ selectedIds,
151
+ isSelected,
152
+ toggle,
153
+ selectAll,
154
+ selectOnly,
155
+ deselect,
156
+ deselectAll,
157
+ clear
158
+ ]);
159
+ const moveSelectedFile = React.useCallback((activeId, overId)=>setSelection((prev)=>pickerSelection.moveFile(prev, activeId, overId)), []);
160
+ const pickerSelection$1 = React.useMemo(()=>({
161
+ selection: selection$1,
162
+ moveFile: moveSelectedFile
163
+ }), [
164
+ selection$1,
165
+ moveSelectedFile
166
+ ]);
167
+ return /*#__PURE__*/ jsxRuntime.jsx(PickerSelectionContext.Provider, {
168
+ value: pickerSelection$1,
169
+ children: /*#__PURE__*/ jsxRuntime.jsx(useAssetSelection.AssetSelectionContext.Provider, {
170
+ value: assetSelection,
171
+ children: children
172
+ })
173
+ });
174
+ };
175
+
176
+ exports.PickerSelectionProvider = PickerSelectionProvider;
177
+ exports.usePickerSelection = usePickerSelection;
178
+ //# sourceMappingURL=PickerSelectionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickerSelectionProvider.js","sources":["../../../../admin/src/components/AssetPickerDialog/PickerSelectionProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n AssetSelectionContext,\n type AssetSelection,\n type Selectability,\n} from '../../pages/Assets/hooks/useAssetSelection';\nimport { assetKey, type ItemKey } from '../../pages/Assets/utils/selection';\nimport { isAllowedAssetType, type MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\nimport {\n addFiles,\n hasFile,\n moveFile,\n removeFile,\n removeFiles,\n toggleFile,\n type PickerSelection,\n} from './pickerSelection';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface PickerSelectionContextValue {\n selection: PickerSelection;\n moveFile: (activeId: number, overId: number) => void;\n}\n\nconst PickerSelectionContext = createContext<PickerSelectionContextValue | null>(null);\n\nexport const usePickerSelection = () => {\n const context = useContext(PickerSelectionContext);\n\n if (!context) {\n throw new Error('usePickerSelection must be used within a PickerSelectionProvider');\n }\n\n return context;\n};\n\nconst parseAssetId = (key: ItemKey): number | null => {\n const [kind, id] = key.split(':');\n\n return kind === 'asset' ? Number(id) : null;\n};\n\nconst NO_FOLDERS = new Set<number>();\n\ninterface PickerSelectionProviderProps {\n children: ReactNode;\n initialSelection: File[];\n multiple: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n /**\n * The assets on screen. Views select by key, but the selection keeps whole\n * files, so a newly picked key is resolved against these.\n */\n knownFiles: File[];\n}\n\n/**\n * The Content Manager picker's selection, behind the same `AssetSelection`\n * interface the Media Library views read: only assets are selectable, assets\n * outside `allowedTypes` are shown but cannot be picked, and the selection\n * survives folder changes, search, filters and sort.\n */\nexport const PickerSelectionProvider = ({\n children,\n initialSelection,\n multiple,\n allowedTypes,\n knownFiles,\n}: PickerSelectionProviderProps) => {\n const [selection, setSelection] = useState<PickerSelection>(initialSelection);\n\n const filesById = useMemo(() => {\n const map = new Map<number, File>();\n [...knownFiles, ...selection].forEach((file) => map.set(file.id, file));\n return map;\n }, [knownFiles, selection]);\n\n const selectedIds = useMemo(() => new Set(selection.map((file) => file.id)), [selection]);\n\n const resolveSelectableFile = useCallback(\n (key: ItemKey): File | null => {\n const id = parseAssetId(key);\n const file = id === null ? undefined : filesById.get(id);\n\n return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;\n },\n [allowedTypes, filesById]\n );\n\n const getSelectability = useCallback(\n (key: ItemKey): Selectability => {\n const id = parseAssetId(key);\n\n if (id === null) {\n return 'hidden';\n }\n\n // `allowedTypes` only stops adding an asset. One the field already holds,\n // for example from before the schema was narrowed, must stay removable.\n if (selectedIds.has(id)) {\n return 'enabled';\n }\n\n const file = filesById.get(id);\n\n return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';\n },\n [allowedTypes, filesById, selectedIds]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null && selectedIds.has(id)) {\n setSelection((prev) => removeFile(prev, id));\n return;\n }\n\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection((prev) => toggleFile(prev, file, { multiple }));\n }\n },\n [multiple, resolveSelectableFile, selectedIds]\n );\n\n // Select-all over the assets on screen that can be picked, appended in their\n // on-screen order. Only a multiple-value field offers it.\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (!multiple) {\n return;\n }\n\n const files = orderedKeys\n .map((key) => resolveSelectableFile(key))\n .filter((file): file is File => file !== null);\n\n setSelection((prev) => addFiles(prev, files));\n },\n [multiple, resolveSelectableFile]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection([file]);\n }\n },\n [resolveSelectableFile]\n );\n\n const deselect = useCallback((key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null) {\n setSelection((prev) => removeFile(prev, id));\n }\n }, []);\n\n const deselectAll = useCallback((orderedKeys: ItemKey[]) => {\n const ids = new Set(\n orderedKeys.map((key) => parseAssetId(key)).filter((id): id is number => id !== null)\n );\n\n setSelection((prev) => removeFiles(prev, ids));\n }, []);\n\n const clear = useCallback(() => setSelection([]), []);\n\n const selectedKeys = useMemo(\n () => new Set(selection.map((file) => assetKey(file.id))),\n [selection]\n );\n\n const isSelected = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n return id !== null && hasFile(selection, id);\n },\n [selection]\n );\n\n const assetSelection = useMemo<AssetSelection>(\n () => ({\n isEnabled: true,\n // A single-value field holds one asset: nothing to select all of.\n canSelectAll: multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n selectedFolderIds: NO_FOLDERS,\n anchorKey: null,\n isSelected,\n toggle,\n // Picking is one asset at a time; a Shift+click range picks the target.\n selectRange: (_orderedKeys, targetKey) => toggle(targetKey),\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n }),\n [\n multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n isSelected,\n toggle,\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n ]\n );\n\n const moveSelectedFile = useCallback(\n (activeId: number, overId: number) => setSelection((prev) => moveFile(prev, activeId, overId)),\n []\n );\n\n const pickerSelection = useMemo(\n () => ({ selection, moveFile: moveSelectedFile }),\n [selection, moveSelectedFile]\n );\n\n return (\n <PickerSelectionContext.Provider value={pickerSelection}>\n <AssetSelectionContext.Provider value={assetSelection}>\n {children}\n </AssetSelectionContext.Provider>\n </PickerSelectionContext.Provider>\n );\n};\n"],"names":["PickerSelectionContext","createContext","usePickerSelection","context","useContext","Error","parseAssetId","key","kind","id","split","Number","NO_FOLDERS","Set","PickerSelectionProvider","children","initialSelection","multiple","allowedTypes","knownFiles","selection","setSelection","useState","filesById","useMemo","map","Map","forEach","file","set","selectedIds","resolveSelectableFile","useCallback","undefined","get","isAllowedAssetType","mime","getSelectability","has","toggle","prev","removeFile","toggleFile","selectAll","orderedKeys","files","filter","addFiles","selectOnly","deselect","deselectAll","ids","removeFiles","clear","selectedKeys","assetKey","isSelected","hasFile","assetSelection","isEnabled","canSelectAll","selectedFolderIds","anchorKey","selectRange","_orderedKeys","targetKey","moveSelectedFile","activeId","overId","moveFile","pickerSelection","_jsx","Provider","value","AssetSelectionContext"],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useMemo, useCallback, useContext, createContext } from 'react';
3
+ import { AssetSelectionContext } from '../../pages/Assets/hooks/useAssetSelection.mjs';
4
+ import { assetKey } from '../../pages/Assets/utils/selection.mjs';
5
+ import { isAllowedAssetType } from '../../utils/isAllowedAssetType.mjs';
6
+ import { removeFile, toggleFile, addFiles, removeFiles, hasFile, moveFile } from './pickerSelection.mjs';
7
+
8
+ const PickerSelectionContext = /*#__PURE__*/ createContext(null);
9
+ const usePickerSelection = ()=>{
10
+ const context = useContext(PickerSelectionContext);
11
+ if (!context) {
12
+ throw new Error('usePickerSelection must be used within a PickerSelectionProvider');
13
+ }
14
+ return context;
15
+ };
16
+ const parseAssetId = (key)=>{
17
+ const [kind, id] = key.split(':');
18
+ return kind === 'asset' ? Number(id) : null;
19
+ };
20
+ const NO_FOLDERS = new Set();
21
+ /**
22
+ * The Content Manager picker's selection, behind the same `AssetSelection`
23
+ * interface the Media Library views read: only assets are selectable, assets
24
+ * outside `allowedTypes` are shown but cannot be picked, and the selection
25
+ * survives folder changes, search, filters and sort.
26
+ */ const PickerSelectionProvider = ({ children, initialSelection, multiple, allowedTypes, knownFiles })=>{
27
+ const [selection, setSelection] = useState(initialSelection);
28
+ const filesById = useMemo(()=>{
29
+ const map = new Map();
30
+ [
31
+ ...knownFiles,
32
+ ...selection
33
+ ].forEach((file)=>map.set(file.id, file));
34
+ return map;
35
+ }, [
36
+ knownFiles,
37
+ selection
38
+ ]);
39
+ const selectedIds = useMemo(()=>new Set(selection.map((file)=>file.id)), [
40
+ selection
41
+ ]);
42
+ const resolveSelectableFile = useCallback((key)=>{
43
+ const id = parseAssetId(key);
44
+ const file = id === null ? undefined : filesById.get(id);
45
+ return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;
46
+ }, [
47
+ allowedTypes,
48
+ filesById
49
+ ]);
50
+ const getSelectability = useCallback((key)=>{
51
+ const id = parseAssetId(key);
52
+ if (id === null) {
53
+ return 'hidden';
54
+ }
55
+ // `allowedTypes` only stops adding an asset. One the field already holds,
56
+ // for example from before the schema was narrowed, must stay removable.
57
+ if (selectedIds.has(id)) {
58
+ return 'enabled';
59
+ }
60
+ const file = filesById.get(id);
61
+ return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';
62
+ }, [
63
+ allowedTypes,
64
+ filesById,
65
+ selectedIds
66
+ ]);
67
+ const toggle = useCallback((key)=>{
68
+ const id = parseAssetId(key);
69
+ if (id !== null && selectedIds.has(id)) {
70
+ setSelection((prev)=>removeFile(prev, id));
71
+ return;
72
+ }
73
+ const file = resolveSelectableFile(key);
74
+ if (file) {
75
+ setSelection((prev)=>toggleFile(prev, file, {
76
+ multiple
77
+ }));
78
+ }
79
+ }, [
80
+ multiple,
81
+ resolveSelectableFile,
82
+ selectedIds
83
+ ]);
84
+ // Select-all over the assets on screen that can be picked, appended in their
85
+ // on-screen order. Only a multiple-value field offers it.
86
+ const selectAll = useCallback((orderedKeys)=>{
87
+ if (!multiple) {
88
+ return;
89
+ }
90
+ const files = orderedKeys.map((key)=>resolveSelectableFile(key)).filter((file)=>file !== null);
91
+ setSelection((prev)=>addFiles(prev, files));
92
+ }, [
93
+ multiple,
94
+ resolveSelectableFile
95
+ ]);
96
+ const selectOnly = useCallback((key)=>{
97
+ const file = resolveSelectableFile(key);
98
+ if (file) {
99
+ setSelection([
100
+ file
101
+ ]);
102
+ }
103
+ }, [
104
+ resolveSelectableFile
105
+ ]);
106
+ const deselect = useCallback((key)=>{
107
+ const id = parseAssetId(key);
108
+ if (id !== null) {
109
+ setSelection((prev)=>removeFile(prev, id));
110
+ }
111
+ }, []);
112
+ const deselectAll = useCallback((orderedKeys)=>{
113
+ const ids = new Set(orderedKeys.map((key)=>parseAssetId(key)).filter((id)=>id !== null));
114
+ setSelection((prev)=>removeFiles(prev, ids));
115
+ }, []);
116
+ const clear = useCallback(()=>setSelection([]), []);
117
+ const selectedKeys = useMemo(()=>new Set(selection.map((file)=>assetKey(file.id))), [
118
+ selection
119
+ ]);
120
+ const isSelected = useCallback((key)=>{
121
+ const id = parseAssetId(key);
122
+ return id !== null && hasFile(selection, id);
123
+ }, [
124
+ selection
125
+ ]);
126
+ const assetSelection = useMemo(()=>({
127
+ isEnabled: true,
128
+ // A single-value field holds one asset: nothing to select all of.
129
+ canSelectAll: multiple,
130
+ getSelectability,
131
+ selectedKeys,
132
+ selectedIds,
133
+ selectedFolderIds: NO_FOLDERS,
134
+ anchorKey: null,
135
+ isSelected,
136
+ toggle,
137
+ // Picking is one asset at a time; a Shift+click range picks the target.
138
+ selectRange: (_orderedKeys, targetKey)=>toggle(targetKey),
139
+ selectAll,
140
+ selectOnly,
141
+ deselect,
142
+ deselectAll,
143
+ clear
144
+ }), [
145
+ multiple,
146
+ getSelectability,
147
+ selectedKeys,
148
+ selectedIds,
149
+ isSelected,
150
+ toggle,
151
+ selectAll,
152
+ selectOnly,
153
+ deselect,
154
+ deselectAll,
155
+ clear
156
+ ]);
157
+ const moveSelectedFile = useCallback((activeId, overId)=>setSelection((prev)=>moveFile(prev, activeId, overId)), []);
158
+ const pickerSelection = useMemo(()=>({
159
+ selection,
160
+ moveFile: moveSelectedFile
161
+ }), [
162
+ selection,
163
+ moveSelectedFile
164
+ ]);
165
+ return /*#__PURE__*/ jsx(PickerSelectionContext.Provider, {
166
+ value: pickerSelection,
167
+ children: /*#__PURE__*/ jsx(AssetSelectionContext.Provider, {
168
+ value: assetSelection,
169
+ children: children
170
+ })
171
+ });
172
+ };
173
+
174
+ export { PickerSelectionProvider, usePickerSelection };
175
+ //# sourceMappingURL=PickerSelectionProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickerSelectionProvider.mjs","sources":["../../../../admin/src/components/AssetPickerDialog/PickerSelectionProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n AssetSelectionContext,\n type AssetSelection,\n type Selectability,\n} from '../../pages/Assets/hooks/useAssetSelection';\nimport { assetKey, type ItemKey } from '../../pages/Assets/utils/selection';\nimport { isAllowedAssetType, type MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\nimport {\n addFiles,\n hasFile,\n moveFile,\n removeFile,\n removeFiles,\n toggleFile,\n type PickerSelection,\n} from './pickerSelection';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface PickerSelectionContextValue {\n selection: PickerSelection;\n moveFile: (activeId: number, overId: number) => void;\n}\n\nconst PickerSelectionContext = createContext<PickerSelectionContextValue | null>(null);\n\nexport const usePickerSelection = () => {\n const context = useContext(PickerSelectionContext);\n\n if (!context) {\n throw new Error('usePickerSelection must be used within a PickerSelectionProvider');\n }\n\n return context;\n};\n\nconst parseAssetId = (key: ItemKey): number | null => {\n const [kind, id] = key.split(':');\n\n return kind === 'asset' ? Number(id) : null;\n};\n\nconst NO_FOLDERS = new Set<number>();\n\ninterface PickerSelectionProviderProps {\n children: ReactNode;\n initialSelection: File[];\n multiple: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n /**\n * The assets on screen. Views select by key, but the selection keeps whole\n * files, so a newly picked key is resolved against these.\n */\n knownFiles: File[];\n}\n\n/**\n * The Content Manager picker's selection, behind the same `AssetSelection`\n * interface the Media Library views read: only assets are selectable, assets\n * outside `allowedTypes` are shown but cannot be picked, and the selection\n * survives folder changes, search, filters and sort.\n */\nexport const PickerSelectionProvider = ({\n children,\n initialSelection,\n multiple,\n allowedTypes,\n knownFiles,\n}: PickerSelectionProviderProps) => {\n const [selection, setSelection] = useState<PickerSelection>(initialSelection);\n\n const filesById = useMemo(() => {\n const map = new Map<number, File>();\n [...knownFiles, ...selection].forEach((file) => map.set(file.id, file));\n return map;\n }, [knownFiles, selection]);\n\n const selectedIds = useMemo(() => new Set(selection.map((file) => file.id)), [selection]);\n\n const resolveSelectableFile = useCallback(\n (key: ItemKey): File | null => {\n const id = parseAssetId(key);\n const file = id === null ? undefined : filesById.get(id);\n\n return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;\n },\n [allowedTypes, filesById]\n );\n\n const getSelectability = useCallback(\n (key: ItemKey): Selectability => {\n const id = parseAssetId(key);\n\n if (id === null) {\n return 'hidden';\n }\n\n // `allowedTypes` only stops adding an asset. One the field already holds,\n // for example from before the schema was narrowed, must stay removable.\n if (selectedIds.has(id)) {\n return 'enabled';\n }\n\n const file = filesById.get(id);\n\n return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';\n },\n [allowedTypes, filesById, selectedIds]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null && selectedIds.has(id)) {\n setSelection((prev) => removeFile(prev, id));\n return;\n }\n\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection((prev) => toggleFile(prev, file, { multiple }));\n }\n },\n [multiple, resolveSelectableFile, selectedIds]\n );\n\n // Select-all over the assets on screen that can be picked, appended in their\n // on-screen order. Only a multiple-value field offers it.\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (!multiple) {\n return;\n }\n\n const files = orderedKeys\n .map((key) => resolveSelectableFile(key))\n .filter((file): file is File => file !== null);\n\n setSelection((prev) => addFiles(prev, files));\n },\n [multiple, resolveSelectableFile]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection([file]);\n }\n },\n [resolveSelectableFile]\n );\n\n const deselect = useCallback((key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null) {\n setSelection((prev) => removeFile(prev, id));\n }\n }, []);\n\n const deselectAll = useCallback((orderedKeys: ItemKey[]) => {\n const ids = new Set(\n orderedKeys.map((key) => parseAssetId(key)).filter((id): id is number => id !== null)\n );\n\n setSelection((prev) => removeFiles(prev, ids));\n }, []);\n\n const clear = useCallback(() => setSelection([]), []);\n\n const selectedKeys = useMemo(\n () => new Set(selection.map((file) => assetKey(file.id))),\n [selection]\n );\n\n const isSelected = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n return id !== null && hasFile(selection, id);\n },\n [selection]\n );\n\n const assetSelection = useMemo<AssetSelection>(\n () => ({\n isEnabled: true,\n // A single-value field holds one asset: nothing to select all of.\n canSelectAll: multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n selectedFolderIds: NO_FOLDERS,\n anchorKey: null,\n isSelected,\n toggle,\n // Picking is one asset at a time; a Shift+click range picks the target.\n selectRange: (_orderedKeys, targetKey) => toggle(targetKey),\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n }),\n [\n multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n isSelected,\n toggle,\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n ]\n );\n\n const moveSelectedFile = useCallback(\n (activeId: number, overId: number) => setSelection((prev) => moveFile(prev, activeId, overId)),\n []\n );\n\n const pickerSelection = useMemo(\n () => ({ selection, moveFile: moveSelectedFile }),\n [selection, moveSelectedFile]\n );\n\n return (\n <PickerSelectionContext.Provider value={pickerSelection}>\n <AssetSelectionContext.Provider value={assetSelection}>\n {children}\n </AssetSelectionContext.Provider>\n </PickerSelectionContext.Provider>\n );\n};\n"],"names":["PickerSelectionContext","createContext","usePickerSelection","context","useContext","Error","parseAssetId","key","kind","id","split","Number","NO_FOLDERS","Set","PickerSelectionProvider","children","initialSelection","multiple","allowedTypes","knownFiles","selection","setSelection","useState","filesById","useMemo","map","Map","forEach","file","set","selectedIds","resolveSelectableFile","useCallback","undefined","get","isAllowedAssetType","mime","getSelectability","has","toggle","prev","removeFile","toggleFile","selectAll","orderedKeys","files","filter","addFiles","selectOnly","deselect","deselectAll","ids","removeFiles","clear","selectedKeys","assetKey","isSelected","hasFile","assetSelection","isEnabled","canSelectAll","selectedFolderIds","anchorKey","selectRange","_orderedKeys","targetKey","moveSelectedFile","activeId","overId","moveFile","pickerSelection","_jsx","Provider","value","AssetSelectionContext"],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var core = require('@dnd-kit/core');
6
+ var sortable = require('@dnd-kit/sortable');
7
+ var utilities = require('@dnd-kit/utilities');
8
+ var reactIntl = require('react-intl');
9
+ var assetSortable = require('../../pages/Assets/components/Dnd/assetSortable.js');
10
+ var translations = require('../../utils/translations.js');
11
+ var PickerSelectionProvider = require('./PickerSelectionProvider.js');
12
+
13
+ /** Module scope, so every item of the list gets the same hook (see `AssetSortableContext`). */ const usePickerSortableAsset = (assetId)=>{
14
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = sortable.useSortable({
15
+ id: assetId
16
+ });
17
+ return {
18
+ setNodeRef,
19
+ isDragging,
20
+ style: {
21
+ transform: utilities.CSS.Transform.toString(transform),
22
+ transition
23
+ },
24
+ // The item drags with the pointer from anywhere; the keyboard starts from the grip.
25
+ listeners: listeners?.onPointerDown ? {
26
+ onPointerDown: listeners.onPointerDown
27
+ } : undefined,
28
+ handle: {
29
+ ...attributes,
30
+ ref: setActivatorNodeRef,
31
+ onKeyDown: (event)=>listeners?.onKeyDown?.(event)
32
+ }
33
+ };
34
+ };
35
+ /**
36
+ * A pointer release over the item it was dragging would also count as a click,
37
+ * which on a selected item un-picks it. Swallow that one click.
38
+ */ const swallowNextClick = ()=>{
39
+ const swallow = (event)=>{
40
+ event.stopPropagation();
41
+ event.preventDefault();
42
+ };
43
+ window.addEventListener('click', swallow, {
44
+ capture: true,
45
+ once: true
46
+ });
47
+ // No click follows a keyboard drop: don't leave the listener behind.
48
+ setTimeout(()=>window.removeEventListener('click', swallow, {
49
+ capture: true
50
+ }), 0);
51
+ };
52
+ /** Makes the picker's selected assets reorderable (the Selected tab is always a grid). */ const SortableSelection = ({ children, onReorderingChange })=>{
53
+ const { formatMessage } = reactIntl.useIntl();
54
+ const { selection, moveFile } = PickerSelectionProvider.usePickerSelection();
55
+ const sensors = core.useSensors(// A few pixels of travel before it counts as a drag, so clicks still pick.
56
+ core.useSensor(core.PointerSensor, {
57
+ activationConstraint: {
58
+ distance: 8
59
+ }
60
+ }), core.useSensor(core.KeyboardSensor, {
61
+ coordinateGetter: sortable.sortableKeyboardCoordinates
62
+ }));
63
+ const ids = React.useMemo(()=>selection.map(({ id })=>id), [
64
+ selection
65
+ ]);
66
+ const announcements = React.useMemo(()=>{
67
+ const describe = (id)=>{
68
+ const index = ids.indexOf(Number(id));
69
+ return {
70
+ name: selection[index]?.name ?? '',
71
+ position: index + 1,
72
+ count: ids.length
73
+ };
74
+ };
75
+ return {
76
+ onDragStart: ({ active })=>formatMessage({
77
+ id: translations.getTranslationKey('list.reorder.picked-up'),
78
+ defaultMessage: 'Picked up {name}. Position {position} of {count}.'
79
+ }, describe(active.id)),
80
+ onDragOver: ({ active, over })=>over ? formatMessage({
81
+ id: translations.getTranslationKey('list.reorder.moved'),
82
+ defaultMessage: '{name} moved to position {position} of {count}.'
83
+ }, {
84
+ ...describe(active.id),
85
+ position: describe(over.id).position
86
+ }) : undefined,
87
+ onDragEnd: ({ active, over })=>formatMessage({
88
+ id: translations.getTranslationKey('list.reorder.dropped'),
89
+ defaultMessage: '{name} dropped at position {position} of {count}.'
90
+ }, {
91
+ ...describe(active.id),
92
+ position: describe((over ?? active).id).position
93
+ }),
94
+ onDragCancel: ({ active })=>formatMessage({
95
+ id: translations.getTranslationKey('list.reorder.cancelled'),
96
+ defaultMessage: 'Reordering cancelled. {name} is back at position {position} of {count}.'
97
+ }, describe(active.id))
98
+ };
99
+ }, [
100
+ formatMessage,
101
+ ids,
102
+ selection
103
+ ]);
104
+ const handleDragEnd = ({ active, over })=>{
105
+ if (active.data.current?.sortable && over) {
106
+ moveFile(Number(active.id), Number(over.id));
107
+ }
108
+ onReorderingChange?.(false);
109
+ swallowNextClick();
110
+ };
111
+ // Escape cancels a pointer drag while the button is still down, so the click
112
+ // that would un-pick the item comes with the release, possibly much later.
113
+ const handleDragCancel = ({ activatorEvent })=>{
114
+ onReorderingChange?.(false);
115
+ if (activatorEvent.type === 'pointerdown') {
116
+ window.addEventListener('pointerup', swallowNextClick, {
117
+ capture: true,
118
+ once: true
119
+ });
120
+ }
121
+ };
122
+ return /*#__PURE__*/ jsxRuntime.jsx(core.DndContext, {
123
+ sensors: sensors,
124
+ collisionDetection: core.closestCenter,
125
+ onDragStart: ()=>onReorderingChange?.(true),
126
+ onDragEnd: handleDragEnd,
127
+ onDragCancel: handleDragCancel,
128
+ accessibility: {
129
+ announcements
130
+ },
131
+ children: /*#__PURE__*/ jsxRuntime.jsx(sortable.SortableContext, {
132
+ items: ids,
133
+ strategy: sortable.rectSortingStrategy,
134
+ children: /*#__PURE__*/ jsxRuntime.jsx(assetSortable.AssetSortableContext.Provider, {
135
+ value: usePickerSortableAsset,
136
+ children: children
137
+ })
138
+ })
139
+ });
140
+ };
141
+
142
+ exports.SortableSelection = SortableSelection;
143
+ //# sourceMappingURL=SortableSelection.js.map