@strapi/upload 5.59.0 → 5.61.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 (295) 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/MediaLibraryPickerDialog.js +29 -0
  10. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
  12. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  14. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  16. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  18. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  20. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  21. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  22. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  23. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  24. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  25. package/dist/admin/components/Drawer.js +12 -7
  26. package/dist/admin/components/Drawer.js.map +1 -1
  27. package/dist/admin/components/Drawer.mjs +12 -7
  28. package/dist/admin/components/Drawer.mjs.map +1 -1
  29. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
  30. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
  31. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
  32. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +9 -4
  34. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
  35. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +9 -4
  36. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
  37. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
  46. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
  47. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
  48. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
  49. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  50. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  52. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
  54. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
  55. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
  56. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
  57. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  58. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  60. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  61. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +163 -111
  62. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  63. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +162 -114
  64. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  65. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  66. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  67. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  68. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  69. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
  70. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
  71. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
  72. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
  73. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  74. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  75. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  76. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  77. package/dist/admin/components/UploadProgressDialog.js +2 -1
  78. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  79. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  80. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  81. package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
  82. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  83. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
  84. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  85. package/dist/admin/index.js +10 -1
  86. package/dist/admin/index.js.map +1 -1
  87. package/dist/admin/index.mjs +10 -1
  88. package/dist/admin/index.mjs.map +1 -1
  89. package/dist/admin/pages/Assets/AssetsPage.js +14 -303
  90. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  91. package/dist/admin/pages/Assets/AssetsPage.mjs +13 -282
  92. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  93. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
  94. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
  95. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  96. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
  97. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  98. package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
  99. package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
  100. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  101. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
  102. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  103. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  104. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  105. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  106. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  107. package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
  108. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  109. package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
  110. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  111. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  112. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  113. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  114. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  115. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
  116. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  117. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  118. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  119. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  120. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  121. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  122. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  123. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  124. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  125. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  126. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  127. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  128. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  129. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  130. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  131. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  132. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  133. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  134. package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
  135. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  136. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  137. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  138. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  139. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  140. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  141. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  142. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  143. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  144. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  145. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  146. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  147. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  148. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  149. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  150. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  151. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  152. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  153. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  154. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  155. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  156. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  157. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  158. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  159. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  160. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  161. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  162. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  163. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  164. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  165. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
  166. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
  167. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
  168. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
  169. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  170. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  171. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  172. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  173. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  174. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  175. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  176. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  177. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  178. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  179. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  180. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  181. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  182. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  183. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  184. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  185. package/dist/admin/services/api.js +92 -7
  186. package/dist/admin/services/api.js.map +1 -1
  187. package/dist/admin/services/api.mjs +91 -9
  188. package/dist/admin/services/api.mjs.map +1 -1
  189. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  190. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  191. package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
  192. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  193. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  194. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  195. package/dist/admin/src/components/Drawer.d.ts +8 -0
  196. package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
  197. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
  198. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  199. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  200. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
  201. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  202. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
  203. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  204. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
  205. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  206. package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
  207. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  208. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
  209. package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
  210. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  211. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  212. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  213. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  214. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  215. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  216. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  217. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  218. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  219. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  220. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  221. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  222. package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
  223. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  224. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  225. package/dist/admin/src/services/api.d.ts +24 -1
  226. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  227. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  228. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  229. package/dist/admin/store/uploadProgress.js +30 -3
  230. package/dist/admin/store/uploadProgress.js.map +1 -1
  231. package/dist/admin/store/uploadProgress.mjs +29 -4
  232. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  233. package/dist/admin/translations/en.json.js +24 -0
  234. package/dist/admin/translations/en.json.js.map +1 -1
  235. package/dist/admin/translations/en.json.mjs +24 -0
  236. package/dist/admin/translations/en.json.mjs.map +1 -1
  237. package/dist/admin/utils/findFolderPath.js +26 -0
  238. package/dist/admin/utils/findFolderPath.js.map +1 -0
  239. package/dist/admin/utils/findFolderPath.mjs +24 -0
  240. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  241. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  242. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  243. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  244. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  245. package/dist/server/audit-logs.js +264 -0
  246. package/dist/server/audit-logs.js.map +1 -0
  247. package/dist/server/audit-logs.mjs +255 -0
  248. package/dist/server/audit-logs.mjs.map +1 -0
  249. package/dist/server/bootstrap.js +4 -0
  250. package/dist/server/bootstrap.js.map +1 -1
  251. package/dist/server/bootstrap.mjs +4 -0
  252. package/dist/server/bootstrap.mjs.map +1 -1
  253. package/dist/server/controllers/admin-folder-file.js +23 -1
  254. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  255. package/dist/server/controllers/admin-folder-file.mjs +23 -1
  256. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  257. package/dist/server/controllers/admin-settings.js +5 -1
  258. package/dist/server/controllers/admin-settings.js.map +1 -1
  259. package/dist/server/controllers/admin-settings.mjs +5 -1
  260. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  261. package/dist/server/services/folder.js +48 -1
  262. package/dist/server/services/folder.js.map +1 -1
  263. package/dist/server/services/folder.mjs +48 -1
  264. package/dist/server/services/folder.mjs.map +1 -1
  265. package/dist/server/services/image-manipulation.js +14 -7
  266. package/dist/server/services/image-manipulation.js.map +1 -1
  267. package/dist/server/services/image-manipulation.mjs +14 -7
  268. package/dist/server/services/image-manipulation.mjs.map +1 -1
  269. package/dist/server/services/upload.js +100 -16
  270. package/dist/server/services/upload.js.map +1 -1
  271. package/dist/server/services/upload.mjs +102 -18
  272. package/dist/server/services/upload.mjs.map +1 -1
  273. package/dist/server/src/audit-logs.d.ts +142 -0
  274. package/dist/server/src/audit-logs.d.ts.map +1 -0
  275. package/dist/server/src/bootstrap.d.ts.map +1 -1
  276. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
  277. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  278. package/dist/server/src/index.d.ts +4 -4
  279. package/dist/server/src/index.d.ts.map +1 -1
  280. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  281. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  282. package/dist/server/src/services/folder.d.ts.map +1 -1
  283. package/dist/server/src/services/image-manipulation.d.ts +4 -4
  284. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  285. package/dist/server/src/services/index.d.ts +4 -4
  286. package/dist/server/src/services/index.d.ts.map +1 -1
  287. package/dist/server/src/services/upload.d.ts.map +1 -1
  288. package/dist/server/src/types.d.ts +63 -12
  289. package/dist/server/src/types.d.ts.map +1 -1
  290. package/package.json +11 -16
  291. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
  292. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
  293. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
  294. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
  295. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
