@strapi/upload 5.51.1 → 5.52.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 (369) 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/App.js +3 -3
  14. package/dist/admin/future/App.js.map +1 -1
  15. package/dist/admin/future/App.mjs +4 -4
  16. package/dist/admin/future/App.mjs.map +1 -1
  17. package/dist/admin/future/components/BetaNotice.js +72 -0
  18. package/dist/admin/future/components/BetaNotice.js.map +1 -0
  19. package/dist/admin/future/components/BetaNotice.mjs +70 -0
  20. package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
  21. package/dist/admin/future/components/Drawer.js +18 -3
  22. package/dist/admin/future/components/Drawer.js.map +1 -1
  23. package/dist/admin/future/components/Drawer.mjs +18 -3
  24. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  25. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  26. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  27. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  28. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  29. package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
  30. package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
  31. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
  32. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
  33. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  34. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  35. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  36. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/AssetsPage.js +453 -170
  38. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/AssetsPage.mjs +454 -171
  40. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
  42. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
  44. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +325 -0
  46. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +323 -0
  48. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +110 -46
  50. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +110 -46
  52. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +95 -67
  54. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +95 -68
  56. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +94 -26
  58. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +96 -28
  60. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +112 -0
  62. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +110 -0
  64. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -56
  66. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -59
  68. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +188 -138
  70. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  71. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +191 -141
  72. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  73. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
  74. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  75. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
  76. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  77. package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
  78. package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
  80. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
  81. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  82. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  84. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  85. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
  86. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
  87. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
  88. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
  89. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +45 -18
  90. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +46 -19
  92. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
  94. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
  96. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
  98. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  99. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
  100. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  101. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  102. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  104. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  106. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  108. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/components/FilterBadges.js +417 -0
  110. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +415 -0
  112. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/components/FilterMenu.js +453 -0
  114. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +447 -0
  116. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +144 -0
  118. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
  119. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +142 -0
  120. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
  121. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +50 -16
  122. package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +52 -18
  124. package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +125 -148
  126. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  127. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +127 -150
  128. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  129. package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
  130. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  131. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
  132. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  133. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  134. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  135. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  136. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  137. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
  138. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  139. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
  140. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  141. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
  142. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
  143. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
  144. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
  145. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  146. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  147. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  148. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  149. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +222 -45
  150. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  151. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +223 -46
  152. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  153. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
  154. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
  155. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
  156. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
  157. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  158. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  159. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  160. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  161. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  162. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  163. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  164. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  165. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
  166. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
  167. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
  168. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
  169. package/dist/admin/future/services/api.js +187 -28
  170. package/dist/admin/future/services/api.js.map +1 -1
  171. package/dist/admin/future/services/api.mjs +187 -30
  172. package/dist/admin/future/services/api.mjs.map +1 -1
  173. package/dist/admin/future/services/assets.js +40 -17
  174. package/dist/admin/future/services/assets.js.map +1 -1
  175. package/dist/admin/future/services/assets.mjs +40 -17
  176. package/dist/admin/future/services/assets.mjs.map +1 -1
  177. package/dist/admin/future/services/folders.js +66 -19
  178. package/dist/admin/future/services/folders.js.map +1 -1
  179. package/dist/admin/future/services/folders.mjs +66 -20
  180. package/dist/admin/future/services/folders.mjs.map +1 -1
  181. package/dist/admin/future/services/settings.js +10 -3
  182. package/dist/admin/future/services/settings.js.map +1 -1
  183. package/dist/admin/future/services/settings.mjs +10 -3
  184. package/dist/admin/future/services/settings.mjs.map +1 -1
  185. package/dist/admin/future/store/uploadProgress.js +109 -2
  186. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  187. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  188. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  189. package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
  190. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
  191. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
  192. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
  193. package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
  194. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
  195. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
  196. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
  197. package/dist/admin/future/utils/getRelationId.js +24 -0
  198. package/dist/admin/future/utils/getRelationId.js.map +1 -0
  199. package/dist/admin/future/utils/getRelationId.mjs +22 -0
  200. package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
  201. package/dist/admin/future/utils/isEventFromWithin.js +14 -0
  202. package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
  203. package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
  204. package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
  205. package/dist/admin/future/utils/itemLocations.js +40 -0
  206. package/dist/admin/future/utils/itemLocations.js.map +1 -0
  207. package/dist/admin/future/utils/itemLocations.mjs +36 -0
  208. package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
  209. package/dist/admin/future/utils/itemSource.js +36 -0
  210. package/dist/admin/future/utils/itemSource.js.map +1 -0
  211. package/dist/admin/future/utils/itemSource.mjs +32 -0
  212. package/dist/admin/future/utils/itemSource.mjs.map +1 -0
  213. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  214. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  215. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  216. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  217. package/dist/admin/hooks/useSelectionState.js +2 -4
  218. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  219. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  220. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  221. package/dist/admin/index.js +11 -17
  222. package/dist/admin/index.js.map +1 -1
  223. package/dist/admin/index.mjs +12 -18
  224. package/dist/admin/index.mjs.map +1 -1
  225. package/dist/admin/shared/constants.js +43 -0
  226. package/dist/admin/shared/constants.js.map +1 -0
  227. package/dist/admin/shared/constants.mjs +38 -0
  228. package/dist/admin/shared/constants.mjs.map +1 -0
  229. package/dist/admin/src/future/App.d.ts +1 -1
  230. package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
  231. package/dist/admin/src/future/components/Drawer.d.ts +5 -1
  232. package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
  233. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  234. package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
  235. package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +24 -0
  236. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  237. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
  238. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  239. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +21 -1
  240. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
  241. package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
  242. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  243. package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
  244. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
  245. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
  246. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
  247. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  248. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  249. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +8 -0
  250. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +26 -0
  251. package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +20 -0
  252. package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
  253. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  254. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
  255. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  256. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
  257. package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
  258. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +27 -3
  259. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
  260. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  261. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  262. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
  263. package/dist/admin/src/future/services/api.d.ts +53 -5
  264. package/dist/admin/src/future/services/assets.d.ts +9 -1
  265. package/dist/admin/src/future/services/folders.d.ts +9 -1
  266. package/dist/admin/src/future/services/settings.d.ts +2 -2
  267. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  268. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
  269. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
  270. package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
  271. package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
  272. package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
  273. package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
  274. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  275. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  276. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  277. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  278. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  279. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  280. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  281. package/dist/admin/translations/en.json.js +73 -2
  282. package/dist/admin/translations/en.json.js.map +1 -1
  283. package/dist/admin/translations/en.json.mjs +73 -2
  284. package/dist/admin/translations/en.json.mjs.map +1 -1
  285. package/dist/admin/utils/urlYupSchema.js +33 -9
  286. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  287. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  288. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  289. package/dist/server/config.js +13 -5
  290. package/dist/server/config.js.map +1 -1
  291. package/dist/server/config.mjs +13 -5
  292. package/dist/server/config.mjs.map +1 -1
  293. package/dist/server/constants.js.map +1 -1
  294. package/dist/server/constants.mjs.map +1 -1
  295. package/dist/server/controllers/admin-file.js +30 -0
  296. package/dist/server/controllers/admin-file.js.map +1 -1
  297. package/dist/server/controllers/admin-file.mjs +30 -0
  298. package/dist/server/controllers/admin-file.mjs.map +1 -1
  299. package/dist/server/controllers/admin-settings.js +20 -2
  300. package/dist/server/controllers/admin-settings.js.map +1 -1
  301. package/dist/server/controllers/admin-settings.mjs +21 -3
  302. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  303. package/dist/server/controllers/content-api.js +1 -2
  304. package/dist/server/controllers/content-api.js.map +1 -1
  305. package/dist/server/controllers/content-api.mjs +2 -2
  306. package/dist/server/controllers/content-api.mjs.map +1 -1
  307. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  308. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  309. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  310. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  311. package/dist/server/controllers/validation/admin/settings.js +4 -1
  312. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  313. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  314. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  315. package/dist/server/routes/admin.js +18 -0
  316. package/dist/server/routes/admin.js.map +1 -1
  317. package/dist/server/routes/admin.mjs +18 -0
  318. package/dist/server/routes/admin.mjs.map +1 -1
  319. package/dist/server/services/ai-metadata.js +108 -11
  320. package/dist/server/services/ai-metadata.js.map +1 -1
  321. package/dist/server/services/ai-metadata.mjs +108 -11
  322. package/dist/server/services/ai-metadata.mjs.map +1 -1
  323. package/dist/server/services/file.js +86 -13
  324. package/dist/server/services/file.js.map +1 -1
  325. package/dist/server/services/file.mjs +87 -14
  326. package/dist/server/services/file.mjs.map +1 -1
  327. package/dist/server/services/image-manipulation.js +4 -4
  328. package/dist/server/services/image-manipulation.js.map +1 -1
  329. package/dist/server/services/image-manipulation.mjs +4 -4
  330. package/dist/server/services/image-manipulation.mjs.map +1 -1
  331. package/dist/server/shared/constants.js +43 -0
  332. package/dist/server/shared/constants.js.map +1 -0
  333. package/dist/server/shared/constants.mjs +38 -0
  334. package/dist/server/shared/constants.mjs.map +1 -0
  335. package/dist/server/src/config.d.ts +2 -0
  336. package/dist/server/src/config.d.ts.map +1 -1
  337. package/dist/server/src/constants.d.ts +2 -1
  338. package/dist/server/src/constants.d.ts.map +1 -1
  339. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  340. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  341. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  342. package/dist/server/src/controllers/index.d.ts +1 -0
  343. package/dist/server/src/controllers/index.d.ts.map +1 -1
  344. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  345. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  346. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  347. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  348. package/dist/server/src/index.d.ts +7 -1
  349. package/dist/server/src/index.d.ts.map +1 -1
  350. package/dist/server/src/routes/admin.d.ts.map +1 -1
  351. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  352. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  353. package/dist/server/src/services/file.d.ts +12 -2
  354. package/dist/server/src/services/file.d.ts.map +1 -1
  355. package/dist/server/src/services/image-manipulation.d.ts +0 -5
  356. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  357. package/dist/server/src/services/index.d.ts +4 -1
  358. package/dist/server/src/services/index.d.ts.map +1 -1
  359. package/dist/server/src/types.d.ts +3 -0
  360. package/dist/server/src/types.d.ts.map +1 -1
  361. package/dist/shared/constants.d.ts +35 -0
  362. package/dist/shared/constants.d.ts.map +1 -0
  363. package/dist/shared/contracts/files.d.ts +25 -0
  364. package/dist/shared/contracts/files.d.ts.map +1 -1
  365. package/dist/shared/contracts/settings.d.ts +7 -0
  366. package/package.json +10 -10
  367. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
  368. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
  369. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var getRelationId = require('./getRelationId.js');
