@strapi/upload 5.51.0 → 5.51.2

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 (346) hide show
  1. package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
  2. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  3. package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
  4. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  5. package/dist/admin/components/TableList/TableList.js +1 -1
  6. package/dist/admin/components/TableList/TableList.js.map +1 -1
  7. package/dist/admin/components/TableList/TableList.mjs +1 -1
  8. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  9. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
  10. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  11. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
  12. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  13. package/dist/admin/future/components/Drawer.js +3 -1
  14. package/dist/admin/future/components/Drawer.js.map +1 -1
  15. package/dist/admin/future/components/Drawer.mjs +3 -1
  16. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  17. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  18. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  19. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  20. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  21. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  22. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  23. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  24. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/AssetsPage.js +344 -150
  26. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/AssetsPage.mjs +343 -149
  28. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
  30. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
  32. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  33. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
  34. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  35. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
  36. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  37. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -19
  38. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -20
  40. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
  42. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
  44. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetsTable.js +218 -37
  46. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  47. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +219 -38
  48. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  49. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +370 -0
  50. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
  51. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +368 -0
  52. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
  53. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
  54. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
  55. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
  56. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -0
  57. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  58. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  59. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  60. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  61. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +129 -37
  62. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +131 -39
  64. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
  66. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
  68. package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
  70. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
  72. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
  74. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
  76. package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
  78. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
  80. package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
  82. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  83. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
  84. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  85. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
  86. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
  87. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
  88. package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
  89. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  90. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  92. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  94. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  96. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/components/FilterBadges.js +408 -0
  98. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  99. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
  100. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  101. package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
  102. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  103. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
  104. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  105. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +195 -40
  106. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +198 -43
  108. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
  110. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
  112. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
  114. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
  116. package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/components/SortMenu.js +154 -0
  118. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
  119. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +152 -0
  120. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
  121. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  122. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  124. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +75 -0
  126. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
  127. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +71 -0
  128. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -0
  129. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  130. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  131. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  132. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  133. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -4
  134. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  135. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
  136. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  137. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  138. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  139. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  140. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  141. package/dist/admin/future/pages/Assets/hooks/useListSort.js +124 -0
  142. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
  143. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
  144. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -0
  145. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  146. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  147. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  148. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  149. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +29 -0
  150. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
  151. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
  152. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
  153. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
  154. package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
  155. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
  156. package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
  157. package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
  158. package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
  159. package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
  160. package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
  161. package/dist/admin/future/services/api.js +163 -28
  162. package/dist/admin/future/services/api.js.map +1 -1
  163. package/dist/admin/future/services/api.mjs +163 -30
  164. package/dist/admin/future/services/api.mjs.map +1 -1
  165. package/dist/admin/future/services/assets.js +62 -18
  166. package/dist/admin/future/services/assets.js.map +1 -1
  167. package/dist/admin/future/services/assets.mjs +62 -19
  168. package/dist/admin/future/services/assets.mjs.map +1 -1
  169. package/dist/admin/future/services/folders.js +31 -19
  170. package/dist/admin/future/services/folders.js.map +1 -1
  171. package/dist/admin/future/services/folders.mjs +31 -19
  172. package/dist/admin/future/services/folders.mjs.map +1 -1
  173. package/dist/admin/future/services/settings.js +10 -3
  174. package/dist/admin/future/services/settings.js.map +1 -1
  175. package/dist/admin/future/services/settings.mjs +10 -3
  176. package/dist/admin/future/services/settings.mjs.map +1 -1
  177. package/dist/admin/future/store/uploadProgress.js +109 -2
  178. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  179. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  180. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  181. package/dist/admin/future/utils/buildDragSetFromSelection.js +33 -0
  182. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
  183. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
  184. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
  185. package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
  186. package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
  187. package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
  188. package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
  189. package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
  190. package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
  191. package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
  192. package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
  193. package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
  194. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
  195. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
  196. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
  197. package/dist/admin/future/utils/getFolderLabel.js +31 -0
  198. package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
  199. package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
  200. package/dist/admin/future/utils/getFolderLabel.mjs.map +1 -0
  201. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  202. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  203. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  204. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  205. package/dist/admin/hooks/useSelectionState.js +2 -4
  206. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  207. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  208. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  209. package/dist/admin/shared/constants.js +43 -0
  210. package/dist/admin/shared/constants.js.map +1 -0
  211. package/dist/admin/shared/constants.mjs +38 -0
  212. package/dist/admin/shared/constants.mjs.map +1 -0
  213. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  214. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  215. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  216. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
  217. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -0
  218. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
  219. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  220. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
  221. package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
  222. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
  223. package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
  224. package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
  225. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
  226. package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
  227. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  228. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  229. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +6 -0
  230. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
  231. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  232. package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
  233. package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
  234. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +23 -0
  235. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  236. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +46 -0
  237. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
  238. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  239. package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -0
  240. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  241. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +29 -0
  242. package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
  243. package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
  244. package/dist/admin/src/future/services/api.d.ts +53 -5
  245. package/dist/admin/src/future/services/assets.d.ts +13 -2
  246. package/dist/admin/src/future/services/folders.d.ts +7 -1
  247. package/dist/admin/src/future/services/settings.d.ts +2 -2
  248. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  249. package/dist/admin/src/future/types/dnd.d.ts +5 -0
  250. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
  251. package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
  252. package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
  253. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
  254. package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -0
  255. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  256. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  257. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  258. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  259. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  260. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  261. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  262. package/dist/admin/translations/en.json.js +85 -2
  263. package/dist/admin/translations/en.json.js.map +1 -1
  264. package/dist/admin/translations/en.json.mjs +85 -2
  265. package/dist/admin/translations/en.json.mjs.map +1 -1
  266. package/dist/admin/utils/urlYupSchema.js +33 -9
  267. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  268. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  269. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  270. package/dist/server/config.js +13 -5
  271. package/dist/server/config.js.map +1 -1
  272. package/dist/server/config.mjs +13 -5
  273. package/dist/server/config.mjs.map +1 -1
  274. package/dist/server/constants.js.map +1 -1
  275. package/dist/server/constants.mjs.map +1 -1
  276. package/dist/server/controllers/admin-file.js +30 -0
  277. package/dist/server/controllers/admin-file.js.map +1 -1
  278. package/dist/server/controllers/admin-file.mjs +30 -0
  279. package/dist/server/controllers/admin-file.mjs.map +1 -1
  280. package/dist/server/controllers/admin-settings.js +20 -2
  281. package/dist/server/controllers/admin-settings.js.map +1 -1
  282. package/dist/server/controllers/admin-settings.mjs +21 -3
  283. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  284. package/dist/server/controllers/content-api.js +1 -2
  285. package/dist/server/controllers/content-api.js.map +1 -1
  286. package/dist/server/controllers/content-api.mjs +2 -2
  287. package/dist/server/controllers/content-api.mjs.map +1 -1
  288. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  289. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  290. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  291. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  292. package/dist/server/controllers/validation/admin/settings.js +4 -1
  293. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  294. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  295. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  296. package/dist/server/routes/admin.js +18 -0
  297. package/dist/server/routes/admin.js.map +1 -1
  298. package/dist/server/routes/admin.mjs +18 -0
  299. package/dist/server/routes/admin.mjs.map +1 -1
  300. package/dist/server/services/ai-metadata.js +108 -11
  301. package/dist/server/services/ai-metadata.js.map +1 -1
  302. package/dist/server/services/ai-metadata.mjs +108 -11
  303. package/dist/server/services/ai-metadata.mjs.map +1 -1
  304. package/dist/server/services/file.js +86 -13
  305. package/dist/server/services/file.js.map +1 -1
  306. package/dist/server/services/file.mjs +87 -14
  307. package/dist/server/services/file.mjs.map +1 -1
  308. package/dist/server/services/image-manipulation.js +4 -4
  309. package/dist/server/services/image-manipulation.js.map +1 -1
  310. package/dist/server/services/image-manipulation.mjs +4 -4
  311. package/dist/server/services/image-manipulation.mjs.map +1 -1
  312. package/dist/server/shared/constants.js +43 -0
  313. package/dist/server/shared/constants.js.map +1 -0
  314. package/dist/server/shared/constants.mjs +38 -0
  315. package/dist/server/shared/constants.mjs.map +1 -0
  316. package/dist/server/src/config.d.ts +2 -0
  317. package/dist/server/src/config.d.ts.map +1 -1
  318. package/dist/server/src/constants.d.ts +2 -1
  319. package/dist/server/src/constants.d.ts.map +1 -1
  320. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  321. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  322. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  323. package/dist/server/src/controllers/index.d.ts +1 -0
  324. package/dist/server/src/controllers/index.d.ts.map +1 -1
  325. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  326. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  327. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  328. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  329. package/dist/server/src/index.d.ts +7 -1
  330. package/dist/server/src/index.d.ts.map +1 -1
  331. package/dist/server/src/routes/admin.d.ts.map +1 -1
  332. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  333. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  334. package/dist/server/src/services/file.d.ts +12 -2
  335. package/dist/server/src/services/file.d.ts.map +1 -1
  336. package/dist/server/src/services/index.d.ts +4 -1
  337. package/dist/server/src/services/index.d.ts.map +1 -1
  338. package/dist/server/src/types.d.ts +3 -0
  339. package/dist/server/src/types.d.ts.map +1 -1
  340. package/dist/shared/constants.d.ts +35 -0
  341. package/dist/shared/constants.d.ts.map +1 -0
  342. package/dist/shared/contracts/files.d.ts +25 -0
  343. package/dist/shared/contracts/files.d.ts.map +1 -1
  344. package/dist/shared/contracts/folders.d.ts +1 -1
  345. package/dist/shared/contracts/settings.d.ts +7 -0
  346. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkMoveDialog.js","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\n/**\n * \"Move elements to\" modal for the bulk actions bar. Moves the current\n * selection (assets and/or folders) into the picked destination folder via\n * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,\n * folder list and the sidebar folder-structure, so both panes refresh on\n * success. On failure the modal stays open so the user can retry or cancel.\n */\nexport const BulkMoveDialog = ({ open, onClose }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const { currentFolderId } = useFolderNavigation();\n const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, { skip: !open });\n const { data: currentFolder } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n useEffect(() => {\n if (open) {\n setDestination('');\n }\n }, [open]);\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Reconstruct the selection as a drag set so the dialog validates destinations\n // through the exact same canonical predicate as the DnD highlight.\n const dragSet = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId),\n [selectedIds, selectedFolderIds, currentFolderId]\n );\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. Selected folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The current folder (where the items already live)\n // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op\n // move. Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, selectedFolderIds).filter((option) =>\n canDropItemOnFolder({ items: dragSet, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, selectedFolderIds, dragSet]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items: dragSet, targetFolderId: null, folderStructure }),\n [dragSet, folderStructure]\n );\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const handleMove = async () => {\n if (isMoving) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n destinationFolderId,\n }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n const sourceName = currentFolderId === null ? rootLabel : (currentFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.move.success'),\n defaultMessage:\n '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}',\n },\n { count, source: sourceName, destination: destinationName }\n ),\n });\n clear();\n onClose();\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleMove} loading={isMoving}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","formatMessage","useIntl","toggleNotification","useNotification","selectedIds","selectedFolderIds","clear","useAssetSelection","currentFolderId","useFolderNavigation","data","folderStructure","useGetFolderStructureQuery","undefined","skip","currentFolder","useGetFolderQuery","id","bulkMove","isLoading","isMoving","useBulkMoveMutation","destination","setDestination","useState","useEffect","rootLabel","getTranslationKey","defaultMessage","dragSet","useMemo","buildDragSetFromSelection","destinationOptions","flattenFolderStructure","filter","option","canDropItemOnFolder","items","targetFolderId","canMoveToRoot","count","size","handleMove","destinationFolderId","Number","fileIds","Array","from","folderIds","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","source","_jsx","Root","onOpenChange","nextOpen","_jsxs","Header","Title","Body","Field","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","map","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { useNotification } from '@strapi/admin/strapi-admin';