@@ -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,29 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var reactIntl = require('react-intl');
5
+ var translations = require('../../utils/translations.js');
6
+ var AssetPickerDialog = require('./AssetPickerDialog.js');
7
+
8
+ /**
9
+ * The current asset picker behind the `media-library` component. The editors
10
+ * insert assets rather than hold a value, and don't pass a field label, so the
11
+ * title is generic.
12
+ */ const MediaLibraryPickerDialog = ({ allowedTypes, multiple = true, initiallySelectedAssets, onClose, onSelectAssets })=>{
13
+ const { formatMessage } = reactIntl.useIntl();
14
+ return /*#__PURE__*/ jsxRuntime.jsx(AssetPickerDialog.AssetPickerDialog, {
15
+ open: true,
16
+ title: formatMessage({
17
+ id: translations.getTranslationKey('asset-picker.title.insert'),
18
+ defaultMessage: 'Add assets'
19
+ }),
20
+ initialSelection: initiallySelectedAssets,
21
+ multiple: multiple,
22
+ allowedTypes: allowedTypes,
23
+ onClose: onClose,
24
+ onConfirm: onSelectAssets
25
+ });
26
+ };
27
+
28
+ exports.MediaLibraryPickerDialog = MediaLibraryPickerDialog;
29
+ //# sourceMappingURL=MediaLibraryPickerDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPickerDialog.js","sources":["../../../../admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.tsx"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetPickerDialog } from './AssetPickerDialog';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\n/**\n * The `media-library` component contract, which the Wysiwyg and Blocks editors\n * render to insert images. Kept identical to the legacy `MediaLibraryDialog`.\n */\nexport interface MediaLibraryPickerDialogProps {\n allowedTypes?: MediaAllowedTypes;\n multiple?: boolean;\n initiallySelectedAssets?: File[];\n onClose: () => void;\n onSelectAssets: (selectedAssets: File[]) => void;\n}\n\n/**\n * The current asset picker behind the `media-library` component. The editors\n * insert assets rather than hold a value, and don't pass a field label, so the\n * title is generic.\n */\nexport const MediaLibraryPickerDialog = ({\n allowedTypes,\n multiple = true,\n initiallySelectedAssets,\n onClose,\n onSelectAssets,\n}: MediaLibraryPickerDialogProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <AssetPickerDialog\n open\n title={formatMessage({\n id: getTranslationKey('asset-picker.title.insert'),\n defaultMessage: 'Add assets',\n })}\n initialSelection={initiallySelectedAssets}\n multiple={multiple}\n allowedTypes={allowedTypes}\n onClose={onClose}\n onConfirm={onSelectAssets}\n />\n );\n};\n"],"names":["MediaLibraryPickerDialog","allowedTypes","multiple","initiallySelectedAssets","onClose","onSelectAssets","formatMessage","useIntl","_jsx","AssetPickerDialog","open","title","id","getTranslationKey","defaultMessage","initialSelection","onConfirm"],"mappings":";;;;;;;AAqBA;;;;AAIC,IACM,MAAMA,wBAAAA,GAA2B,CAAC,EACvCC,YAAY,EACZC,QAAAA,GAAW,IAAI,EACfC,uBAAuB,EACvBC,OAAO,EACPC,cAAc,EACgB,GAAA;IAC9B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEC,cAAA,CAACC,mCAAAA,EAAAA;QACCC,IAAI,EAAA,IAAA;AACJC,QAAAA,KAAAA,EAAOL,aAAAA,CAAc;AACnBM,YAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,2BAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAC,gBAAAA,EAAkBZ,uBAAAA;QAClBD,QAAAA,EAAUA,QAAAA;QACVD,YAAAA,EAAcA,YAAAA;QACdG,OAAAA,EAASA,OAAAA;QACTY,SAAAA,EAAWX;;AAGjB;;;;"}
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useIntl } from 'react-intl';
3
+ import { getTranslationKey } from '../../utils/translations.mjs';
4
+ import { AssetPickerDialog } from './AssetPickerDialog.mjs';
5
+
6
+ /**
7
+ * The current asset picker behind the `media-library` component. The editors
8
+ * insert assets rather than hold a value, and don't pass a field label, so the
9
+ * title is generic.
10
+ */ const MediaLibraryPickerDialog = ({ allowedTypes, multiple = true, initiallySelectedAssets, onClose, onSelectAssets })=>{
11
+ const { formatMessage } = useIntl();
12
+ return /*#__PURE__*/ jsx(AssetPickerDialog, {
13
+ open: true,
14
+ title: formatMessage({
15
+ id: getTranslationKey('asset-picker.title.insert'),
16
+ defaultMessage: 'Add assets'
17
+ }),
18
+ initialSelection: initiallySelectedAssets,
19
+ multiple: multiple,
20
+ allowedTypes: allowedTypes,
21
+ onClose: onClose,
22
+ onConfirm: onSelectAssets
23
+ });
24
+ };
25
+
26
+ export { MediaLibraryPickerDialog };
27
+ //# sourceMappingURL=MediaLibraryPickerDialog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPickerDialog.mjs","sources":["../../../../admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.tsx"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetPickerDialog } from './AssetPickerDialog';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\n/**\n * The `media-library` component contract, which the Wysiwyg and Blocks editors\n * render to insert images. Kept identical to the legacy `MediaLibraryDialog`.\n */\nexport interface MediaLibraryPickerDialogProps {\n allowedTypes?: MediaAllowedTypes;\n multiple?: boolean;\n initiallySelectedAssets?: File[];\n onClose: () => void;\n onSelectAssets: (selectedAssets: File[]) => void;\n}\n\n/**\n * The current asset picker behind the `media-library` component. The editors\n * insert assets rather than hold a value, and don't pass a field label, so the\n * title is generic.\n */\nexport const MediaLibraryPickerDialog = ({\n allowedTypes,\n multiple = true,\n initiallySelectedAssets,\n onClose,\n onSelectAssets,\n}: MediaLibraryPickerDialogProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <AssetPickerDialog\n open\n title={formatMessage({\n id: getTranslationKey('asset-picker.title.insert'),\n defaultMessage: 'Add assets',\n })}\n initialSelection={initiallySelectedAssets}\n multiple={multiple}\n allowedTypes={allowedTypes}\n onClose={onClose}\n onConfirm={onSelectAssets}\n />\n );\n};\n"],"names":["MediaLibraryPickerDialog","allowedTypes","multiple","initiallySelectedAssets","onClose","onSelectAssets","formatMessage","useIntl","_jsx","AssetPickerDialog","open","title","id","getTranslationKey","defaultMessage","initialSelection","onConfirm"],"mappings":";;;;;AAqBA;;;;AAIC,IACM,MAAMA,wBAAAA,GAA2B,CAAC,EACvCC,YAAY,EACZC,QAAAA,GAAW,IAAI,EACfC,uBAAuB,EACvBC,OAAO,EACPC,cAAc,EACgB,GAAA;IAC9B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,qBACEC,GAAA,CAACC,iBAAAA,EAAAA;QACCC,IAAI,EAAA,IAAA;AACJC,QAAAA,KAAAA,EAAOL,aAAAA,CAAc;AACnBM,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAC,gBAAAA,EAAkBZ,uBAAAA;QAClBD,QAAAA,EAAUA,QAAAA;QACVD,YAAAA,EAAcA,YAAAA;QACdG,OAAAA,EAASA,OAAAA;QACTY,SAAAA,EAAWX;;AAGjB;;;;"}
@@ -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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"}