4
+
5
+ /** Every id misses — used where no list is loaded (e.g. an isolated provider). */ const emptyItemLocations = {
6
+ fileFolderId: ()=>undefined,
7
+ folderParentId: ()=>undefined
8
+ };
9
+ /**
10
+ * Build the lookup once per list. Callers memoize on the rows so the identity
11
+ * stays stable: `BulkMoveDialog` memoizes its destination walk on the items
12
+ * derived from it.
13
+ */ const buildItemLocations = (assets, folders)=>{
14
+ const fileFolderIds = new Map();
15
+ const folderParentIds = new Map();
16
+ assets.forEach((asset)=>{
17
+ fileFolderIds.set(asset.id, getRelationId.getRelationId(asset.folder));
18
+ });
19
+ folders.forEach((folder)=>{
20
+ folderParentIds.set(folder.id, getRelationId.getRelationId(folder.parent));
21
+ });
22
+ return {
23
+ fileFolderId: (id)=>fileFolderIds.get(id),
24
+ folderParentId: (id)=>folderParentIds.get(id)
25
+ };
26
+ };
27
+ /**
28
+ * Resolve an item's location, falling back to the folder currently open when it
29
+ * is not in the loaded list. The fallback is unreachable in practice — selection
30
+ * clears whenever the list identity changes and infinite scroll only appends —
31
+ * but a stale parent beats silently dropping the item from the move.
32
+ */ const locateItem = (locations, kind, id, fallbackFolderId)=>{
33
+ const located = kind === 'file' ? locations.fileFolderId(id) : locations.folderParentId(id);
34
+ return located === undefined ? fallbackFolderId : located;
35
+ };
36
+
37
+ exports.buildItemLocations = buildItemLocations;
38
+ exports.emptyItemLocations = emptyItemLocations;
39
+ exports.locateItem = locateItem;
40
+ //# sourceMappingURL=itemLocations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemLocations.js","sources":["../../../../admin/src/future/utils/itemLocations.ts"],"sourcesContent":["import { getRelationId } from './getRelationId';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\n\n/**\n * Where each loaded item actually lives, keyed by id.\n *\n * Search results are global, so the folder currently open (`?folder=`) says\n * nothing about a selected item's location. The loaded lists do: the server\n * populates `folder` on `/upload/files` and `parent` on `/upload/folders`.\n *\n * `undefined` means \"not in the loaded list\" and is distinct from `null`\n * (\"lives at the root\") — the two lead to different move validation.\n */\nexport interface ItemLocations {\n fileFolderId: (id: number) => number | null | undefined;\n folderParentId: (id: number) => number | null | undefined;\n}\n\n/** Every id misses — used where no list is loaded (e.g. an isolated provider). */\nexport const emptyItemLocations: ItemLocations = {\n fileFolderId: () => undefined,\n folderParentId: () => undefined,\n};\n\n/**\n * Build the lookup once per list. Callers memoize on the rows so the identity\n * stays stable: `BulkMoveDialog` memoizes its destination walk on the items\n * derived from it.\n */\nexport const buildItemLocations = (assets: File[], folders: Folder[]): ItemLocations => {\n const fileFolderIds = new Map<number, number | null>();\n const folderParentIds = new Map<number, number | null>();\n\n assets.forEach((asset) => {\n fileFolderIds.set(asset.id, getRelationId(asset.folder));\n });\n\n folders.forEach((folder) => {\n folderParentIds.set(folder.id, getRelationId(folder.parent));\n });\n\n return {\n fileFolderId: (id) => fileFolderIds.get(id),\n folderParentId: (id) => folderParentIds.get(id),\n };\n};\n\n/**\n * Resolve an item's location, falling back to the folder currently open when it\n * is not in the loaded list. The fallback is unreachable in practice — selection\n * clears whenever the list identity changes and infinite scroll only appends —\n * but a stale parent beats silently dropping the item from the move.\n */\nexport const locateItem = (\n locations: ItemLocations,\n kind: 'file' | 'folder',\n id: number,\n fallbackFolderId: number | null\n): number | null => {\n const located = kind === 'file' ? locations.fileFolderId(id) : locations.folderParentId(id);\n\n return located === undefined ? fallbackFolderId : located;\n};\n"],"names":["emptyItemLocations","fileFolderId","undefined","folderParentId","buildItemLocations","assets","folders","fileFolderIds","Map","folderParentIds","forEach","asset","set","id","getRelationId","folder","parent","get","locateItem","locations","kind","fallbackFolderId","located"],"mappings":";;;;AAoBA,mFACO,MAAMA,kBAAAA,GAAoC;AAC/CC,IAAAA,YAAAA,EAAc,IAAMC,SAAAA;AACpBC,IAAAA,cAAAA,EAAgB,IAAMD;AACxB;AAEA;;;;AAIC,IACM,MAAME,kBAAAA,GAAqB,CAACC,MAAAA,EAAgBC,OAAAA,GAAAA;AACjD,IAAA,MAAMC,gBAAgB,IAAIC,GAAAA,EAAAA;AAC1B,IAAA,MAAMC,kBAAkB,IAAID,GAAAA,EAAAA;IAE5BH,MAAAA,CAAOK,OAAO,CAAC,CAACC,KAAAA,GAAAA;AACdJ,QAAAA,aAAAA,CAAcK,GAAG,CAACD,KAAAA,CAAME,EAAE,EAAEC,2BAAAA,CAAcH,MAAMI,MAAM,CAAA,CAAA;AACxD,IAAA,CAAA,CAAA;IAEAT,OAAAA,CAAQI,OAAO,CAAC,CAACK,MAAAA,GAAAA;AACfN,QAAAA,eAAAA,CAAgBG,GAAG,CAACG,MAAAA,CAAOF,EAAE,EAAEC,2BAAAA,CAAcC,OAAOC,MAAM,CAAA,CAAA;AAC5D,IAAA,CAAA,CAAA;IAEA,OAAO;AACLf,QAAAA,YAAAA,EAAc,CAACY,EAAAA,GAAON,aAAAA,CAAcU,GAAG,CAACJ,EAAAA,CAAAA;AACxCV,QAAAA,cAAAA,EAAgB,CAACU,EAAAA,GAAOJ,eAAAA,CAAgBQ,GAAG,CAACJ,EAAAA;AAC9C,KAAA;AACF;AAEA;;;;;AAKC,IACM,MAAMK,UAAAA,GAAa,CACxBC,SAAAA,EACAC,MACAP,EAAAA,EACAQ,gBAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAUF,SAAS,MAAA,GAASD,SAAAA,CAAUlB,YAAY,CAACY,EAAAA,CAAAA,GAAMM,SAAAA,CAAUhB,cAAc,CAACU,EAAAA,CAAAA;IAExF,OAAOS,OAAAA,KAAYpB,YAAYmB,gBAAAA,GAAmBC,OAAAA;AACpD;;;;;;"}
@@ -0,0 +1,36 @@
1
+ import { getRelationId } from './getRelationId.mjs';
2
+
3
+ /** Every id misses — used where no list is loaded (e.g. an isolated provider). */ const emptyItemLocations = {
4
+ fileFolderId: ()=>undefined,
5
+ folderParentId: ()=>undefined
6
+ };
7
+ /**
8
+ * Build the lookup once per list. Callers memoize on the rows so the identity
9
+ * stays stable: `BulkMoveDialog` memoizes its destination walk on the items
10
+ * derived from it.
11
+ */ const buildItemLocations = (assets, folders)=>{
12
+ const fileFolderIds = new Map();
13
+ const folderParentIds = new Map();
14
+ assets.forEach((asset)=>{
15
+ fileFolderIds.set(asset.id, getRelationId(asset.folder));
16
+ });
17
+ folders.forEach((folder)=>{
18
+ folderParentIds.set(folder.id, getRelationId(folder.parent));
19
+ });
20
+ return {
21
+ fileFolderId: (id)=>fileFolderIds.get(id),
22
+ folderParentId: (id)=>folderParentIds.get(id)
23
+ };
24
+ };
25
+ /**
26
+ * Resolve an item's location, falling back to the folder currently open when it
27
+ * is not in the loaded list. The fallback is unreachable in practice — selection
28
+ * clears whenever the list identity changes and infinite scroll only appends —
29
+ * but a stale parent beats silently dropping the item from the move.
30
+ */ const locateItem = (locations, kind, id, fallbackFolderId)=>{
31
+ const located = kind === 'file' ? locations.fileFolderId(id) : locations.folderParentId(id);
32
+ return located === undefined ? fallbackFolderId : located;
33
+ };
34
+
35
+ export { buildItemLocations, emptyItemLocations, locateItem };
36
+ //# sourceMappingURL=itemLocations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemLocations.mjs","sources":["../../../../admin/src/future/utils/itemLocations.ts"],"sourcesContent":["import { getRelationId } from './getRelationId';\n\nimport type { File } from '../../../../shared/contracts/files';\nimport type { Folder } from '../../../../shared/contracts/folders';\n\n/**\n * Where each loaded item actually lives, keyed by id.\n *\n * Search results are global, so the folder currently open (`?folder=`) says\n * nothing about a selected item's location. The loaded lists do: the server\n * populates `folder` on `/upload/files` and `parent` on `/upload/folders`.\n *\n * `undefined` means \"not in the loaded list\" and is distinct from `null`\n * (\"lives at the root\") — the two lead to different move validation.\n */\nexport interface ItemLocations {\n fileFolderId: (id: number) => number | null | undefined;\n folderParentId: (id: number) => number | null | undefined;\n}\n\n/** Every id misses — used where no list is loaded (e.g. an isolated provider). */\nexport const emptyItemLocations: ItemLocations = {\n fileFolderId: () => undefined,\n folderParentId: () => undefined,\n};\n\n/**\n * Build the lookup once per list. Callers memoize on the rows so the identity\n * stays stable: `BulkMoveDialog` memoizes its destination walk on the items\n * derived from it.\n */\nexport const buildItemLocations = (assets: File[], folders: Folder[]): ItemLocations => {\n const fileFolderIds = new Map<number, number | null>();\n const folderParentIds = new Map<number, number | null>();\n\n assets.forEach((asset) => {\n fileFolderIds.set(asset.id, getRelationId(asset.folder));\n });\n\n folders.forEach((folder) => {\n folderParentIds.set(folder.id, getRelationId(folder.parent));\n });\n\n return {\n fileFolderId: (id) => fileFolderIds.get(id),\n folderParentId: (id) => folderParentIds.get(id),\n };\n};\n\n/**\n * Resolve an item's location, falling back to the folder currently open when it\n * is not in the loaded list. The fallback is unreachable in practice — selection\n * clears whenever the list identity changes and infinite scroll only appends —\n * but a stale parent beats silently dropping the item from the move.\n */\nexport const locateItem = (\n locations: ItemLocations,\n kind: 'file' | 'folder',\n id: number,\n fallbackFolderId: number | null\n): number | null => {\n const located = kind === 'file' ? locations.fileFolderId(id) : locations.folderParentId(id);\n\n return located === undefined ? fallbackFolderId : located;\n};\n"],"names":["emptyItemLocations","fileFolderId","undefined","folderParentId","buildItemLocations","assets","folders","fileFolderIds","Map","folderParentIds","forEach","asset","set","id","getRelationId","folder","parent","get","locateItem","locations","kind","fallbackFolderId","located"],"mappings":";;AAoBA,mFACO,MAAMA,kBAAAA,GAAoC;AAC/CC,IAAAA,YAAAA,EAAc,IAAMC,SAAAA;AACpBC,IAAAA,cAAAA,EAAgB,IAAMD;AACxB;AAEA;;;;AAIC,IACM,MAAME,kBAAAA,GAAqB,CAACC,MAAAA,EAAgBC,OAAAA,GAAAA;AACjD,IAAA,MAAMC,gBAAgB,IAAIC,GAAAA,EAAAA;AAC1B,IAAA,MAAMC,kBAAkB,IAAID,GAAAA,EAAAA;IAE5BH,MAAAA,CAAOK,OAAO,CAAC,CAACC,KAAAA,GAAAA;AACdJ,QAAAA,aAAAA,CAAcK,GAAG,CAACD,KAAAA,CAAME,EAAE,EAAEC,aAAAA,CAAcH,MAAMI,MAAM,CAAA,CAAA;AACxD,IAAA,CAAA,CAAA;IAEAT,OAAAA,CAAQI,OAAO,CAAC,CAACK,MAAAA,GAAAA;AACfN,QAAAA,eAAAA,CAAgBG,GAAG,CAACG,MAAAA,CAAOF,EAAE,EAAEC,aAAAA,CAAcC,OAAOC,MAAM,CAAA,CAAA;AAC5D,IAAA,CAAA,CAAA;IAEA,OAAO;AACLf,QAAAA,YAAAA,EAAc,CAACY,EAAAA,GAAON,aAAAA,CAAcU,GAAG,CAACJ,EAAAA,CAAAA;AACxCV,QAAAA,cAAAA,EAAgB,CAACU,EAAAA,GAAOJ,eAAAA,CAAgBQ,GAAG,CAACJ,EAAAA;AAC9C,KAAA;AACF;AAEA;;;;;AAKC,IACM,MAAMK,UAAAA,GAAa,CACxBC,SAAAA,EACAC,MACAP,EAAAA,EACAQ,gBAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAUF,SAAS,MAAA,GAASD,SAAAA,CAAUlB,YAAY,CAACY,EAAAA,CAAAA,GAAMM,SAAAA,CAAUhB,cAAc,CAACU,EAAAA,CAAAA;IAExF,OAAOS,OAAAA,KAAYpB,YAAYmB,gBAAAA,GAAmBC,OAAAA;AACpD;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Where an item currently lives, regardless of its kind — folders carry their
5
+ * location on `parentId`, files on `folderId`.
6
+ */ const sourceFolderIdOf = (item)=>item.kind === 'folder' ? item.parentId : item.folderId;
7
+ /**
8
+ * The one folder every item in a move came from, or `null` when there isn't one.
9
+ *
10
+ * A selection made under a global search can hold items from anywhere, so a move
11
+ * has a nameable source only when the whole set agrees on it. `null` also covers
12
+ * the empty set. Callers pass the result straight to `formatMoveSuccessMessage`,
13
+ * which drops the source from the wording rather than crediting one item's
14
+ * folder to all of them.
15
+ *
16
+ * Note `null` is overloaded on purpose at the *label* level: an item at the
17
+ * Media Library root also has a `null` location, and both cases end up reading
18
+ * as "no folder to name". Use `hasUniformSource` when the difference matters.
19
+ */ const uniformSourceFolderId = (items)=>{
20
+ if (!hasUniformSource(items)) {
21
+ return null;
22
+ }
23
+ return sourceFolderIdOf(items[0]);
24
+ };
25
+ /** Whether every item in the set came from the same folder. False for an empty set. */ const hasUniformSource = (items)=>{
26
+ if (items.length === 0) {
27
+ return false;
28
+ }
29
+ const first = sourceFolderIdOf(items[0]);
30
+ return items.every((item)=>sourceFolderIdOf(item) === first);
31
+ };
32
+
33
+ exports.hasUniformSource = hasUniformSource;
34
+ exports.sourceFolderIdOf = sourceFolderIdOf;
35
+ exports.uniformSourceFolderId = uniformSourceFolderId;
36
+ //# sourceMappingURL=itemSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemSource.js","sources":["../../../../admin/src/future/utils/itemSource.ts"],"sourcesContent":["import type { DragItemData } from '../types/dnd';\n\n/**\n * Where an item currently lives, regardless of its kind — folders carry their\n * location on `parentId`, files on `folderId`.\n */\nexport const sourceFolderIdOf = (item: DragItemData): number | null =>\n item.kind === 'folder' ? item.parentId : item.folderId;\n\n/**\n * The one folder every item in a move came from, or `null` when there isn't one.\n *\n * A selection made under a global search can hold items from anywhere, so a move\n * has a nameable source only when the whole set agrees on it. `null` also covers\n * the empty set. Callers pass the result straight to `formatMoveSuccessMessage`,\n * which drops the source from the wording rather than crediting one item's\n * folder to all of them.\n *\n * Note `null` is overloaded on purpose at the *label* level: an item at the\n * Media Library root also has a `null` location, and both cases end up reading\n * as \"no folder to name\". Use `hasUniformSource` when the difference matters.\n */\nexport const uniformSourceFolderId = (items: DragItemData[]): number | null => {\n if (!hasUniformSource(items)) {\n return null;\n }\n\n return sourceFolderIdOf(items[0]);\n};\n\n/** Whether every item in the set came from the same folder. False for an empty set. */\nexport const hasUniformSource = (items: DragItemData[]): boolean => {\n if (items.length === 0) {\n return false;\n }\n\n const first = sourceFolderIdOf(items[0]);\n\n return items.every((item) => sourceFolderIdOf(item) === first);\n};\n"],"names":["sourceFolderIdOf","item","kind","parentId","folderId","uniformSourceFolderId","items","hasUniformSource","length","first","every"],"mappings":";;AAEA;;;AAGC,IACM,MAAMA,gBAAAA,GAAmB,CAACC,OAC/BA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWD,IAAAA,CAAKE,QAAQ,GAAGF,IAAAA,CAAKG;AAEhD;;;;;;;;;;;;IAaO,MAAMC,qBAAAA,GAAwB,CAACC,KAAAA,GAAAA;IACpC,IAAI,CAACC,iBAAiBD,KAAAA,CAAAA,EAAQ;QAC5B,OAAO,IAAA;AACT,IAAA;IAEA,OAAON,gBAAAA,CAAiBM,KAAK,CAAC,CAAA,CAAE,CAAA;AAClC;AAEA,wFACO,MAAMC,gBAAAA,GAAmB,CAACD,KAAAA,GAAAA;IAC/B,IAAIA,KAAAA,CAAME,MAAM,KAAK,CAAA,EAAG;QACtB,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQT,gBAAAA,CAAiBM,KAAK,CAAC,CAAA,CAAE,CAAA;AAEvC,IAAA,OAAOA,MAAMI,KAAK,CAAC,CAACT,IAAAA,GAASD,iBAAiBC,IAAAA,CAAAA,KAAUQ,KAAAA,CAAAA;AAC1D;;;;;;"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Where an item currently lives, regardless of its kind — folders carry their
3
+ * location on `parentId`, files on `folderId`.
4
+ */ const sourceFolderIdOf = (item)=>item.kind === 'folder' ? item.parentId : item.folderId;
5
+ /**
6
+ * The one folder every item in a move came from, or `null` when there isn't one.
7
+ *
8
+ * A selection made under a global search can hold items from anywhere, so a move
9
+ * has a nameable source only when the whole set agrees on it. `null` also covers
10
+ * the empty set. Callers pass the result straight to `formatMoveSuccessMessage`,
11
+ * which drops the source from the wording rather than crediting one item's
12
+ * folder to all of them.
13
+ *
14
+ * Note `null` is overloaded on purpose at the *label* level: an item at the
15
+ * Media Library root also has a `null` location, and both cases end up reading
16
+ * as "no folder to name". Use `hasUniformSource` when the difference matters.
17
+ */ const uniformSourceFolderId = (items)=>{
18
+ if (!hasUniformSource(items)) {
19
+ return null;
20
+ }
21
+ return sourceFolderIdOf(items[0]);
22
+ };
23
+ /** Whether every item in the set came from the same folder. False for an empty set. */ const hasUniformSource = (items)=>{
24
+ if (items.length === 0) {
25
+ return false;
26
+ }
27
+ const first = sourceFolderIdOf(items[0]);
28
+ return items.every((item)=>sourceFolderIdOf(item) === first);
29
+ };
30
+
31
+ export { hasUniformSource, sourceFolderIdOf, uniformSourceFolderId };
32
+ //# sourceMappingURL=itemSource.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itemSource.mjs","sources":["../../../../admin/src/future/utils/itemSource.ts"],"sourcesContent":["import type { DragItemData } from '../types/dnd';\n\n/**\n * Where an item currently lives, regardless of its kind — folders carry their\n * location on `parentId`, files on `folderId`.\n */\nexport const sourceFolderIdOf = (item: DragItemData): number | null =>\n item.kind === 'folder' ? item.parentId : item.folderId;\n\n/**\n * The one folder every item in a move came from, or `null` when there isn't one.\n *\n * A selection made under a global search can hold items from anywhere, so a move\n * has a nameable source only when the whole set agrees on it. `null` also covers\n * the empty set. Callers pass the result straight to `formatMoveSuccessMessage`,\n * which drops the source from the wording rather than crediting one item's\n * folder to all of them.\n *\n * Note `null` is overloaded on purpose at the *label* level: an item at the\n * Media Library root also has a `null` location, and both cases end up reading\n * as \"no folder to name\". Use `hasUniformSource` when the difference matters.\n */\nexport const uniformSourceFolderId = (items: DragItemData[]): number | null => {\n if (!hasUniformSource(items)) {\n return null;\n }\n\n return sourceFolderIdOf(items[0]);\n};\n\n/** Whether every item in the set came from the same folder. False for an empty set. */\nexport const hasUniformSource = (items: DragItemData[]): boolean => {\n if (items.length === 0) {\n return false;\n }\n\n const first = sourceFolderIdOf(items[0]);\n\n return items.every((item) => sourceFolderIdOf(item) === first);\n};\n"],"names":["sourceFolderIdOf","item","kind","parentId","folderId","uniformSourceFolderId","items","hasUniformSource","length","first","every"],"mappings":"AAEA;;;AAGC,IACM,MAAMA,gBAAAA,GAAmB,CAACC,OAC/BA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWD,IAAAA,CAAKE,QAAQ,GAAGF,IAAAA,CAAKG;AAEhD;;;;;;;;;;;;IAaO,MAAMC,qBAAAA,GAAwB,CAACC,KAAAA,GAAAA;IACpC,IAAI,CAACC,iBAAiBD,KAAAA,CAAAA,EAAQ;QAC5B,OAAO,IAAA;AACT,IAAA;IAEA,OAAON,gBAAAA,CAAiBM,KAAK,CAAC,CAAA,CAAE,CAAA;AAClC;AAEA,wFACO,MAAMC,gBAAAA,GAAmB,CAACD,KAAAA,GAAAA;IAC/B,IAAIA,KAAAA,CAAME,MAAM,KAAK,CAAA,EAAG;QACtB,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQT,gBAAAA,CAAiBM,KAAK,CAAC,CAAA,CAAE,CAAA;AAEvC,IAAA,OAAOA,MAAMI,KAAK,CAAC,CAACT,IAAAA,GAASD,iBAAiBC,IAAAA,CAAAA,KAAUQ,KAAAA,CAAAA;AAC1D;;;;"}
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * `_q` must be encoded on both hops: `useQueryParams.setQuery` and the fetch
5
+ * client both stringify with `{ encode: false }`, so an unencoded `&` would
6
+ * truncate the query. `qs.parse` decodes `+` as a space, so `+` needs escaping
7
+ * beyond what `encodeURIComponent` does.
8
+ */ const encodeSearchQuery = (value)=>encodeURIComponent(value).replace(/\+/g, '%2B');
9
+
10
+ exports.encodeSearchQuery = encodeSearchQuery;
11
+ //# sourceMappingURL=searchQueryParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchQueryParam.js","sources":["../../../../admin/src/future/utils/searchQueryParam.ts"],"sourcesContent":["/**\n * `_q` must be encoded on both hops: `useQueryParams.setQuery` and the fetch\n * client both stringify with `{ encode: false }`, so an unencoded `&` would\n * truncate the query. `qs.parse` decodes `+` as a space, so `+` needs escaping\n * beyond what `encodeURIComponent` does.\n */\nexport const encodeSearchQuery = (value: string): string =>\n encodeURIComponent(value).replace(/\\+/g, '%2B');\n"],"names":["encodeSearchQuery","value","encodeURIComponent","replace"],"mappings":";;AAAA;;;;;IAMO,MAAMA,iBAAAA,GAAoB,CAACC,KAAAA,GAChCC,mBAAmBD,KAAAA,CAAAA,CAAOE,OAAO,CAAC,KAAA,EAAO,KAAA;;;;"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `_q` must be encoded on both hops: `useQueryParams.setQuery` and the fetch
3
+ * client both stringify with `{ encode: false }`, so an unencoded `&` would
4
+ * truncate the query. `qs.parse` decodes `+` as a space, so `+` needs escaping
5
+ * beyond what `encodeURIComponent` does.
6
+ */ const encodeSearchQuery = (value)=>encodeURIComponent(value).replace(/\+/g, '%2B');
7
+
8
+ export { encodeSearchQuery };
9
+ //# sourceMappingURL=searchQueryParam.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchQueryParam.mjs","sources":["../../../../admin/src/future/utils/searchQueryParam.ts"],"sourcesContent":["/**\n * `_q` must be encoded on both hops: `useQueryParams.setQuery` and the fetch\n * client both stringify with `{ encode: false }`, so an unencoded `&` would\n * truncate the query. `qs.parse` decodes `+` as a space, so `+` needs escaping\n * beyond what `encodeURIComponent` does.\n */\nexport const encodeSearchQuery = (value: string): string =>\n encodeURIComponent(value).replace(/\\+/g, '%2B');\n"],"names":["encodeSearchQuery","value","encodeURIComponent","replace"],"mappings":"AAAA;;;;;IAMO,MAAMA,iBAAAA,GAAoB,CAACC,KAAAA,GAChCC,mBAAmBD,KAAAA,CAAAA,CAAOE,OAAO,CAAC,KAAA,EAAO,KAAA;;;;"}
@@ -64,10 +64,8 @@ const useSelectionState = (keys, initialValue)=>{
64
64
  ]);