4
+ import { Modal, Field, SingleSelect, SingleSelectOption, Flex, Button } from '@strapi/design-system';
5
+ import { useIntl } from 'react-intl';
6
+ import { styled } from 'styled-components';
7
+ import { useGetFolderStructureQuery, useGetFolderQuery, useBulkMoveMutation } from '../../../services/folders.mjs';
8
+ import { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection.mjs';
9
+ import { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder.mjs';
10
+ import { flattenFolderStructure } from '../../../utils/flattenFolderStructure.mjs';
11
+ import { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage.mjs';
12
+ import { getTranslationKey } from '../../../utils/translations.mjs';
13
+ import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
14
+ import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
15
+
16
+ const StyledModalContent = styled(Modal.Content)`
17
+ max-width: 51.6rem;
18
+ `;
19
+ /**
20
+ * "Move elements to" modal for the bulk actions bar. Moves the current
21
+ * selection (assets and/or folders) into the picked destination folder via
22
+ * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,
23
+ * folder list and the sidebar folder-structure, so both panes refresh on
24
+ * success. On failure the modal stays open so the user can retry or cancel.
25
+ */ const BulkMoveDialog = ({ open, onClose })=>{
26
+ const { formatMessage } = useIntl();
27
+ const { toggleNotification } = useNotification();
28
+ const { selectedIds, selectedFolderIds, clear } = useAssetSelection();
29
+ const { currentFolderId } = useFolderNavigation();
30
+ const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, {
31
+ skip: !open
32
+ });
33
+ const { data: currentFolder } = useGetFolderQuery({
34
+ id: currentFolderId
35
+ }, {
36
+ skip: currentFolderId === null
37
+ });
38
+ const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
39
+ // '' is the DOM-only sentinel for the Media Library root (null everywhere else).
40
+ const [destination, setDestination] = useState('');
41
+ useEffect(()=>{
42
+ if (open) {
43
+ setDestination('');
44
+ }
45
+ }, [
46
+ open
47
+ ]);
48
+ const rootLabel = formatMessage({
49
+ id: getTranslationKey('plugin.name'),
50
+ defaultMessage: 'Media Library'
51
+ });
52
+ // Reconstruct the selection as a drag set so the dialog validates destinations
53
+ // through the exact same canonical predicate as the DnD highlight.
54
+ const dragSet = useMemo(()=>buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId), [
55
+ selectedIds,
56
+ selectedFolderIds,
57
+ currentFolderId
58
+ ]);
59
+ // Options carry the full ancestry ("About / Images" vs "Tech / Images") so
60
+ // same-named folders stay distinguishable, listed depth-first under their
61
+ // parent. Selected folders and their descendants are pruned during the same
62
+ // single walk — an item can't be moved into itself or below itself (the
63
+ // server would reject it). The current folder (where the items already live)
64
+ // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op
65
+ // move. Memoized: large libraries shouldn't re-walk the tree on every render.
66
+ const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure, selectedFolderIds).filter((option)=>canDropItemOnFolder({
67
+ items: dragSet,
68
+ targetFolderId: option.id,
69
+ folderStructure
70
+ })), [
71
+ folderStructure,
72
+ selectedFolderIds,
73
+ dragSet
74
+ ]);
75
+ // Hide the root option when the items already live at root — dropping there
76
+ // would be a no-op. Uses the same predicate as the DnD highlight.
77
+ const canMoveToRoot = useMemo(()=>canDropItemOnFolder({
78
+ items: dragSet,
79
+ targetFolderId: null,
80
+ folderStructure
81
+ }), [
82
+ dragSet,
83
+ folderStructure
84
+ ]);
85
+ const count = selectedIds.size + selectedFolderIds.size;
86
+ const handleMove = async ()=>{
87
+ if (isMoving) {
88
+ return;
89
+ }
90
+ const destinationFolderId = destination === '' ? null : Number(destination);
91
+ try {
92
+ await bulkMove({
93
+ fileIds: Array.from(selectedIds),
94
+ folderIds: Array.from(selectedFolderIds),
95
+ destinationFolderId
96
+ }).unwrap();
97
+ } catch (error) {
98
+ // Keep the modal open and the selection intact so the user can retry
99
+ // (e.g. after picking a valid destination) or cancel. Surface the server
100
+ // message when there is one — it carries actionable causes like moving a
101
+ // folder into its own descendant or a name collision in the destination.
102
+ toggleNotification({
103
+ type: 'danger',
104
+ message: getBulkMoveErrorMessage(error, formatMessage({
105
+ id: getTranslationKey('list.bulk-actions.move.error'),
106
+ defaultMessage: 'An error occurred while moving the items.'
107
+ }))
108
+ });
109
+ return;
110
+ }
111
+ const sourceName = currentFolderId === null ? rootLabel : currentFolder?.name ?? rootLabel;
112
+ const destinationName = destinationFolderId === null ? rootLabel : destinationOptions.find((option)=>option.id === destinationFolderId)?.label ?? rootLabel;
113
+ toggleNotification({
114
+ type: 'success',
115
+ message: formatMessage({
116
+ id: getTranslationKey('list.bulk-actions.move.success'),
117
+ defaultMessage: '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}'
118
+ }, {
119
+ count,
120
+ source: sourceName,
121
+ destination: destinationName
122
+ })
123
+ });
124
+ clear();
125
+ onClose();
126
+ };
127
+ return /*#__PURE__*/ jsx(Modal.Root, {
128
+ open: open,
129
+ onOpenChange: (nextOpen)=>{
130
+ // The modal must stay open while the request runs — the loader on the
131
+ // Move button is the source of truth for the pending state.
132
+ if (!nextOpen && !isMoving) {
133
+ onClose();
134
+ }
135
+ },
136
+ children: /*#__PURE__*/ jsxs(StyledModalContent, {
137
+ children: [
138
+ /*#__PURE__*/ jsx(Modal.Header, {
139
+ children: /*#__PURE__*/ jsx(Modal.Title, {
140
+ children: formatMessage({
141
+ id: getTranslationKey('list.bulk-actions.move.title'),
142
+ defaultMessage: 'Move elements to'
143
+ })
144
+ })
145
+ }),
146
+ /*#__PURE__*/ jsx(Modal.Body, {
147
+ children: /*#__PURE__*/ jsxs(Field.Root, {
148
+ name: "destination",
149
+ children: [
150
+ /*#__PURE__*/ jsx(Field.Label, {
151
+ children: formatMessage({
152
+ id: getTranslationKey('list.bulk-actions.move.location'),
153
+ defaultMessage: 'Location'
154
+ })
155
+ }),
156
+ /*#__PURE__*/ jsxs(SingleSelect, {
157
+ value: destination,
158
+ onChange: (value)=>setDestination(String(value)),
159
+ disabled: isMoving,
160
+ children: [
161
+ canMoveToRoot && /*#__PURE__*/ jsx(SingleSelectOption, {
162
+ value: "",
163
+ children: rootLabel
164
+ }),
165
+ destinationOptions.map((option)=>/*#__PURE__*/ jsx(SingleSelectOption, {
166
+ value: String(option.id),
167
+ children: option.label
168
+ }, option.id))
169
+ ]
170
+ })
171
+ ]
172
+ })
173
+ }),
174
+ /*#__PURE__*/ jsx(Modal.Footer, {
175
+ children: /*#__PURE__*/ jsxs(Flex, {
176
+ gap: 2,
177
+ justifyContent: "space-between",
178
+ width: "100%",
179
+ children: [
180
+ /*#__PURE__*/ jsx(Button, {
181
+ variant: "tertiary",
182
+ onClick: onClose,
183
+ disabled: isMoving,
184
+ type: "button",
185
+ children: formatMessage({
186
+ id: 'app.components.Button.cancel',
187
+ defaultMessage: 'Cancel'
188
+ })
189
+ }),
190
+ /*#__PURE__*/ jsx(Button, {
191
+ onClick: handleMove,
192
+ loading: isMoving,
193
+ children: formatMessage({
194
+ id: getTranslationKey('list.bulk-actions.move.submit'),
195
+ defaultMessage: 'Move'
196
+ })
197
+ })
198
+ ]
199
+ })
200
+ })
201
+ ]
202
+ })
203
+ });
204
+ };
205
+
206
+ export { BulkMoveDialog };
207
+ //# sourceMappingURL=BulkMoveDialog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\n/**\n * \"Move elements to\" modal for the bulk actions bar. Moves the current\n * selection (assets and/or folders) into the picked destination folder via\n * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,\n * folder list and the sidebar folder-structure, so both panes refresh on\n * success. On failure the modal stays open so the user can retry or cancel.\n */\nexport const BulkMoveDialog = ({ open, onClose }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const { currentFolderId } = useFolderNavigation();\n const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, { skip: !open });\n const { data: currentFolder } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n useEffect(() => {\n if (open) {\n setDestination('');\n }\n }, [open]);\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Reconstruct the selection as a drag set so the dialog validates destinations\n // through the exact same canonical predicate as the DnD highlight.\n const dragSet = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId),\n [selectedIds, selectedFolderIds, currentFolderId]\n );\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. Selected folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The current folder (where the items already live)\n // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op\n // move. Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, selectedFolderIds).filter((option) =>\n canDropItemOnFolder({ items: dragSet, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, selectedFolderIds, dragSet]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items: dragSet, targetFolderId: null, folderStructure }),\n [dragSet, folderStructure]\n );\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const handleMove = async () => {\n if (isMoving) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n destinationFolderId,\n }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n const sourceName = currentFolderId === null ? rootLabel : (currentFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.move.success'),\n defaultMessage:\n '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}',\n },\n { count, source: sourceName, destination: destinationName }\n ),\n });\n clear();\n onClose();\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleMove} loading={isMoving}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","formatMessage","useIntl","toggleNotification","useNotification","selectedIds","selectedFolderIds","clear","useAssetSelection","currentFolderId","useFolderNavigation","data","folderStructure","useGetFolderStructureQuery","undefined","skip","currentFolder","useGetFolderQuery","id","bulkMove","isLoading","isMoving","useBulkMoveMutation","destination","setDestination","useState","useEffect","rootLabel","getTranslationKey","defaultMessage","dragSet","useMemo","buildDragSetFromSelection","destinationOptions","flattenFolderStructure","filter","option","canDropItemOnFolder","items","targetFolderId","canMoveToRoot","count","size","handleMove","destinationFolderId","Number","fileIds","Array","from","folderIds","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","source","_jsx","Root","onOpenChange","nextOpen","_jsxs","Header","Title","Body","Field","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","map","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var designSystem = require('@strapi/design-system');
6
+ var icons = require('@strapi/icons');
7
+ var reactIntl = require('react-intl');
8
+ var styledComponents = require('styled-components');
9
+ var translations = require('../../../utils/translations.js');
10
+
11
+ /**
12
+ * Month-grid range picker: first click sets the start, second click the end
13
+ * (clicks are reordered when the second date is before the first). The DS only
14
+ * ships a single-value DatePicker, so the range grid is built locally.
15
+ *
16
+ * Month/year move via chevrons rather than the mock's dropdowns — nested
17
+ * popovers inside a dropdown menu fight Radix's outside-interaction handling.
18
+ */ const DayCell = styledComponents.styled.button`
19
+ width: 3rem;
20
+ height: 3rem;
21
+ border: none;
22
+ border-radius: ${({ theme })=>theme.borderRadius};
23
+ cursor: pointer;
24
+ font: inherit;
25
+ color: ${({ theme, $isEdge, $isMuted })=>{
26
+ if ($isEdge) return theme.colors.primary600;
27
+ if ($isMuted) return theme.colors.neutral400;
28
+ return theme.colors.neutral800;
29
+ }};
30
+ background: ${({ theme, $inRange, $isEdge })=>{
31
+ if ($isEdge) return theme.colors.primary200;
32
+ if ($inRange) return theme.colors.primary100;
33
+ return 'transparent';
34
+ }};
35
+
36
+ &:hover {
37
+ background: ${({ theme })=>theme.colors.primary100};
38
+ }
39
+
40
+ &:focus-visible {
41
+ outline: 2px solid ${({ theme })=>theme.colors.primary600};
42
+ outline-offset: -2px;
43
+ }
44
+ `;
45
+ const toKey = (date)=>{
46
+ const month = `${date.getMonth() + 1}`.padStart(2, '0');
47
+ const day = `${date.getDate()}`.padStart(2, '0');
48
+ return `${date.getFullYear()}-${month}-${day}`;
49
+ };
50
+ const fromKey = (key)=>{
51
+ const [year, month, day] = key.split('-').map(Number);
52
+ return new Date(year, month - 1, day);
53
+ };
54
+ /** Monday-first weeks covering the given month, padded with adjacent days. */ const buildWeeks = (year, month)=>{
55
+ const first = new Date(year, month, 1);
56
+ const start = new Date(first.getTime());
57
+ start.setDate(first.getDate() - (first.getDay() + 6) % 7);
58
+ const weeks = [];
59
+ const cursor = new Date(start.getTime());
60
+ do {
61
+ const week = [];
62
+ for(let i = 0; i < 7; i += 1){
63
+ week.push(new Date(cursor.getTime()));
64
+ cursor.setDate(cursor.getDate() + 1);
65
+ }
66
+ weeks.push(week);
67
+ }while (cursor.getMonth() === month && cursor.getFullYear() === year)
68
+ return weeks;
69
+ };
70
+ const DateRangeCalendar = ({ from, to, onSelect })=>{
71
+ const { formatMessage, formatDate } = reactIntl.useIntl();
72
+ const initialMonth = from ? fromKey(from) : new Date();
73
+ const [viewYear, setViewYear] = React.useState(initialMonth.getFullYear());
74
+ const [viewMonth, setViewMonth] = React.useState(initialMonth.getMonth());
75
+ // In-progress selection: set on the first click, cleared on commit.
76
+ const [pendingStart, setPendingStart] = React.useState(null);
77
+ const rangeStart = pendingStart ?? from ?? null;
78
+ const rangeEnd = pendingStart ? null : to ?? null;
79
+ const moveMonth = (delta)=>{
80
+ const next = new Date(viewYear, viewMonth + delta, 1);
81
+ setViewYear(next.getFullYear());
82
+ setViewMonth(next.getMonth());
83
+ };
84
+ const handleDayClick = (day)=>{
85
+ const key = toKey(day);
86
+ if (!pendingStart) {
87
+ setPendingStart(key);
88
+ return;
89
+ }
90
+ const [start, end] = key < pendingStart ? [
91
+ key,
92
+ pendingStart
93
+ ] : [
94
+ pendingStart,
95
+ key
96
+ ];
97
+ setPendingStart(null);
98
+ onSelect(start, end);
99
+ };
100
+ const weeks = buildWeeks(viewYear, viewMonth);
101
+ const weekDayLabels = weeks[0].map((day)=>formatDate(day, {
102
+ weekday: 'short'
103
+ }).slice(0, 2));
104
+ return(// role="group" (not "application"): these are plain buttons — hijacking
105
+ // the screen reader's own key handling would take away navigation and
106
+ // give nothing back.
107
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
108
+ padding: 2,
109
+ width: "100%",
110
+ role: "group",
111
+ "aria-label": formatMessage({
112
+ id: translations.getTranslationKey('list.filters.calendar.label'),
113
+ defaultMessage: 'Select date range'
114
+ }),
115
+ "data-testid": "date-range-calendar",
116
+ children: [
117
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
118
+ justifyContent: "space-between",
119
+ alignItems: "center",
120
+ paddingBottom: 2,
121
+ children: [
122
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
123
+ variant: "ghost",
124
+ label: formatMessage({
125
+ id: translations.getTranslationKey('list.filters.calendar.previous-month'),
126
+ defaultMessage: 'Previous month'
127
+ }),
128
+ onClick: ()=>moveMonth(-1),
129
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronLeft, {})
130
+ }),
131
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
132
+ fontWeight: "semiBold",
133
+ textColor: "neutral800",
134
+ children: formatDate(new Date(viewYear, viewMonth, 1), {
135
+ month: 'long',
136
+ year: 'numeric'
137
+ })
138
+ }),
139
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
140
+ variant: "ghost",
141
+ label: formatMessage({
142
+ id: translations.getTranslationKey('list.filters.calendar.next-month'),
143
+ defaultMessage: 'Next month'
144
+ }),
145
+ onClick: ()=>moveMonth(1),
146
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronRight, {})
147
+ })
148
+ ]
149
+ }),
150
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
151
+ children: weekDayLabels.map((label, index)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
152
+ width: "3rem",
153
+ height: "2.4rem",
154
+ justifyContent: "center",
155
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
156
+ variant: "pi",
157
+ fontWeight: "semiBold",
158
+ textColor: "neutral600",
159
+ children: label
160
+ })
161
+ }, index))
162
+ }),
163
+ weeks.map((week, weekIndex)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
164
+ children: week.map((day)=>{
165
+ const key = toKey(day);
166
+ const isEdge = key === rangeStart || key === rangeEnd;
167
+ const inRange = rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;
168
+ return /*#__PURE__*/ jsxRuntime.jsxs(DayCell, {
169
+ type: "button",
170
+ $isEdge: isEdge,
171
+ $inRange: inRange,
172
+ $isMuted: day.getMonth() !== viewMonth,
173
+ onClick: ()=>handleDayClick(day),
174
+ children: [
175
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
176
+ children: formatDate(day, {
177
+ dateStyle: 'long'
178
+ })
179
+ }),
180
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
181
+ "aria-hidden": true,
182
+ children: day.getDate()
183
+ })
184
+ ]
185
+ }, key);
186
+ })
187
+ }, weekIndex))
188
+ ]
189
+ }));
190
+ };
191
+
192
+ exports.DateRangeCalendar = DateRangeCalendar;
193
+ //# sourceMappingURL=DateRangeCalendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateRangeCalendar.js","sources":["../../../../../../admin/src/future/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\n }};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDayLabels = weeks[0].map((day) => formatDate(day, { weekday: 'short' }).slice(0, 2));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDayLabels.map((label, index) => (\n <Flex key={index} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week, weekIndex) => (\n <Flex key={weekIndex}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDayLabels","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","label","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","index","height","weekIndex","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}