65
65
  };
66
66
  const deselectMultiple = (nextSelections)=>{
67
- setSelections((currSelections)=>[
68
- // filter out items in currSelections that are in nextSelections
69
- ...currSelections.filter((currentSelection)=>nextSelections.findIndex((nextSelection)=>keys.every((key)=>currentSelection[key] === nextSelection[key])) === -1)
70
- ]);
67
+ setSelections((currSelections)=>// filter out items in currSelections that are in nextSelections
68
+ currSelections.filter((currentSelection)=>nextSelections.findIndex((nextSelection)=>keys.every((key)=>currentSelection[key] === nextSelection[key])) === -1));
71
69
  };
72
70
  return [
73
71
  selections,
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectionState.js","sources":["../../../admin/src/hooks/useSelectionState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections?: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections!);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // filter out items in currSelections that are in nextSelections\n ...currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n"],"names":["useSelectionState","keys","initialValue","selections","setSelections","React","useState","selectOne","selection","index","findIndex","currentSelection","every","key","prevSelected","slice","selectAll","nextSelections","length","selectOnly","nextSelection","selectMultiple","currSelections","filter","deselectMultiple"],"mappings":"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"}
1
+ {"version":3,"file":"useSelectionState.js","sources":["../../../admin/src/hooks/useSelectionState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections?: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections!);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) =>\n // filter out items in currSelections that are in nextSelections\n currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n )\n );\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n"],"names":["useSelectionState","keys","initialValue","selections","setSelections","React","useState","selectOne","selection","index","findIndex","currentSelection","every","key","prevSelected","slice","selectAll","nextSelections","length","selectOnly","nextSelection","selectMultiple","currSelections","filter","deselectMultiple"],"mappings":"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"}
@@ -42,10 +42,8 @@ const useSelectionState = (keys, initialValue)=>{
42
42
  ]);
43
43
  };
44
44
  const deselectMultiple = (nextSelections)=>{
45
- setSelections((currSelections)=>[
46
- // filter out items in currSelections that are in nextSelections
47
- ...currSelections.filter((currentSelection)=>nextSelections.findIndex((nextSelection)=>keys.every((key)=>currentSelection[key] === nextSelection[key])) === -1)
48
- ]);
45
+ setSelections((currSelections)=>// filter out items in currSelections that are in nextSelections
46
+ currSelections.filter((currentSelection)=>nextSelections.findIndex((nextSelection)=>keys.every((key)=>currentSelection[key] === nextSelection[key])) === -1));
49
47
  };
50
48
  return [
51
49
  selections,
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectionState.mjs","sources":["../../../admin/src/hooks/useSelectionState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections?: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections!);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // filter out items in currSelections that are in nextSelections\n ...currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n"],"names":["useSelectionState","keys","initialValue","selections","setSelections","React","useState","selectOne","selection","index","findIndex","currentSelection","every","key","prevSelected","slice","selectAll","nextSelections","length","selectOnly","nextSelection","selectMultiple","currSelections","filter","deselectMultiple"],"mappings":"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"}
1
+ {"version":3,"file":"useSelectionState.mjs","sources":["../../../admin/src/hooks/useSelectionState.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const useSelectionState = <TValues extends object>(\n keys: Array<keyof TValues>,\n initialValue: TValues[]\n) => {\n const [selections, setSelections] = React.useState(initialValue);\n\n const selectOne = (selection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === selection[key])\n );\n\n if (index > -1) {\n setSelections((prevSelected) => [\n ...prevSelected.slice(0, index),\n ...prevSelected.slice(index + 1),\n ]);\n } else {\n setSelections((prevSelected) => [...prevSelected, selection]);\n }\n };\n\n const selectAll = (nextSelections?: TValues[]) => {\n if (selections.length > 0) {\n setSelections([]);\n } else {\n setSelections(nextSelections!);\n }\n };\n\n const selectOnly = (nextSelection: TValues) => {\n const index = selections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n );\n\n if (index > -1) {\n setSelections([]);\n } else {\n setSelections([nextSelection]);\n }\n };\n\n const selectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) => [\n // already selected items\n ...currSelections,\n // filter out already selected items from nextSelections\n ...nextSelections.filter(\n (nextSelection) =>\n currSelections.findIndex((currentSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n ),\n ]);\n };\n\n const deselectMultiple = (nextSelections: TValues[]) => {\n setSelections((currSelections) =>\n // filter out items in currSelections that are in nextSelections\n currSelections.filter(\n (currentSelection) =>\n nextSelections.findIndex((nextSelection) =>\n keys.every((key) => currentSelection[key] === nextSelection[key])\n ) === -1\n )\n );\n };\n\n return [\n selections,\n { selectOne, selectAll, selectOnly, selectMultiple, deselectMultiple, setSelections },\n ] as const;\n};\n"],"names":["useSelectionState","keys","initialValue","selections","setSelections","React","useState","selectOne","selection","index","findIndex","currentSelection","every","key","prevSelected","slice","selectAll","nextSelections","length","selectOnly","nextSelection","selectMultiple","currSelections","filter","deselectMultiple"],"mappings":";;AAEO,MAAMA,iBAAAA,GAAoB,CAC/BC,IAAAA,EACAC,YAAAA,GAAAA;AAEA,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,KAAAA,CAAMC,QAAQ,CAACJ,YAAAA,CAAAA;AAEnD,IAAA,MAAMK,YAAY,CAACC,SAAAA,GAAAA;AACjB,QAAA,MAAMC,QAAQN,UAAAA,CAAWO,SAAS,CAAC,CAACC,mBAClCV,IAAAA,CAAKW,KAAK,CAAC,CAACC,MAAQF,gBAAgB,CAACE,IAAI,KAAKL,SAAS,CAACK,GAAAA,CAAI,CAAA,CAAA;QAG9D,IAAIJ,KAAAA,GAAQ,EAAC,EAAG;AACdL,YAAAA,aAAAA,CAAc,CAACU,YAAAA,GAAiB;uBAC3BA,YAAAA,CAAaC,KAAK,CAAC,CAAA,EAAGN,KAAAA,CAAAA;uBACtBK,YAAAA,CAAaC,KAAK,CAACN,KAAAA,GAAQ,CAAA;AAC/B,iBAAA,CAAA;QACH,CAAA,MAAO;AACLL,YAAAA,aAAAA,CAAc,CAACU,YAAAA,GAAiB;AAAIA,oBAAAA,GAAAA,YAAAA;AAAcN,oBAAAA;AAAU,iBAAA,CAAA;AAC9D,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMQ,YAAY,CAACC,cAAAA,GAAAA;QACjB,IAAId,UAAAA,CAAWe,MAAM,GAAG,CAAA,EAAG;AACzBd,YAAAA,aAAAA,CAAc,EAAE,CAAA;QAClB,CAAA,MAAO;YACLA,aAAAA,CAAca,cAAAA,CAAAA;AAChB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAME,aAAa,CAACC,aAAAA,GAAAA;AAClB,QAAA,MAAMX,QAAQN,UAAAA,CAAWO,SAAS,CAAC,CAACC,mBAClCV,IAAAA,CAAKW,KAAK,CAAC,CAACC,MAAQF,gBAAgB,CAACE,IAAI,KAAKO,aAAa,CAACP,GAAAA,CAAI,CAAA,CAAA;QAGlE,IAAIJ,KAAAA,GAAQ,EAAC,EAAG;AACdL,YAAAA,aAAAA,CAAc,EAAE,CAAA;QAClB,CAAA,MAAO;YACLA,aAAAA,CAAc;AAACgB,gBAAAA;AAAc,aAAA,CAAA;AAC/B,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,iBAAiB,CAACJ,cAAAA,GAAAA;AACtBb,QAAAA,aAAAA,CAAc,CAACkB,cAAAA,GAAmB;;AAE7BA,gBAAAA,GAAAA,cAAAA;;mBAEAL,cAAAA,CAAeM,MAAM,CACtB,CAACH,aAAAA,GACCE,eAAeZ,SAAS,CAAC,CAACC,gBAAAA,GACxBV,IAAAA,CAAKW,KAAK,CAAC,CAACC,GAAAA,GAAQF,gBAAgB,CAACE,GAAAA,CAAI,KAAKO,aAAa,CAACP,GAAAA,CAAI,CAAA,CAAA,KAC5D,EAAC;AAEZ,aAAA,CAAA;AACH,IAAA,CAAA;AAEA,IAAA,MAAMW,mBAAmB,CAACP,cAAAA,GAAAA;QACxBb,aAAAA,CAAc,CAACkB;YAEbA,cAAAA,CAAeC,MAAM,CACnB,CAACZ,gBAAAA,GACCM,eAAeP,SAAS,CAAC,CAACU,aAAAA,GACxBnB,IAAAA,CAAKW,KAAK,CAAC,CAACC,GAAAA,GAAQF,gBAAgB,CAACE,GAAAA,CAAI,KAAKO,aAAa,CAACP,GAAAA,CAAI,CAAA,CAAA,KAC5D,EAAC,CAAA,CAAA;AAGf,IAAA,CAAA;IAEA,OAAO;AACLV,QAAAA,UAAAA;AACA,QAAA;AAAEI,YAAAA,SAAAA;AAAWS,YAAAA,SAAAA;AAAWG,YAAAA,UAAAA;AAAYE,YAAAA,cAAAA;AAAgBG,YAAAA,gBAAAA;AAAkBpB,YAAAA;AAAc;AACrF,KAAA;AACH;;;;"}
@@ -51,6 +51,11 @@ function __variableDynamicImportRuntime3__(path) {
51
51
  const name = _package.default.strapi.name;
52
52
  const admin = {
53
53
  register (app) {
54
+ /**
55
+ * The beta Media Library owns `plugins/upload` outright when the flag is on:
56
+ * the legacy app is not registered at all, so there is exactly one Media
57
+ * Library entry in the menu and no route to rename at GA.
58
+ */ const isBetaMediaLibrary = window.strapi.future.isEnabled('betaMediaLibrary');
54
59
  app.addMenuLink({
55
60
  to: `plugins/${pluginId.pluginId}`,
56
61
  icon: icons.Images,
@@ -59,14 +64,18 @@ const admin = {
59
64
  defaultMessage: 'Media Library'
60
65
  },
61
66
  permissions: constants.PERMISSIONS.main,
62
- Component: ()=>{
67
+ Component: isBetaMediaLibrary ? ()=>{
68
+ return Promise.resolve().then(function () { return require('./future/App.js'); }).then((mod)=>({
69
+ default: mod.BetaMediaLibrary
70
+ }));
71
+ } : ()=>{
63
72
  return Promise.resolve().then(function () { return require('./pages/App/App.js'); }).then((mod)=>({
64
73
  default: mod.Upload
65
74
  }));
66
75
  },
67
76
  position: 4
68
77
  });
69
- if (window.strapi.future.isEnabled('unstableMediaLibrary')) {
78
+ if (isBetaMediaLibrary) {
70
79
  app.addReducers({
71
80
  uploadProgress: uploadProgress.uploadProgressReducer
72
81
  });
@@ -76,21 +85,6 @@ const admin = {
76
85
  Component: UploadProgressDialog.UploadProgressDialog
77
86
  }
78
87
  ]);
79
- app.addMenuLink({
80
- to: `plugins/unstable-${pluginId.pluginId}`,
81
- icon: icons.WarningCircle,
82
- intlLabel: {
83
- id: `${pluginId.pluginId}.plugin.name`,
84
- defaultMessage: 'Media Library'
85
- },
86
- permissions: constants.PERMISSIONS.main,
87
- Component: ()=>{
88
- return Promise.resolve().then(function () { return require('./future/App.js'); }).then((mod)=>({
89
- default: mod.UnstableMediaLibrary
90
- }));
91
- },
92
- position: 5
93
- });
94
88
  }
95
89
  app.addSettingsLink('global', {
96
90
  id: 'media-library-settings',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images, WarningCircle } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { UploadProgressDialog } from './future/components/UploadProgressDialog';\nimport { uploadProgressReducer } from './future/store/uploadProgress';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./pages/App/App').then((mod) => ({ default: mod.Upload }));\n },\n position: 4,\n });\n\n if (window.strapi.future.isEnabled('unstableMediaLibrary')) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n\n app.addMenuLink({\n to: `plugins/unstable-${pluginId}`,\n icon: WarningCircle,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./future/App').then((mod) => ({\n default: mod.UnstableMediaLibrary,\n }));\n },\n position: 5,\n });\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","position","window","future","isEnabled","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","WarningCircle","UnstableMediaLibrary","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { UploadProgressDialog } from './future/components/UploadProgressDialog';\nimport { uploadProgressReducer } from './future/store/uploadProgress';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * The beta Media Library owns `plugins/upload` outright when the flag is on:\n * the legacy app is not registered at all, so there is exactly one Media\n * Library entry in the menu and no route to rename at GA.\n */\n const isBetaMediaLibrary = window.strapi.future.isEnabled('betaMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isBetaMediaLibrary\n ? () => {\n return import('./future/App').then((mod) => ({\n default: mod.BetaMediaLibrary,\n }));\n }\n : () => {\n return import('./pages/App/App').then((mod) => ({ default: mod.Upload }));\n },\n position: 4,\n });\n\n if (isBetaMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isBetaMediaLibrary","window","future","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","BetaMediaLibrary","Upload","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Images, WarningCircle } from '@strapi/icons';
1
+ import { Images } from '@strapi/icons';
2
2
  import pluginPkg from './package.json.mjs';
3
3
  import { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog.mjs';
4
4
  import { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput.mjs';
@@ -47,6 +47,11 @@ function __variableDynamicImportRuntime3__(path) {
47
47
  const name = pluginPkg.strapi.name;
48
48
  const admin = {
49
49
  register (app) {
50
+ /**
51
+ * The beta Media Library owns `plugins/upload` outright when the flag is on:
52
+ * the legacy app is not registered at all, so there is exactly one Media
53
+ * Library entry in the menu and no route to rename at GA.
54
+ */ const isBetaMediaLibrary = window.strapi.future.isEnabled('betaMediaLibrary');
50
55
  app.addMenuLink({
51
56
  to: `plugins/${pluginId}`,
52
57
  icon: Images,
@@ -55,14 +60,18 @@ const admin = {
55
60
  defaultMessage: 'Media Library'
56
61
  },
57
62
  permissions: PERMISSIONS.main,
58
- Component: ()=>{
63
+ Component: isBetaMediaLibrary ? ()=>{
64
+ return import('./future/App.mjs').then((mod)=>({
65
+ default: mod.BetaMediaLibrary
66
+ }));
67
+ } : ()=>{
59
68
  return import('./pages/App/App.mjs').then((mod)=>({
60
69
  default: mod.Upload
61
70
  }));
62
71
  },
63
72
  position: 4
64
73
  });
65
- if (window.strapi.future.isEnabled('unstableMediaLibrary')) {
74
+ if (isBetaMediaLibrary) {
66
75
  app.addReducers({
67
76
  uploadProgress: uploadProgressReducer
68
77
  });
@@ -72,21 +81,6 @@ const admin = {
72
81
  Component: UploadProgressDialog
73
82
  }
74
83
  ]);
75
- app.addMenuLink({
76
- to: `plugins/unstable-${pluginId}`,
77
- icon: WarningCircle,
78
- intlLabel: {
79
- id: `${pluginId}.plugin.name`,
80
- defaultMessage: 'Media Library'
81
- },
82
- permissions: PERMISSIONS.main,
83
- Component: ()=>{
84
- return import('./future/App.mjs').then((mod)=>({
85
- default: mod.UnstableMediaLibrary
86
- }));
87
- },
88
- position: 5
89
- });
90
84
  }
91
85
  app.addSettingsLink('global', {
92
86
  id: 'media-library-settings',
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images, WarningCircle } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { UploadProgressDialog } from './future/components/UploadProgressDialog';\nimport { uploadProgressReducer } from './future/store/uploadProgress';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./pages/App/App').then((mod) => ({ default: mod.Upload }));\n },\n position: 4,\n });\n\n if (window.strapi.future.isEnabled('unstableMediaLibrary')) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n\n app.addMenuLink({\n to: `plugins/unstable-${pluginId}`,\n icon: WarningCircle,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./future/App').then((mod) => ({\n default: mod.UnstableMediaLibrary,\n }));\n },\n position: 5,\n });\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","position","window","future","isEnabled","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","WarningCircle","UnstableMediaLibrary","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,IAAAA,GAAOC,SAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC,MAAMG,KAAAA,GAAkC;AACtCC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrBA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;YACdC,EAAAA,EAAI,CAAC,QAAQ,EAAEC,QAAAA,CAAAA,CAAU;YACzBC,IAAAA,EAAMC,MAAAA;YACNC,SAAAA,EAAW;gBACTC,EAAAA,EAAI,CAAA,EAAGJ,QAAAA,CAAS,YAAY,CAAC;gBAC7BK,cAAAA,EAAgB;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,YAAYC,IAAI;YAC7BC,SAAAA,EAAW,IAAA;AACT,gBAAA,OAAO,OAAO,qBAAA,CAAA,CAAmBC,IAAI,CAAC,CAACC,OAAS;AAAEC,wBAAAA,OAAAA,EAASD,IAAIE;qBAAO,CAAA,CAAA;AACxE,YAAA,CAAA;YACAC,QAAAA,EAAU;AACZ,SAAA,CAAA;AAEA,QAAA,IAAIC,OAAOrB,MAAM,CAACsB,MAAM,CAACC,SAAS,CAAC,sBAAA,CAAA,EAAyB;AAC1DpB,YAAAA,GAAAA,CAAIqB,WAAW,CAAC;gBAAEC,cAAAA,EAAgBC;AAAsB,aAAA,CAAA;AAExDvB,YAAAA,GAAAA,CAAIwB,aAAa,CAAC;AAChB,gBAAA;oBACE7B,IAAAA,EAAM,gCAAA;oBACNiB,SAAAA,EAAWa;AACb;AACD,aAAA,CAAA;AAEDzB,YAAAA,GAAAA,CAAIC,WAAW,CAAC;gBACdC,EAAAA,EAAI,CAAC,iBAAiB,EAAEC,QAAAA,CAAAA,CAAU;gBAClCC,IAAAA,EAAMsB,aAAAA;gBACNpB,SAAAA,EAAW;oBACTC,EAAAA,EAAI,CAAA,EAAGJ,QAAAA,CAAS,YAAY,CAAC;oBAC7BK,cAAAA,EAAgB;AAClB,iBAAA;AACAC,gBAAAA,WAAAA,EAAaC,YAAYC,IAAI;gBAC7BC,SAAAA,EAAW,IAAA;AACT,oBAAA,OAAO,OAAO,kBAAA,CAAA,CAAgBC,IAAI,CAAC,CAACC,OAAS;AAC3CC,4BAAAA,OAAAA,EAASD,IAAIa;yBACf,CAAA,CAAA;AACF,gBAAA,CAAA;gBACAV,QAAAA,EAAU;AACZ,aAAA,CAAA;AACF,QAAA;QAEAjB,GAAAA,CAAI4B,eAAe,CAAC,QAAA,EAAU;YAC5BrB,EAAAA,EAAI,wBAAA;YACJL,EAAAA,EAAI,eAAA;YACJI,SAAAA,EAAW;AACTC,gBAAAA,EAAAA,EAAIsB,OAAAA,CAAQ,aAAA,CAAA;gBACZrB,cAAAA,EAAgB;AAClB,aAAA;AACAI,YAAAA,SAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAO,OAAO,uCAAA,CAAA,CAAqCC,IAAI,CAAC,CAACC,OAAS;AAChEC,wBAAAA,OAAAA,EAASD,IAAIgB;qBACf,CAAA,CAAA;AACF,YAAA,CAAA;AACArB,YAAAA,WAAAA,EAAaC,YAAYqB;AAC3B,SAAA,CAAA;AAEA/B,QAAAA,GAAAA,CAAIgC,SAAS,CAAC;YACZC,IAAAA,EAAM,OAAA;YACNrB,SAAAA,EAAWsB;AACb,SAAA,CAAA;AACAlC,QAAAA,GAAAA,CAAIwB,aAAa,CAAC;AAChB,YAAA;gBACE7B,IAAAA,EAAM,eAAA;gBACNiB,SAAAA,EAAWuB;AACb;AACD,SAAA,CAAA;AAEDnC,QAAAA,GAAAA,CAAIoC,cAAc,CAAC;YACjB7B,EAAAA,EAAIJ,QAAAA;AACJR,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACA,MAAM0C,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1C9B,IAAI,CAAC,CAAC,EAAEE,OAAAA,EAAS6B,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAAA,EAAMzC,QAAAA,CAAAA;AACrCwC,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCG,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPD,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQO,OAAO,CAACR,aAAAA,CAAAA;AACzB,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { UploadProgressDialog } from './future/components/UploadProgressDialog';\nimport { uploadProgressReducer } from './future/store/uploadProgress';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * The beta Media Library owns `plugins/upload` outright when the flag is on:\n * the legacy app is not registered at all, so there is exactly one Media\n * Library entry in the menu and no route to rename at GA.\n */\n const isBetaMediaLibrary = window.strapi.future.isEnabled('betaMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isBetaMediaLibrary\n ? () => {\n return import('./future/App').then((mod) => ({\n default: mod.BetaMediaLibrary,\n }));\n }\n : () => {\n return import('./pages/App/App').then((mod) => ({ default: mod.Upload }));\n },\n position: 4,\n });\n\n if (isBetaMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isBetaMediaLibrary","window","future","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","BetaMediaLibrary","Upload","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Constants shared by the upload server and the admin panel.
5
+ *
6
+ * The server stays authoritative — it validates and rejects — but the admin
7
+ * needs the same values to disable actions up front rather than letting the
8
+ * user discover a limit through a failed request.
9
+ */ /**
10
+ * Image formats the AI metadata provider can read.
11
+ *
12
+ * Anything outside this list (non-images, but also exotic image formats like
13
+ * SVG or TIFF) is reported as `skipped` instead of being sent.
14
+ *
15
+ * @see https://ai.google.dev/gemini-api/docs/image-understanding
16
+ */ const AI_METADATA_SUPPORTED_IMAGE_TYPES = [
17
+ 'image/png',
18
+ 'image/jpeg',
19
+ 'image/webp',
20
+ 'image/heic',
21
+ 'image/heif'
22
+ ];
23
+ /**
24
+ * Whether the AI metadata provider can generate metadata for this mime type.
25
+ */ const isAIMetadataSupportedMime = (mime)=>AI_METADATA_SUPPORTED_IMAGE_TYPES.includes(mime);
26
+ /**
27
+ * Number of images sent to the AI server per request when generating metadata
28
+ * for an explicit selection. Matches the URL cap of the bulk URL upload flow.
29
+ */ const AI_METADATA_CHUNK_SIZE = 20;
30
+ /**
31
+ * Upper bound on a single synchronous AI metadata request.
32
+ *
33
+ * The selection is processed in sequential chunks inside one HTTP request, so
34
+ * an unbounded selection means an unbounded request — long past most proxy and
35
+ * load balancer timeouts, with no way for the client to learn what was written.
36
+ * Rejecting with a 400 lets the UI ask for a smaller selection instead.
37
+ */ const AI_METADATA_MAX_FILES = AI_METADATA_CHUNK_SIZE * 2;
38
+
39
+ exports.AI_METADATA_CHUNK_SIZE = AI_METADATA_CHUNK_SIZE;
40
+ exports.AI_METADATA_MAX_FILES = AI_METADATA_MAX_FILES;
41
+ exports.AI_METADATA_SUPPORTED_IMAGE_TYPES = AI_METADATA_SUPPORTED_IMAGE_TYPES;
42
+ exports.isAIMetadataSupportedMime = isAIMetadataSupportedMime;
43
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../shared/constants.ts"],"sourcesContent":["/**\n * Constants shared by the upload server and the admin panel.\n *\n * The server stays authoritative — it validates and rejects — but the admin\n * needs the same values to disable actions up front rather than letting the\n * user discover a limit through a failed request.\n */\n\n/**\n * Image formats the AI metadata provider can read.\n *\n * Anything outside this list (non-images, but also exotic image formats like\n * SVG or TIFF) is reported as `skipped` instead of being sent.\n *\n * @see https://ai.google.dev/gemini-api/docs/image-understanding\n */\nexport const AI_METADATA_SUPPORTED_IMAGE_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/heic',\n 'image/heif',\n] as const;\n\nexport type AIMetadataSupportedImageType = (typeof AI_METADATA_SUPPORTED_IMAGE_TYPES)[number];\n\n/**\n * Whether the AI metadata provider can generate metadata for this mime type.\n */\nexport const isAIMetadataSupportedMime = (mime?: string | null): boolean =>\n AI_METADATA_SUPPORTED_IMAGE_TYPES.includes(mime as AIMetadataSupportedImageType);\n\n/**\n * Number of images sent to the AI server per request when generating metadata\n * for an explicit selection. Matches the URL cap of the bulk URL upload flow.\n */\nexport const AI_METADATA_CHUNK_SIZE = 20;\n\n/**\n * Upper bound on a single synchronous AI metadata request.\n *\n * The selection is processed in sequential chunks inside one HTTP request, so\n * an unbounded selection means an unbounded request — long past most proxy and\n * load balancer timeouts, with no way for the client to learn what was written.\n * Rejecting with a 400 lets the UI ask for a smaller selection instead.\n */\nexport const AI_METADATA_MAX_FILES = AI_METADATA_CHUNK_SIZE * 2;\n"],"names":["AI_METADATA_SUPPORTED_IMAGE_TYPES","isAIMetadataSupportedMime","mime","includes","AI_METADATA_CHUNK_SIZE","AI_METADATA_MAX_FILES"],"mappings":";;AAAA;;;;;;;;;;;;;UAgBaA,iCAAAA,GAAoC;AAC/C,IAAA,WAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;;AAKF;;UAGaC,yBAAAA,GAA4B,CAACC,OACxCF,iCAAAA,CAAkCG,QAAQ,CAACD,IAAAA;AAE7C;;;IAIO,MAAME,sBAAAA,GAAyB;AAEtC;;;;;;;AAOC,IACM,MAAMC,qBAAAA,GAAwBD,sBAAAA,GAAyB;;;;;;;"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Constants shared by the upload server and the admin panel.
3
+ *
4
+ * The server stays authoritative — it validates and rejects — but the admin
5
+ * needs the same values to disable actions up front rather than letting the
6
+ * user discover a limit through a failed request.
7
+ */ /**
8
+ * Image formats the AI metadata provider can read.
9
+ *
10
+ * Anything outside this list (non-images, but also exotic image formats like
11
+ * SVG or TIFF) is reported as `skipped` instead of being sent.
12
+ *
13
+ * @see https://ai.google.dev/gemini-api/docs/image-understanding
14
+ */ const AI_METADATA_SUPPORTED_IMAGE_TYPES = [
15
+ 'image/png',
16
+ 'image/jpeg',
17
+ 'image/webp',
18
+ 'image/heic',
19
+ 'image/heif'
20
+ ];
21
+ /**
22
+ * Whether the AI metadata provider can generate metadata for this mime type.
23
+ */ const isAIMetadataSupportedMime = (mime)=>AI_METADATA_SUPPORTED_IMAGE_TYPES.includes(mime);
24
+ /**
25
+ * Number of images sent to the AI server per request when generating metadata
26
+ * for an explicit selection. Matches the URL cap of the bulk URL upload flow.
27
+ */ const AI_METADATA_CHUNK_SIZE = 20;
28
+ /**
29
+ * Upper bound on a single synchronous AI metadata request.
30
+ *
31
+ * The selection is processed in sequential chunks inside one HTTP request, so
32
+ * an unbounded selection means an unbounded request — long past most proxy and
33
+ * load balancer timeouts, with no way for the client to learn what was written.
34
+ * Rejecting with a 400 lets the UI ask for a smaller selection instead.
35
+ */ const AI_METADATA_MAX_FILES = AI_METADATA_CHUNK_SIZE * 2;
36
+
37
+ export { AI_METADATA_CHUNK_SIZE, AI_METADATA_MAX_FILES, AI_METADATA_SUPPORTED_IMAGE_TYPES, isAIMetadataSupportedMime };
38
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../../shared/constants.ts"],"sourcesContent":["/**\n * Constants shared by the upload server and the admin panel.\n *\n * The server stays authoritative — it validates and rejects — but the admin\n * needs the same values to disable actions up front rather than letting the\n * user discover a limit through a failed request.\n */\n\n/**\n * Image formats the AI metadata provider can read.\n *\n * Anything outside this list (non-images, but also exotic image formats like\n * SVG or TIFF) is reported as `skipped` instead of being sent.\n *\n * @see https://ai.google.dev/gemini-api/docs/image-understanding\n */\nexport const AI_METADATA_SUPPORTED_IMAGE_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/heic',\n 'image/heif',\n] as const;\n\nexport type AIMetadataSupportedImageType = (typeof AI_METADATA_SUPPORTED_IMAGE_TYPES)[number];\n\n/**\n * Whether the AI metadata provider can generate metadata for this mime type.\n */\nexport const isAIMetadataSupportedMime = (mime?: string | null): boolean =>\n AI_METADATA_SUPPORTED_IMAGE_TYPES.includes(mime as AIMetadataSupportedImageType);\n\n/**\n * Number of images sent to the AI server per request when generating metadata\n * for an explicit selection. Matches the URL cap of the bulk URL upload flow.\n */\nexport const AI_METADATA_CHUNK_SIZE = 20;\n\n/**\n * Upper bound on a single synchronous AI metadata request.\n *\n * The selection is processed in sequential chunks inside one HTTP request, so\n * an unbounded selection means an unbounded request — long past most proxy and\n * load balancer timeouts, with no way for the client to learn what was written.\n * Rejecting with a 400 lets the UI ask for a smaller selection instead.\n */\nexport const AI_METADATA_MAX_FILES = AI_METADATA_CHUNK_SIZE * 2;\n"],"names":["AI_METADATA_SUPPORTED_IMAGE_TYPES","isAIMetadataSupportedMime","mime","includes","AI_METADATA_CHUNK_SIZE","AI_METADATA_MAX_FILES"],"mappings":"AAAA;;;;;;;;;;;;;UAgBaA,iCAAAA,GAAoC;AAC/C,IAAA,WAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;;AAKF;;UAGaC,yBAAAA,GAA4B,CAACC,OACxCF,iCAAAA,CAAkCG,QAAQ,CAACD,IAAAA;AAE7C;;;IAIO,MAAME,sBAAAA,GAAyB;AAEtC;;;;;;;AAOC,IACM,MAAMC,qBAAAA,GAAwBD,sBAAAA,GAAyB;;;;"}
@@ -1 +1 @@
1
- export declare const UnstableMediaLibrary: () => import("react/jsx-runtime").JSX.Element;
1
+ export declare const BetaMediaLibrary: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The beta indicator is a notice rather than a badge on the page header: that
3
+ * header's title follows the folder you are in, so a badge attached to it would
4
+ * read as "this folder is beta". This notice covers the whole Media Library, and
5
+ * stays dismissed once a tester has read it.
6
+ *
7
+ * It renders inside `Layouts.Content` so it picks up the content column's gutter.
8
+ * Rendered above the layout instead, it would span the full viewport width and
9
+ * sit over the folder sidebar.
10
+ */
11
+ export declare const BetaNotice: () => import("react/jsx-runtime").JSX.Element | null;