@strapi/upload 5.37.0 → 5.38.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 (526) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  2. package/dist/admin/ai/components/AIAssetCard.mjs +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  4. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  5. package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
  6. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  8. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
  10. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
  11. package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -1
  12. package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -1
  14. package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -1
  15. package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
  16. package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
  17. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  18. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  19. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  20. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  21. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  22. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
  23. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  24. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  25. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  26. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  27. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -1
  28. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  29. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -1
  30. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  32. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  33. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -1
  34. package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -1
  35. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
  36. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -1
  37. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -1
  38. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -1
  39. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  40. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  41. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -1
  42. package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -1
  43. package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -1
  44. package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -1
  45. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
  46. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
  47. package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
  48. package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
  49. package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
  50. package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -1
  51. package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  52. package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
  53. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  54. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  55. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  56. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  57. package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -1
  58. package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -1
  59. package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
  60. package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -1
  62. package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  64. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  65. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  66. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  67. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
  68. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
  69. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
  70. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
  71. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -4
  72. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  73. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -4
  74. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  75. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
  76. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
  77. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -1
  78. package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -1
  79. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  80. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  81. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
  82. package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
  83. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
  84. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
  85. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -1
  86. package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -1
  87. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
  88. package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
  89. package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -1
  90. package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -1
  91. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  92. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  93. package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
  94. package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
  95. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  96. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  97. package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -1
  98. package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  99. package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -1
  100. package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -1
  101. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
  102. package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -1
  103. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
  104. package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
  105. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -1
  106. package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -1
  107. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
  108. package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
  109. package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -1
  110. package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -1
  111. package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -1
  112. package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -1
  113. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  114. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  115. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  116. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  117. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
  118. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
  119. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  120. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  121. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  122. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  123. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  124. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  125. package/dist/admin/components/SelectTree/Option.js.map +1 -1
  126. package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
  127. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  128. package/dist/admin/components/SelectTree/SelectTree.mjs +1 -1
  129. package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
  130. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  131. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  132. package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -1
  133. package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -1
  134. package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -1
  135. package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -1
  136. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  137. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  138. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  139. package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
  140. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  141. package/dist/admin/components/TableList/PreviewCell.mjs +1 -1
  142. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  143. package/dist/admin/components/TableList/TableList.js.map +1 -1
  144. package/dist/admin/components/TableList/TableList.mjs +1 -1
  145. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  146. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  147. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  148. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
  149. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
  150. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  151. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  152. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  153. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  154. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  155. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  156. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  157. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  158. package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
  159. package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
  160. package/dist/admin/constants.js.map +1 -1
  161. package/dist/admin/constants.mjs.map +1 -1
  162. package/dist/admin/future/App.js.map +1 -1
  163. package/dist/admin/future/App.mjs.map +1 -1
  164. package/dist/admin/future/components/Drawer.js +189 -0
  165. package/dist/admin/future/components/Drawer.js.map +1 -0
  166. package/dist/admin/future/components/Drawer.mjs +166 -0
  167. package/dist/admin/future/components/Drawer.mjs.map +1 -0
  168. package/dist/admin/future/components/UploadProgressDialog.js +60 -101
  169. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  170. package/dist/admin/future/components/UploadProgressDialog.mjs +62 -84
  171. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  172. package/dist/admin/future/pages/Assets/AssetsPage.js +155 -100
  173. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  174. package/dist/admin/future/pages/Assets/AssetsPage.mjs +160 -105
  175. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  176. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +406 -0
  177. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -0
  178. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +384 -0
  179. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -0
  180. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +215 -0
  181. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -0
  182. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +194 -0
  183. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -0
  184. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +37 -8
  185. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  186. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +38 -9
  187. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  188. package/dist/admin/future/pages/Assets/components/AssetsTable.js +35 -5
  189. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  190. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +37 -7
  191. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  192. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js +143 -0
  193. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +1 -0
  194. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs +141 -0
  195. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +1 -0
  196. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  197. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
  198. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  199. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  200. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +127 -0
  201. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -0
  202. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs +106 -0
  203. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs.map +1 -0
  204. package/dist/admin/future/pages/Assets/constants.js.map +1 -1
  205. package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
  206. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
  207. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
  208. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  209. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  210. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  211. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  212. package/dist/admin/future/services/api.js +181 -97
  213. package/dist/admin/future/services/api.js.map +1 -1
  214. package/dist/admin/future/services/api.mjs +181 -98
  215. package/dist/admin/future/services/api.mjs.map +1 -1
  216. package/dist/admin/future/services/assets.js +14 -1
  217. package/dist/admin/future/services/assets.js.map +1 -1
  218. package/dist/admin/future/services/assets.mjs +14 -2
  219. package/dist/admin/future/services/assets.mjs.map +1 -1
  220. package/dist/admin/future/services/folders.js +16 -1
  221. package/dist/admin/future/services/folders.js.map +1 -1
  222. package/dist/admin/future/services/folders.mjs +16 -2
  223. package/dist/admin/future/services/folders.mjs.map +1 -1
  224. package/dist/admin/future/store/hooks.js.map +1 -1
  225. package/dist/admin/future/store/hooks.mjs.map +1 -1
  226. package/dist/admin/future/store/uploadProgress.js +7 -4
  227. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  228. package/dist/admin/future/store/uploadProgress.mjs +7 -4
  229. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  230. package/dist/admin/future/utils/files.js +105 -3
  231. package/dist/admin/future/utils/files.js.map +1 -1
  232. package/dist/admin/future/utils/files.mjs +104 -4
  233. package/dist/admin/future/utils/files.mjs.map +1 -1
  234. package/dist/admin/future/utils/getAssetIcon.js +3 -3
  235. package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
  236. package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
  237. package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
  238. package/dist/admin/future/utils/translations.js.map +1 -1
  239. package/dist/admin/future/utils/translations.mjs.map +1 -1
  240. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  241. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
  242. package/dist/admin/hooks/useAiAvailability.js.map +1 -1
  243. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -1
  244. package/dist/admin/hooks/useAssets.js.map +1 -1
  245. package/dist/admin/hooks/useAssets.mjs.map +1 -1
  246. package/dist/admin/hooks/useBulkEdit.js.map +1 -1
  247. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
  248. package/dist/admin/hooks/useBulkMove.js.map +1 -1
  249. package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
  250. package/dist/admin/hooks/useBulkRemove.js.map +1 -1
  251. package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
  252. package/dist/admin/hooks/useConfig.js.map +1 -1
  253. package/dist/admin/hooks/useConfig.mjs.map +1 -1
  254. package/dist/admin/hooks/useCropImg.js.map +1 -1
  255. package/dist/admin/hooks/useCropImg.mjs.map +1 -1
  256. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  257. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  258. package/dist/admin/hooks/useEditFolder.js.map +1 -1
  259. package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
  260. package/dist/admin/hooks/useFolder.js.map +1 -1
  261. package/dist/admin/hooks/useFolder.mjs.map +1 -1
  262. package/dist/admin/hooks/useFolderStructure.js.map +1 -1
  263. package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
  264. package/dist/admin/hooks/useFolders.js.map +1 -1
  265. package/dist/admin/hooks/useFolders.mjs.map +1 -1
  266. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  267. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  268. package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
  269. package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
  270. package/dist/admin/hooks/usePersistentState.js.map +1 -1
  271. package/dist/admin/hooks/usePersistentState.mjs.map +1 -1
  272. package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
  273. package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
  274. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  275. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  276. package/dist/admin/hooks/useSettings.js.map +1 -1
  277. package/dist/admin/hooks/useSettings.mjs.map +1 -1
  278. package/dist/admin/hooks/useTracking.js.map +1 -1
  279. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  280. package/dist/admin/hooks/useUpload.js.map +1 -1
  281. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  282. package/dist/admin/hooks/utils/renameKeys.js.map +1 -1
  283. package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -1
  284. package/dist/admin/index.js.map +1 -1
  285. package/dist/admin/index.mjs.map +1 -1
  286. package/dist/admin/package.json.js +1 -152
  287. package/dist/admin/package.json.js.map +1 -1
  288. package/dist/admin/package.json.mjs +2 -141
  289. package/dist/admin/package.json.mjs.map +1 -1
  290. package/dist/admin/pages/App/App.js.map +1 -1
  291. package/dist/admin/pages/App/App.mjs.map +1 -1
  292. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  293. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +3 -3
  294. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  295. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  296. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  297. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
  298. package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
  299. package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -1
  300. package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -1
  301. package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -1
  302. package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -1
  303. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
  304. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +1 -1
  305. package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -1
  306. package/dist/admin/pages/App/MediaLibrary.js +1 -1
  307. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  308. package/dist/admin/pages/App/MediaLibrary.mjs +2 -2
  309. package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
  310. package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
  311. package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
  312. package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -1
  313. package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -1
  314. package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
  315. package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -1
  316. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
  317. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
  318. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  319. package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
  320. package/dist/admin/pages/App/components/Header.js.map +1 -1
  321. package/dist/admin/pages/App/components/Header.mjs +2 -2
  322. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  323. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  324. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  325. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  326. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  327. package/dist/admin/pluginId.js.map +1 -1
  328. package/dist/admin/pluginId.mjs.map +1 -1
  329. package/dist/admin/src/future/components/Drawer.d.ts +32 -0
  330. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
  331. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +6 -0
  332. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +2 -1
  333. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +2 -1
  334. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +8 -0
  335. package/dist/admin/src/future/pages/Assets/components/ImportFromUrlDialog.d.ts +7 -0
  336. package/dist/admin/src/future/services/api.d.ts +10 -1
  337. package/dist/admin/src/future/services/assets.d.ts +2 -2
  338. package/dist/admin/src/future/services/folders.d.ts +1 -1
  339. package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
  340. package/dist/admin/src/future/utils/files.d.ts +70 -0
  341. package/dist/admin/translations/en.json.js +35 -3
  342. package/dist/admin/translations/en.json.js.map +1 -1
  343. package/dist/admin/translations/en.json.mjs +35 -3
  344. package/dist/admin/translations/en.json.mjs.map +1 -1
  345. package/dist/admin/translations/es.json.js +1 -1
  346. package/dist/admin/translations/es.json.mjs +1 -1
  347. package/dist/admin/utils/appendSearchParamsToUrl.js.map +1 -1
  348. package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -1
  349. package/dist/admin/utils/containsAssetFilter.js.map +1 -1
  350. package/dist/admin/utils/containsAssetFilter.mjs.map +1 -1
  351. package/dist/admin/utils/createAssetUrl.js.map +1 -1
  352. package/dist/admin/utils/createAssetUrl.mjs.map +1 -1
  353. package/dist/admin/utils/displayedFilters.js.map +1 -1
  354. package/dist/admin/utils/displayedFilters.mjs.map +1 -1
  355. package/dist/admin/utils/downloadFile.js.map +1 -1
  356. package/dist/admin/utils/downloadFile.mjs.map +1 -1
  357. package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -1
  358. package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -1
  359. package/dist/admin/utils/formatBytes.js.map +1 -1
  360. package/dist/admin/utils/formatBytes.mjs.map +1 -1
  361. package/dist/admin/utils/formatDuration.js.map +1 -1
  362. package/dist/admin/utils/formatDuration.mjs.map +1 -1
  363. package/dist/admin/utils/getAPIInnerErrors.js.map +1 -1
  364. package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -1
  365. package/dist/admin/utils/getAllowedFiles.js.map +1 -1
  366. package/dist/admin/utils/getAllowedFiles.mjs.map +1 -1
  367. package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -1
  368. package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -1
  369. package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -1
  370. package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -1
  371. package/dist/admin/utils/getFileExtension.js.map +1 -1
  372. package/dist/admin/utils/getFileExtension.mjs.map +1 -1
  373. package/dist/admin/utils/getFolderParents.js.map +1 -1
  374. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  375. package/dist/admin/utils/getFolderURL.js.map +1 -1
  376. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  377. package/dist/admin/utils/getTrad.js.map +1 -1
  378. package/dist/admin/utils/getTrad.mjs.map +1 -1
  379. package/dist/admin/utils/icons.js.map +1 -1
  380. package/dist/admin/utils/icons.mjs +1 -1
  381. package/dist/admin/utils/icons.mjs.map +1 -1
  382. package/dist/admin/utils/moveElement.js.map +1 -1
  383. package/dist/admin/utils/moveElement.mjs.map +1 -1
  384. package/dist/admin/utils/normalizeAPIError.js.map +1 -1
  385. package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
  386. package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
  387. package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
  388. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  389. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  390. package/dist/admin/utils/rawFileToAsset.js.map +1 -1
  391. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
  392. package/dist/admin/utils/toSingularTypes.js.map +1 -1
  393. package/dist/admin/utils/toSingularTypes.mjs.map +1 -1
  394. package/dist/admin/utils/typeFromMime.js.map +1 -1
  395. package/dist/admin/utils/typeFromMime.mjs.map +1 -1
  396. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  397. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  398. package/dist/admin/utils/urlsToAssets.js.map +1 -1
  399. package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
  400. package/dist/server/bootstrap.js.map +1 -1
  401. package/dist/server/bootstrap.mjs.map +1 -1
  402. package/dist/server/config.js.map +1 -1
  403. package/dist/server/config.mjs.map +1 -1
  404. package/dist/server/constants.js.map +1 -1
  405. package/dist/server/constants.mjs.map +1 -1
  406. package/dist/server/content-types/file.js.map +1 -1
  407. package/dist/server/content-types/file.mjs.map +1 -1
  408. package/dist/server/content-types/folder.js.map +1 -1
  409. package/dist/server/content-types/folder.mjs +1 -1
  410. package/dist/server/content-types/folder.mjs.map +1 -1
  411. package/dist/server/content-types/index.js.map +1 -1
  412. package/dist/server/content-types/index.mjs.map +1 -1
  413. package/dist/server/controllers/admin-file.js.map +1 -1
  414. package/dist/server/controllers/admin-file.mjs +1 -1
  415. package/dist/server/controllers/admin-file.mjs.map +1 -1
  416. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  417. package/dist/server/controllers/admin-folder-file.mjs +2 -2
  418. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  419. package/dist/server/controllers/admin-folder.js.map +1 -1
  420. package/dist/server/controllers/admin-folder.mjs +1 -1
  421. package/dist/server/controllers/admin-folder.mjs.map +1 -1
  422. package/dist/server/controllers/admin-settings.js.map +1 -1
  423. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  424. package/dist/server/controllers/admin-upload.js +144 -0
  425. package/dist/server/controllers/admin-upload.js.map +1 -1
  426. package/dist/server/controllers/admin-upload.mjs +147 -3
  427. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  428. package/dist/server/controllers/content-api.js.map +1 -1
  429. package/dist/server/controllers/content-api.mjs.map +1 -1
  430. package/dist/server/controllers/index.js.map +1 -1
  431. package/dist/server/controllers/index.mjs.map +1 -1
  432. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
  433. package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
  434. package/dist/server/controllers/utils/folders.js.map +1 -1
  435. package/dist/server/controllers/utils/folders.mjs.map +1 -1
  436. package/dist/server/controllers/validation/admin/configureView.js.map +1 -1
  437. package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -1
  438. package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
  439. package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
  440. package/dist/server/controllers/validation/admin/folder.js.map +1 -1
  441. package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
  442. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  443. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  444. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  445. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  446. package/dist/server/controllers/validation/admin/utils.js.map +1 -1
  447. package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
  448. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  449. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  450. package/dist/server/controllers/view-configuration.js.map +1 -1
  451. package/dist/server/controllers/view-configuration.mjs.map +1 -1
  452. package/dist/server/graphql.js.map +1 -1
  453. package/dist/server/graphql.mjs.map +1 -1
  454. package/dist/server/index.js +8 -8
  455. package/dist/server/middlewares/upload.js.map +1 -1
  456. package/dist/server/middlewares/upload.mjs.map +1 -1
  457. package/dist/server/models/ai-metadata-job.js.map +1 -1
  458. package/dist/server/models/ai-metadata-job.mjs.map +1 -1
  459. package/dist/server/register.js.map +1 -1
  460. package/dist/server/register.mjs.map +1 -1
  461. package/dist/server/routes/admin.js +10 -0
  462. package/dist/server/routes/admin.js.map +1 -1
  463. package/dist/server/routes/admin.mjs +10 -0
  464. package/dist/server/routes/admin.mjs.map +1 -1
  465. package/dist/server/routes/content-api.js.map +1 -1
  466. package/dist/server/routes/content-api.mjs.map +1 -1
  467. package/dist/server/routes/index.js.map +1 -1
  468. package/dist/server/routes/index.mjs +4 -4
  469. package/dist/server/routes/index.mjs.map +1 -1
  470. package/dist/server/routes/validation/upload.js.map +1 -1
  471. package/dist/server/routes/validation/upload.mjs.map +1 -1
  472. package/dist/server/routes/view-configuration.js.map +1 -1
  473. package/dist/server/routes/view-configuration.mjs.map +1 -1
  474. package/dist/server/services/ai-metadata-jobs.js.map +1 -1
  475. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
  476. package/dist/server/services/ai-metadata.js.map +1 -1
  477. package/dist/server/services/ai-metadata.mjs.map +1 -1
  478. package/dist/server/services/api-upload-folder.js.map +1 -1
  479. package/dist/server/services/api-upload-folder.mjs.map +1 -1
  480. package/dist/server/services/extensions/index.js.map +1 -1
  481. package/dist/server/services/extensions/index.mjs.map +1 -1
  482. package/dist/server/services/extensions/utils.js.map +1 -1
  483. package/dist/server/services/extensions/utils.mjs.map +1 -1
  484. package/dist/server/services/file.js +120 -1
  485. package/dist/server/services/file.js.map +1 -1
  486. package/dist/server/services/file.mjs +122 -3
  487. package/dist/server/services/file.mjs.map +1 -1
  488. package/dist/server/services/folder.js.map +1 -1
  489. package/dist/server/services/folder.mjs +1 -1
  490. package/dist/server/services/folder.mjs.map +1 -1
  491. package/dist/server/services/image-manipulation.js.map +1 -1
  492. package/dist/server/services/image-manipulation.mjs +1 -1
  493. package/dist/server/services/image-manipulation.mjs.map +1 -1
  494. package/dist/server/services/index.js.map +1 -1
  495. package/dist/server/services/index.mjs.map +1 -1
  496. package/dist/server/services/metrics.js.map +1 -1
  497. package/dist/server/services/metrics.mjs.map +1 -1
  498. package/dist/server/services/provider.js.map +1 -1
  499. package/dist/server/services/provider.mjs.map +1 -1
  500. package/dist/server/services/upload.js.map +1 -1
  501. package/dist/server/services/upload.mjs +1 -1
  502. package/dist/server/services/upload.mjs.map +1 -1
  503. package/dist/server/services/weekly-metrics.js.map +1 -1
  504. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  505. package/dist/server/src/controllers/admin-upload.d.ts +13 -0
  506. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  507. package/dist/server/src/controllers/index.d.ts +1 -0
  508. package/dist/server/src/controllers/index.d.ts.map +1 -1
  509. package/dist/server/src/index.d.ts +2 -0
  510. package/dist/server/src/index.d.ts.map +1 -1
  511. package/dist/server/src/routes/admin.d.ts.map +1 -1
  512. package/dist/server/src/services/file.d.ts +15 -0
  513. package/dist/server/src/services/file.d.ts.map +1 -1
  514. package/dist/server/src/services/index.d.ts +1 -0
  515. package/dist/server/src/services/index.d.ts.map +1 -1
  516. package/dist/server/utils/cron.js.map +1 -1
  517. package/dist/server/utils/cron.mjs.map +1 -1
  518. package/dist/server/utils/images.js.map +1 -1
  519. package/dist/server/utils/images.mjs.map +1 -1
  520. package/dist/server/utils/index.js.map +1 -1
  521. package/dist/server/utils/index.mjs.map +1 -1
  522. package/dist/server/utils/mime-validation.js.map +1 -1
  523. package/dist/server/utils/mime-validation.mjs.map +1 -1
  524. package/dist/shared/contracts/files.d.ts +11 -0
  525. package/dist/shared/contracts/files.d.ts.map +1 -1
  526. package/package.json +8 -8
@@ -2,7 +2,20 @@
2
2
 
3
3
  var byteSize = require('byte-size');
4
4
 
5
- function formatBytes(receivedBytes, decimals = 0) {
5
+ const MAX_URLS = 20;
6
+ /**
7
+ * Formats a byte value into a human-readable string with units.
8
+ *
9
+ * @param receivedBytes - The number of bytes to format (as number or string)
10
+ * @param decimals - The number of decimal places to display (default: 0)
11
+ * @returns A formatted string with value and unit (e.g., "1.5MB")
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * formatBytes(1024) // '1KB'
16
+ * formatBytes(1536, 1) // '1.5KB'
17
+ * ```
18
+ */ function formatBytes(receivedBytes, decimals = 0) {
6
19
  const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;
7
20
  const { value, unit } = byteSize(realBytes * 1000, {
8
21
  precision: decimals
@@ -12,12 +25,101 @@ function formatBytes(receivedBytes, decimals = 0) {
12
25
  }
13
26
  return `${value}${unit.toUpperCase()}`;
14
27
  }
15
- const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
16
- const prefixFileUrlWithBackendUrl = (fileURL)=>{
28
+ /**
29
+ * Extracts the file extension from a string, removing the leading dot if present.
30
+ *
31
+ * @param ext - The file extension string (may include leading dot)
32
+ * @returns The extension without leading dot, or the original value if no dot
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * getFileExtension('.jpg') // 'jpg'
37
+ * getFileExtension('png') // 'png'
38
+ * ```
39
+ */ const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
40
+ /**
41
+ * Prefixes a relative file URL with the backend URL if needed.
42
+ *
43
+ * @param fileURL - The file URL to potentially prefix
44
+ * @returns The full URL with backend prefix if it was relative, otherwise unchanged
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'
49
+ * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'
50
+ * ```
51
+ */ const prefixFileUrlWithBackendUrl = (fileURL)=>{
17
52
  return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;
18
53
  };
54
+ /**
55
+ * Extracts a filename from a URL's pathname.
56
+ *
57
+ * @param url - The URL to extract the filename from
58
+ * @returns The filename extracted from the URL path, or 'file' if none found
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'
63
+ * getFilenameFromUrl('https://example.com/') // 'file'
64
+ * ```
65
+ */ function getFilenameFromUrl(url) {
66
+ const pathname = new URL(url).pathname;
67
+ const filename = pathname.split('/').pop();
68
+ return filename || 'file';
69
+ }
70
+ /**
71
+ * Validates a newline-separated string of URLs.
72
+ *
73
+ * @param urlsString - A string containing URLs separated by newlines
74
+ * @returns An object with validated URLs array and optional error message
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * const { urls, error } = validateUrls('https://example.com/a.jpg\nhttps://example.com/b.jpg');
79
+ * if (error) {
80
+ * console.error(error);
81
+ * } else {
82
+ * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']
83
+ * }
84
+ * ```
85
+ */ function validateUrls(urlsString) {
86
+ const urls = urlsString.split(/\r?\n/).map((url)=>url.trim()).filter(Boolean);
87
+ if (urls.length === 0) {
88
+ return {
89
+ urls: [],
90
+ error: 'Please provide at least one URL'
91
+ };
92
+ }
93
+ if (urls.length > MAX_URLS) {
94
+ return {
95
+ urls: [],
96
+ error: `Maximum ${MAX_URLS} URLs allowed`
97
+ };
98
+ }
99
+ const invalidUrls = [];
100
+ for (const url of urls){
101
+ try {
102
+ new URL(url);
103
+ } catch {
104
+ invalidUrls.push(url);
105
+ }
106
+ }
107
+ if (invalidUrls.length > 0) {
108
+ const message = invalidUrls.length === 1 ? `Invalid URL: ${invalidUrls[0]}` : `${invalidUrls.length} invalid URLs found`;
109
+ return {
110
+ urls: [],
111
+ error: message
112
+ };
113
+ }
114
+ return {
115
+ urls,
116
+ error: null
117
+ };
118
+ }
19
119
 
20
120
  exports.formatBytes = formatBytes;
21
121
  exports.getFileExtension = getFileExtension;
122
+ exports.getFilenameFromUrl = getFilenameFromUrl;
22
123
  exports.prefixFileUrlWithBackendUrl = prefixFileUrlWithBackendUrl;
124
+ exports.validateUrls = validateUrls;
23
125
  //# sourceMappingURL=files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n"],"names":["formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL"],"mappings":";;;;AAEO,SAASA,WAAAA,CAAYC,aAA8B,EAAEC,WAAW,CAAC,EAAA;AACtE,IAAA,MAAMC,SAAY,GAAA,OAAOF,aAAkB,KAAA,QAAA,GAAWG,OAAOH,aAAiBA,CAAAA,GAAAA,aAAAA;IAC9E,MAAM,EAAEI,KAAK,EAAEC,IAAI,EAAE,GAAGC,QAAAA,CAASJ,YAAY,IAAM,EAAA;QAAEK,SAAWN,EAAAA;AAAS,KAAA,CAAA;AAEzE,IAAA,IAAI,CAACI,IAAM,EAAA;QACT,OAAO,IAAA;AACT;AAEA,IAAA,OAAO,CAAGD,EAAAA,KAAAA,CAAAA,EAAQC,IAAKG,CAAAA,WAAW,EAAI,CAAA,CAAA;AACxC;AAEaC,MAAAA,gBAAAA,GAAmB,CAACC,GAAAA,GAC/BA,OAAOA,GAAG,CAAC,CAAE,CAAA,KAAK,GAAMA,GAAAA,GAAAA,CAAIC,SAAS,CAAC,KAAKD;AAEtC,MAAME,8BAA8B,CAACC,OAAAA,GAAAA;AAC1C,IAAA,OAAO,CAAC,CAACA,OAAWA,IAAAA,OAAAA,CAAQC,UAAU,CAAC,GAAA,CAAA,GAAO,CAAGC,EAAAA,MAAAA,CAAOC,MAAM,CAACC,UAAU,CAAA,EAAGJ,SAAS,GAAGA,OAAAA;AAC1F;;;;;;"}
1
+ {"version":3,"file":"files.js","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nconst MAX_URLS = 20;\n\n/**\n * Formats a byte value into a human-readable string with units.\n *\n * @param receivedBytes - The number of bytes to format (as number or string)\n * @param decimals - The number of decimal places to display (default: 0)\n * @returns A formatted string with value and unit (e.g., \"1.5MB\")\n *\n * @example\n * ```ts\n * formatBytes(1024) // '1KB'\n * formatBytes(1536, 1) // '1.5KB'\n * ```\n */\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\n/**\n * Extracts the file extension from a string, removing the leading dot if present.\n *\n * @param ext - The file extension string (may include leading dot)\n * @returns The extension without leading dot, or the original value if no dot\n *\n * @example\n * ```ts\n * getFileExtension('.jpg') // 'jpg'\n * getFileExtension('png') // 'png'\n * ```\n */\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\n/**\n * Prefixes a relative file URL with the backend URL if needed.\n *\n * @param fileURL - The file URL to potentially prefix\n * @returns The full URL with backend prefix if it was relative, otherwise unchanged\n *\n * @example\n * ```ts\n * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'\n * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'\n * ```\n */\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n\n/**\n * Extracts a filename from a URL's pathname.\n *\n * @param url - The URL to extract the filename from\n * @returns The filename extracted from the URL path, or 'file' if none found\n *\n * @example\n * ```ts\n * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'\n * getFilenameFromUrl('https://example.com/') // 'file'\n * ```\n */\nexport function getFilenameFromUrl(url: string): string {\n const pathname = new URL(url).pathname;\n const filename = pathname.split('/').pop();\n return filename || 'file';\n}\n\n/**\n * Validates a newline-separated string of URLs.\n *\n * @param urlsString - A string containing URLs separated by newlines\n * @returns An object with validated URLs array and optional error message\n *\n * @example\n * ```ts\n * const { urls, error } = validateUrls('https://example.com/a.jpg\\nhttps://example.com/b.jpg');\n * if (error) {\n * console.error(error);\n * } else {\n * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']\n * }\n * ```\n */\nexport function validateUrls(urlsString: string): { urls: string[]; error: string | null } {\n const urls = urlsString\n .split(/\\r?\\n/)\n .map((url) => url.trim())\n .filter(Boolean);\n\n if (urls.length === 0) {\n return { urls: [], error: 'Please provide at least one URL' };\n }\n\n if (urls.length > MAX_URLS) {\n return { urls: [], error: `Maximum ${MAX_URLS} URLs allowed` };\n }\n\n const invalidUrls: string[] = [];\n for (const url of urls) {\n try {\n new URL(url);\n } catch {\n invalidUrls.push(url);\n }\n }\n\n if (invalidUrls.length > 0) {\n const message =\n invalidUrls.length === 1\n ? `Invalid URL: ${invalidUrls[0]}`\n : `${invalidUrls.length} invalid URLs found`;\n return { urls: [], error: message };\n }\n\n return { urls, error: null };\n}\n"],"names":["MAX_URLS","formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL","getFilenameFromUrl","url","pathname","URL","filename","split","pop","validateUrls","urlsString","urls","map","trim","filter","Boolean","length","error","invalidUrls","push","message"],"mappings":"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"}
@@ -1,6 +1,19 @@
1
1
  import byteSize from 'byte-size';
2
2
 
3
- function formatBytes(receivedBytes, decimals = 0) {
3
+ const MAX_URLS = 20;
4
+ /**
5
+ * Formats a byte value into a human-readable string with units.
6
+ *
7
+ * @param receivedBytes - The number of bytes to format (as number or string)
8
+ * @param decimals - The number of decimal places to display (default: 0)
9
+ * @returns A formatted string with value and unit (e.g., "1.5MB")
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * formatBytes(1024) // '1KB'
14
+ * formatBytes(1536, 1) // '1.5KB'
15
+ * ```
16
+ */ function formatBytes(receivedBytes, decimals = 0) {
4
17
  const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;
5
18
  const { value, unit } = byteSize(realBytes * 1000, {
6
19
  precision: decimals
@@ -10,10 +23,97 @@ function formatBytes(receivedBytes, decimals = 0) {
10
23
  }
11
24
  return `${value}${unit.toUpperCase()}`;
12
25
  }
13
- const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
14
- const prefixFileUrlWithBackendUrl = (fileURL)=>{
26
+ /**
27
+ * Extracts the file extension from a string, removing the leading dot if present.
28
+ *
29
+ * @param ext - The file extension string (may include leading dot)
30
+ * @returns The extension without leading dot, or the original value if no dot
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * getFileExtension('.jpg') // 'jpg'
35
+ * getFileExtension('png') // 'png'
36
+ * ```
37
+ */ const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
38
+ /**
39
+ * Prefixes a relative file URL with the backend URL if needed.
40
+ *
41
+ * @param fileURL - The file URL to potentially prefix
42
+ * @returns The full URL with backend prefix if it was relative, otherwise unchanged
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'
47
+ * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'
48
+ * ```
49
+ */ const prefixFileUrlWithBackendUrl = (fileURL)=>{
15
50
  return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;
16
51
  };
52
+ /**
53
+ * Extracts a filename from a URL's pathname.
54
+ *
55
+ * @param url - The URL to extract the filename from
56
+ * @returns The filename extracted from the URL path, or 'file' if none found
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'
61
+ * getFilenameFromUrl('https://example.com/') // 'file'
62
+ * ```
63
+ */ function getFilenameFromUrl(url) {
64
+ const pathname = new URL(url).pathname;
65
+ const filename = pathname.split('/').pop();
66
+ return filename || 'file';
67
+ }
68
+ /**
69
+ * Validates a newline-separated string of URLs.
70
+ *
71
+ * @param urlsString - A string containing URLs separated by newlines
72
+ * @returns An object with validated URLs array and optional error message
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const { urls, error } = validateUrls('https://example.com/a.jpg\nhttps://example.com/b.jpg');
77
+ * if (error) {
78
+ * console.error(error);
79
+ * } else {
80
+ * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']
81
+ * }
82
+ * ```
83
+ */ function validateUrls(urlsString) {
84
+ const urls = urlsString.split(/\r?\n/).map((url)=>url.trim()).filter(Boolean);
85
+ if (urls.length === 0) {
86
+ return {
87
+ urls: [],
88
+ error: 'Please provide at least one URL'
89
+ };
90
+ }
91
+ if (urls.length > MAX_URLS) {
92
+ return {
93
+ urls: [],
94
+ error: `Maximum ${MAX_URLS} URLs allowed`
95
+ };
96
+ }
97
+ const invalidUrls = [];
98
+ for (const url of urls){
99
+ try {
100
+ new URL(url);
101
+ } catch {
102
+ invalidUrls.push(url);
103
+ }
104
+ }
105
+ if (invalidUrls.length > 0) {
106
+ const message = invalidUrls.length === 1 ? `Invalid URL: ${invalidUrls[0]}` : `${invalidUrls.length} invalid URLs found`;
107
+ return {
108
+ urls: [],
109
+ error: message
110
+ };
111
+ }
112
+ return {
113
+ urls,
114
+ error: null
115
+ };
116
+ }
17
117
 
18
- export { formatBytes, getFileExtension, prefixFileUrlWithBackendUrl };
118
+ export { formatBytes, getFileExtension, getFilenameFromUrl, prefixFileUrlWithBackendUrl, validateUrls };
19
119
  //# sourceMappingURL=files.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.mjs","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n"],"names":["formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL"],"mappings":";;AAEO,SAASA,WAAAA,CAAYC,aAA8B,EAAEC,WAAW,CAAC,EAAA;AACtE,IAAA,MAAMC,SAAY,GAAA,OAAOF,aAAkB,KAAA,QAAA,GAAWG,OAAOH,aAAiBA,CAAAA,GAAAA,aAAAA;IAC9E,MAAM,EAAEI,KAAK,EAAEC,IAAI,EAAE,GAAGC,QAAAA,CAASJ,YAAY,IAAM,EAAA;QAAEK,SAAWN,EAAAA;AAAS,KAAA,CAAA;AAEzE,IAAA,IAAI,CAACI,IAAM,EAAA;QACT,OAAO,IAAA;AACT;AAEA,IAAA,OAAO,CAAGD,EAAAA,KAAAA,CAAAA,EAAQC,IAAKG,CAAAA,WAAW,EAAI,CAAA,CAAA;AACxC;AAEaC,MAAAA,gBAAAA,GAAmB,CAACC,GAAAA,GAC/BA,OAAOA,GAAG,CAAC,CAAE,CAAA,KAAK,GAAMA,GAAAA,GAAAA,CAAIC,SAAS,CAAC,KAAKD;AAEtC,MAAME,8BAA8B,CAACC,OAAAA,GAAAA;AAC1C,IAAA,OAAO,CAAC,CAACA,OAAWA,IAAAA,OAAAA,CAAQC,UAAU,CAAC,GAAA,CAAA,GAAO,CAAGC,EAAAA,MAAAA,CAAOC,MAAM,CAACC,UAAU,CAAA,EAAGJ,SAAS,GAAGA,OAAAA;AAC1F;;;;"}
1
+ {"version":3,"file":"files.mjs","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nconst MAX_URLS = 20;\n\n/**\n * Formats a byte value into a human-readable string with units.\n *\n * @param receivedBytes - The number of bytes to format (as number or string)\n * @param decimals - The number of decimal places to display (default: 0)\n * @returns A formatted string with value and unit (e.g., \"1.5MB\")\n *\n * @example\n * ```ts\n * formatBytes(1024) // '1KB'\n * formatBytes(1536, 1) // '1.5KB'\n * ```\n */\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\n/**\n * Extracts the file extension from a string, removing the leading dot if present.\n *\n * @param ext - The file extension string (may include leading dot)\n * @returns The extension without leading dot, or the original value if no dot\n *\n * @example\n * ```ts\n * getFileExtension('.jpg') // 'jpg'\n * getFileExtension('png') // 'png'\n * ```\n */\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\n/**\n * Prefixes a relative file URL with the backend URL if needed.\n *\n * @param fileURL - The file URL to potentially prefix\n * @returns The full URL with backend prefix if it was relative, otherwise unchanged\n *\n * @example\n * ```ts\n * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'\n * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'\n * ```\n */\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n\n/**\n * Extracts a filename from a URL's pathname.\n *\n * @param url - The URL to extract the filename from\n * @returns The filename extracted from the URL path, or 'file' if none found\n *\n * @example\n * ```ts\n * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'\n * getFilenameFromUrl('https://example.com/') // 'file'\n * ```\n */\nexport function getFilenameFromUrl(url: string): string {\n const pathname = new URL(url).pathname;\n const filename = pathname.split('/').pop();\n return filename || 'file';\n}\n\n/**\n * Validates a newline-separated string of URLs.\n *\n * @param urlsString - A string containing URLs separated by newlines\n * @returns An object with validated URLs array and optional error message\n *\n * @example\n * ```ts\n * const { urls, error } = validateUrls('https://example.com/a.jpg\\nhttps://example.com/b.jpg');\n * if (error) {\n * console.error(error);\n * } else {\n * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']\n * }\n * ```\n */\nexport function validateUrls(urlsString: string): { urls: string[]; error: string | null } {\n const urls = urlsString\n .split(/\\r?\\n/)\n .map((url) => url.trim())\n .filter(Boolean);\n\n if (urls.length === 0) {\n return { urls: [], error: 'Please provide at least one URL' };\n }\n\n if (urls.length > MAX_URLS) {\n return { urls: [], error: `Maximum ${MAX_URLS} URLs allowed` };\n }\n\n const invalidUrls: string[] = [];\n for (const url of urls) {\n try {\n new URL(url);\n } catch {\n invalidUrls.push(url);\n }\n }\n\n if (invalidUrls.length > 0) {\n const message =\n invalidUrls.length === 1\n ? `Invalid URL: ${invalidUrls[0]}`\n : `${invalidUrls.length} invalid URLs found`;\n return { urls: [], error: message };\n }\n\n return { urls, error: null };\n}\n"],"names":["MAX_URLS","formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL","getFilenameFromUrl","url","pathname","URL","filename","split","pop","validateUrls","urlsString","urls","map","trim","filter","Boolean","length","error","invalidUrls","push","message"],"mappings":"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"}
@@ -13,13 +13,13 @@ const DOC_ICON_MAP = {
13
13
  const getAssetIcon = (mime, ext)=>{
14
14
  const fileExtension = files.getFileExtension(ext);
15
15
  if (mime?.includes(enums.AssetType.Image)) {
16
- return icons.Images;
16
+ return icons.Image;
17
17
  }
18
18
  if (mime?.includes(enums.AssetType.Video)) {
19
- return icons.Monitor;
19
+ return icons.Play;
20
20
  }
21
21
  if (mime?.includes(enums.AssetType.Audio)) {
22
- return icons.VolumeUp;
22
+ return icons.Headphones;
23
23
  }
24
24
  return fileExtension ? DOC_ICON_MAP[fileExtension] || icons.File : icons.File;
25
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getAssetIcon.js","sources":["../../../../admin/src/future/utils/getAssetIcon.ts"],"sourcesContent":["import { SVGProps } from 'react';\n\nimport {\n File as FileIcon,\n FileCsv,\n FilePdf,\n FileXls,\n FileZip,\n Monitor,\n VolumeUp,\n Images,\n} from '@strapi/icons';\nimport { DefaultTheme } from 'styled-components';\n\nimport { AssetType } from '../enums';\n\nimport { getFileExtension } from './files';\n\n// NOTE: IconProps interface is not exported from our design library package, so we need to redefine it here\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, 'fill' | 'stroke'> {\n /**\n * @default \"currentColor\"\n */\n fill?: keyof DefaultTheme['colors'] | string;\n stroke?: keyof DefaultTheme['colors'] | string;\n}\n\ntype IconComponent = React.FC<IconProps>;\n\nconst DOC_ICON_MAP: Record<string, IconComponent> = {\n pdf: FilePdf,\n csv: FileCsv,\n xls: FileXls,\n zip: FileZip,\n};\n\nexport const getAssetIcon = (mime: string | undefined, ext: string | undefined): IconComponent => {\n const fileExtension = getFileExtension(ext);\n\n if (mime?.includes(AssetType.Image)) {\n return Images;\n }\n\n if (mime?.includes(AssetType.Video)) {\n return Monitor;\n }\n\n if (mime?.includes(AssetType.Audio)) {\n return VolumeUp;\n }\n\n return fileExtension ? DOC_ICON_MAP[fileExtension] || FileIcon : FileIcon;\n};\n"],"names":["DOC_ICON_MAP","pdf","FilePdf","csv","FileCsv","xls","FileXls","zip","FileZip","getAssetIcon","mime","ext","fileExtension","getFileExtension","includes","AssetType","Image","Images","Video","Monitor","Audio","VolumeUp","FileIcon"],"mappings":";;;;;;AA6BA,MAAMA,YAA8C,GAAA;IAClDC,GAAKC,EAAAA,aAAAA;IACLC,GAAKC,EAAAA,aAAAA;IACLC,GAAKC,EAAAA,aAAAA;IACLC,GAAKC,EAAAA;AACP,CAAA;AAEO,MAAMC,YAAe,GAAA,CAACC,IAA0BC,EAAAA,GAAAA,GAAAA;AACrD,IAAA,MAAMC,gBAAgBC,sBAAiBF,CAAAA,GAAAA,CAAAA;AAEvC,IAAA,IAAID,IAAMI,EAAAA,QAAAA,CAASC,eAAUC,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,YAAAA;AACT;AAEA,IAAA,IAAIP,IAAMI,EAAAA,QAAAA,CAASC,eAAUG,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,aAAAA;AACT;AAEA,IAAA,IAAIT,IAAMI,EAAAA,QAAAA,CAASC,eAAUK,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,cAAAA;AACT;AAEA,IAAA,OAAOT,aAAgBZ,GAAAA,YAAY,CAACY,aAAAA,CAAc,IAAIU,UAAWA,GAAAA,UAAAA;AACnE;;;;"}
1
+ {"version":3,"file":"getAssetIcon.js","sources":["../../../../admin/src/future/utils/getAssetIcon.ts"],"sourcesContent":["import { SVGProps } from 'react';\n\nimport {\n File as FileIcon,\n FileCsv,\n FilePdf,\n FileXls,\n FileZip,\n Play,\n Headphones,\n Image,\n} from '@strapi/icons';\nimport { DefaultTheme } from 'styled-components';\n\nimport { AssetType } from '../enums';\n\nimport { getFileExtension } from './files';\n\n// NOTE: IconProps interface is not exported from our design library package, so we need to redefine it here\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, 'fill' | 'stroke'> {\n /**\n * @default \"currentColor\"\n */\n fill?: keyof DefaultTheme['colors'] | string;\n stroke?: keyof DefaultTheme['colors'] | string;\n}\n\ntype IconComponent = React.FC<IconProps>;\n\nconst DOC_ICON_MAP: Record<string, IconComponent> = {\n pdf: FilePdf,\n csv: FileCsv,\n xls: FileXls,\n zip: FileZip,\n};\n\nexport const getAssetIcon = (mime: string | undefined, ext: string | undefined): IconComponent => {\n const fileExtension = getFileExtension(ext);\n\n if (mime?.includes(AssetType.Image)) {\n return Image;\n }\n\n if (mime?.includes(AssetType.Video)) {\n return Play;\n }\n\n if (mime?.includes(AssetType.Audio)) {\n return Headphones;\n }\n\n return fileExtension ? DOC_ICON_MAP[fileExtension] || FileIcon : FileIcon;\n};\n"],"names":["DOC_ICON_MAP","pdf","FilePdf","csv","FileCsv","xls","FileXls","zip","FileZip","getAssetIcon","mime","ext","fileExtension","getFileExtension","includes","AssetType","Image","Video","Play","Audio","Headphones","FileIcon"],"mappings":";;;;;;AA6BA,MAAMA,YAAAA,GAA8C;IAClDC,GAAAA,EAAKC,aAAAA;IACLC,GAAAA,EAAKC,aAAAA;IACLC,GAAAA,EAAKC,aAAAA;IACLC,GAAAA,EAAKC;AACP,CAAA;AAEO,MAAMC,YAAAA,GAAe,CAACC,IAAAA,EAA0BC,GAAAA,GAAAA;AACrD,IAAA,MAAMC,gBAAgBC,sBAAAA,CAAiBF,GAAAA,CAAAA;AAEvC,IAAA,IAAID,IAAAA,EAAMI,QAAAA,CAASC,eAAAA,CAAUC,KAAK,CAAA,EAAG;QACnC,OAAOA,WAAAA;AACT,IAAA;AAEA,IAAA,IAAIN,IAAAA,EAAMI,QAAAA,CAASC,eAAAA,CAAUE,KAAK,CAAA,EAAG;QACnC,OAAOC,UAAAA;AACT,IAAA;AAEA,IAAA,IAAIR,IAAAA,EAAMI,QAAAA,CAASC,eAAAA,CAAUI,KAAK,CAAA,EAAG;QACnC,OAAOC,gBAAAA;AACT,IAAA;AAEA,IAAA,OAAOR,aAAAA,GAAgBZ,YAAY,CAACY,aAAAA,CAAc,IAAIS,UAAAA,GAAWA,UAAAA;AACnE;;;;"}
@@ -1,4 +1,4 @@
1
- import { Images, Monitor, VolumeUp, File, FilePdf, FileCsv, FileXls, FileZip } from '@strapi/icons';
1
+ import { Image, Play, Headphones, FileZip, FileXls, FileCsv, FilePdf, File } from '@strapi/icons';
2
2
  import { AssetType } from '../enums.mjs';
3
3
  import { getFileExtension } from './files.mjs';
4
4
 
@@ -11,13 +11,13 @@ const DOC_ICON_MAP = {
11
11
  const getAssetIcon = (mime, ext)=>{
12
12
  const fileExtension = getFileExtension(ext);
13
13
  if (mime?.includes(AssetType.Image)) {
14
- return Images;
14
+ return Image;
15
15
  }
16
16
  if (mime?.includes(AssetType.Video)) {
17
- return Monitor;
17
+ return Play;
18
18
  }
19
19
  if (mime?.includes(AssetType.Audio)) {
20
- return VolumeUp;
20
+ return Headphones;
21
21
  }
22
22
  return fileExtension ? DOC_ICON_MAP[fileExtension] || File : File;
23
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getAssetIcon.mjs","sources":["../../../../admin/src/future/utils/getAssetIcon.ts"],"sourcesContent":["import { SVGProps } from 'react';\n\nimport {\n File as FileIcon,\n FileCsv,\n FilePdf,\n FileXls,\n FileZip,\n Monitor,\n VolumeUp,\n Images,\n} from '@strapi/icons';\nimport { DefaultTheme } from 'styled-components';\n\nimport { AssetType } from '../enums';\n\nimport { getFileExtension } from './files';\n\n// NOTE: IconProps interface is not exported from our design library package, so we need to redefine it here\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, 'fill' | 'stroke'> {\n /**\n * @default \"currentColor\"\n */\n fill?: keyof DefaultTheme['colors'] | string;\n stroke?: keyof DefaultTheme['colors'] | string;\n}\n\ntype IconComponent = React.FC<IconProps>;\n\nconst DOC_ICON_MAP: Record<string, IconComponent> = {\n pdf: FilePdf,\n csv: FileCsv,\n xls: FileXls,\n zip: FileZip,\n};\n\nexport const getAssetIcon = (mime: string | undefined, ext: string | undefined): IconComponent => {\n const fileExtension = getFileExtension(ext);\n\n if (mime?.includes(AssetType.Image)) {\n return Images;\n }\n\n if (mime?.includes(AssetType.Video)) {\n return Monitor;\n }\n\n if (mime?.includes(AssetType.Audio)) {\n return VolumeUp;\n }\n\n return fileExtension ? DOC_ICON_MAP[fileExtension] || FileIcon : FileIcon;\n};\n"],"names":["DOC_ICON_MAP","pdf","FilePdf","csv","FileCsv","xls","FileXls","zip","FileZip","getAssetIcon","mime","ext","fileExtension","getFileExtension","includes","AssetType","Image","Images","Video","Monitor","Audio","VolumeUp","FileIcon"],"mappings":";;;;AA6BA,MAAMA,YAA8C,GAAA;IAClDC,GAAKC,EAAAA,OAAAA;IACLC,GAAKC,EAAAA,OAAAA;IACLC,GAAKC,EAAAA,OAAAA;IACLC,GAAKC,EAAAA;AACP,CAAA;AAEO,MAAMC,YAAe,GAAA,CAACC,IAA0BC,EAAAA,GAAAA,GAAAA;AACrD,IAAA,MAAMC,gBAAgBC,gBAAiBF,CAAAA,GAAAA,CAAAA;AAEvC,IAAA,IAAID,IAAMI,EAAAA,QAAAA,CAASC,SAAUC,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,MAAAA;AACT;AAEA,IAAA,IAAIP,IAAMI,EAAAA,QAAAA,CAASC,SAAUG,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,OAAAA;AACT;AAEA,IAAA,IAAIT,IAAMI,EAAAA,QAAAA,CAASC,SAAUK,CAAAA,KAAK,CAAG,EAAA;QACnC,OAAOC,QAAAA;AACT;AAEA,IAAA,OAAOT,aAAgBZ,GAAAA,YAAY,CAACY,aAAAA,CAAc,IAAIU,IAAWA,GAAAA,IAAAA;AACnE;;;;"}
1
+ {"version":3,"file":"getAssetIcon.mjs","sources":["../../../../admin/src/future/utils/getAssetIcon.ts"],"sourcesContent":["import { SVGProps } from 'react';\n\nimport {\n File as FileIcon,\n FileCsv,\n FilePdf,\n FileXls,\n FileZip,\n Play,\n Headphones,\n Image,\n} from '@strapi/icons';\nimport { DefaultTheme } from 'styled-components';\n\nimport { AssetType } from '../enums';\n\nimport { getFileExtension } from './files';\n\n// NOTE: IconProps interface is not exported from our design library package, so we need to redefine it here\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, 'fill' | 'stroke'> {\n /**\n * @default \"currentColor\"\n */\n fill?: keyof DefaultTheme['colors'] | string;\n stroke?: keyof DefaultTheme['colors'] | string;\n}\n\ntype IconComponent = React.FC<IconProps>;\n\nconst DOC_ICON_MAP: Record<string, IconComponent> = {\n pdf: FilePdf,\n csv: FileCsv,\n xls: FileXls,\n zip: FileZip,\n};\n\nexport const getAssetIcon = (mime: string | undefined, ext: string | undefined): IconComponent => {\n const fileExtension = getFileExtension(ext);\n\n if (mime?.includes(AssetType.Image)) {\n return Image;\n }\n\n if (mime?.includes(AssetType.Video)) {\n return Play;\n }\n\n if (mime?.includes(AssetType.Audio)) {\n return Headphones;\n }\n\n return fileExtension ? DOC_ICON_MAP[fileExtension] || FileIcon : FileIcon;\n};\n"],"names":["DOC_ICON_MAP","pdf","FilePdf","csv","FileCsv","xls","FileXls","zip","FileZip","getAssetIcon","mime","ext","fileExtension","getFileExtension","includes","AssetType","Image","Video","Play","Audio","Headphones","FileIcon"],"mappings":";;;;AA6BA,MAAMA,YAAAA,GAA8C;IAClDC,GAAAA,EAAKC,OAAAA;IACLC,GAAAA,EAAKC,OAAAA;IACLC,GAAAA,EAAKC,OAAAA;IACLC,GAAAA,EAAKC;AACP,CAAA;AAEO,MAAMC,YAAAA,GAAe,CAACC,IAAAA,EAA0BC,GAAAA,GAAAA;AACrD,IAAA,MAAMC,gBAAgBC,gBAAAA,CAAiBF,GAAAA,CAAAA;AAEvC,IAAA,IAAID,IAAAA,EAAMI,QAAAA,CAASC,SAAAA,CAAUC,KAAK,CAAA,EAAG;QACnC,OAAOA,KAAAA;AACT,IAAA;AAEA,IAAA,IAAIN,IAAAA,EAAMI,QAAAA,CAASC,SAAAA,CAAUE,KAAK,CAAA,EAAG;QACnC,OAAOC,IAAAA;AACT,IAAA;AAEA,IAAA,IAAIR,IAAAA,EAAMI,QAAAA,CAASC,SAAAA,CAAUI,KAAK,CAAA,EAAG;QACnC,OAAOC,UAAAA;AACT,IAAA;AAEA,IAAA,OAAOR,aAAAA,GAAgBZ,YAAY,CAACY,aAAAA,CAAc,IAAIS,IAAAA,GAAWA,IAAAA;AACnE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"translations.js","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,iBAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
1
+ {"version":3,"file":"translations.js","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,iBAAAA,CAAS,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"translations.mjs","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,QAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
1
+ {"version":3,"file":"translations.mjs","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,QAAAA,CAAS,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAIMetadataJob.js","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAI,CAAA,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,KAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,0BAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAcC,GAAAA,yBAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAW,IAAA,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAMe,EAAAA,GAAG,EAAEC,OAAO,EAAE,GAAGC,mBAC7B,CAAA;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GACrB,CAAA,EAAA;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAc,EAAA;gBAChC,OAAO,IAAA;AACT;;YAGA,OAAO,KAAA;AACT,SAAA;QACAC,KAAO,EAAA,KAAA;QACPC,oBAAsB,EAAA;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAU,IAAA,IAAA;;AAGxCN,IAAAA,gBAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAkB,EAAA;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,WAAa,EAAA;YAC1ElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,wCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,QAAU,EAAA;YACvElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,qCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAkB,EAAA;YAC1CV,oBAAqBU,CAAAA,gBAAAA,CAAAA;AACvB;KACC,EAAA;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAMe,EAAAA,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useAIMetadataJob.js","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAAA,CAAI,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,0BAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,yBAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAAA,IAAW,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAAA,EAAMe,GAAG,EAAEC,OAAO,EAAE,GAAGC,mBAAAA,CAC7B;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GAAAA,CAAAA,EACrB;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAA,EAAc;gBAChC,OAAO,IAAA;AACT,YAAA;;YAGA,OAAO,KAAA;AACT,QAAA,CAAA;QACAC,KAAAA,EAAO,KAAA;QACPC,oBAAAA,EAAsB;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAAA,IAAU,IAAA;;AAGxCN,IAAAA,gBAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAAA,EAAkB;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,WAAA,EAAa;YAC1ElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,wCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD,QAAA;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,QAAA,EAAU;YACvElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,qCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAAA,EAAkB;YAC1CV,oBAAAA,CAAqBU,gBAAAA,CAAAA;AACvB,QAAA;IACF,CAAA,EAAG;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAAA,EAAMe,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAIMetadataJob.mjs","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAI,CAAA,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,KAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,cAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAcC,GAAAA,cAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAW,IAAA,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAMe,EAAAA,GAAG,EAAEC,OAAO,EAAE,GAAGC,QAC7B,CAAA;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GACrB,CAAA,EAAA;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAc,EAAA;gBAChC,OAAO,IAAA;AACT;;YAGA,OAAO,KAAA;AACT,SAAA;QACAC,KAAO,EAAA,KAAA;QACPC,oBAAsB,EAAA;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAU,IAAA,IAAA;;AAGxCN,IAAAA,KAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAkB,EAAA;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,WAAa,EAAA;YAC1ElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,wCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,QAAU,EAAA;YACvElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,qCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAkB,EAAA;YAC1CV,oBAAqBU,CAAAA,gBAAAA,CAAAA;AACvB;KACC,EAAA;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAMe,EAAAA,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useAIMetadataJob.mjs","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAAA,CAAI,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,cAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,cAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAAA,IAAW,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAAA,EAAMe,GAAG,EAAEC,OAAO,EAAE,GAAGC,QAAAA,CAC7B;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GAAAA,CAAAA,EACrB;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAA,EAAc;gBAChC,OAAO,IAAA;AACT,YAAA;;YAGA,OAAO,KAAA;AACT,QAAA,CAAA;QACAC,KAAAA,EAAO,KAAA;QACPC,oBAAAA,EAAsB;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAAA,IAAU,IAAA;;AAGxCN,IAAAA,KAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAAA,EAAkB;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,WAAA,EAAa;YAC1ElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAAA,CAAQ,wCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD,QAAA;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,QAAA,EAAU;YACvElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAAA,CAAQ,qCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAAA,EAAkB;YAC1CV,oBAAAA,CAAqBU,gBAAAA,CAAAA;AACvB,QAAA;IACF,CAAA,EAAG;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAAA,EAAMe,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAiAvailability.js","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;;;MAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,aAAgBC,GAAAA,oBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,uBAAYJ,CAAAA,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAe,EAAA;QAClB,OAAO;YAAEE,MAAQ,EAAA,SAAA;YAAoBG,SAAW,EAAA;AAAM,SAAA;AACxD;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAMG,EAAAA;AAAW,KAAA;AAC/C;;;;"}
1
+ {"version":3,"file":"useAiAvailability.js","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;;;MAIaA,iBAAAA,GAAoB,IAAA;AAC/B,IAAA,MAAMC,aAAAA,GAAgBC,oBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,uBAAAA,CAAYJ,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAAA,EAAe;QAClB,OAAO;YAAEE,MAAAA,EAAQ,SAAA;YAAoBG,SAAAA,EAAW;AAAM,SAAA;AACxD,IAAA;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAAA,EAAMG;AAAW,KAAA;AAC/C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAiAvailability.mjs","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;MAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,aAAgBC,GAAAA,mBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,WAAYJ,CAAAA,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAe,EAAA;QAClB,OAAO;YAAEE,MAAQ,EAAA,SAAA;YAAoBG,SAAW,EAAA;AAAM,SAAA;AACxD;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAMG,EAAAA;AAAW,KAAA;AAC/C;;;;"}
1
+ {"version":3,"file":"useAiAvailability.mjs","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;MAIaA,iBAAAA,GAAoB,IAAA;AAC/B,IAAA,MAAMC,aAAAA,GAAgBC,mBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,WAAAA,CAAYJ,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAAA,EAAe;QAClB,OAAO;YAAEE,MAAAA,EAAQ,SAAA;YAAoBG,SAAAA,EAAW;AAAM,SAAA;AACxD,IAAA;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAAA,EAAMG;AAAW,KAAA;AAC/C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAssets.js","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","$eq","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","id","defaultMessage","type","message"],"mappings":"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"}
1
+ {"version":3,"file":"useAssets.js","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","$eq","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","id","defaultMessage","type","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAssets.mjs","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","$eq","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","id","defaultMessage","type","message"],"mappings":"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"}
1
+ {"version":3,"file":"useAssets.mjs","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folderPath: { $eq: folderPath ?? '/' },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","$eq","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","id","defaultMessage","type","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBulkEdit.js","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;;;MAsBaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAcC,GAAAA,yBAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAgB,GAAA,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAA+B,EAAA;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,KAAA;IAEA,MAAMC,QAAAA,GAAWC,uBAIfH,aAAe,EAAA;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAQA,IAAAA,IAAAA,CAAKC,MAAM,GAAG,CAAG,EAAA;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACnE;YAEAhB,kBAAmB,CAAA;gBACjBiB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAc,CAAA;AACrBqB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,0BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAO,GAAA,CACXf,OAIGC,GAAAA,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}
1
+ {"version":3,"file":"useBulkEdit.js","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;;;MAsBaA,WAAAA,GAAc,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAAA,GAAcC,yBAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAAA,GAAgB,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAAA,EAA+B;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,IAAA,CAAA;IAEA,MAAMC,QAAAA,GAAWC,uBAIfH,aAAAA,EAAe;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAAA,IAAQA,IAAAA,CAAKC,MAAM,GAAG,CAAA,EAAG;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AACnE,YAAA;YAEAhB,kBAAAA,CAAmB;gBACjBiB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAAA,CAAc;AACrBqB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,0BAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GAAO,CACXf,OAAAA,GAIGC,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBulkEdit.mjs","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;MAsBaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAcC,GAAAA,cAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,cAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAgB,GAAA,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAA+B,EAAA;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,KAAA;IAEA,MAAMC,QAAAA,GAAWC,YAIfH,aAAe,EAAA;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAQA,IAAAA,IAAAA,CAAKC,MAAM,GAAG,CAAG,EAAA;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACnE;YAEAhB,kBAAmB,CAAA;gBACjBiB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAc,CAAA;AACrBqB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,0BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAO,GAAA,CACXf,OAIGC,GAAAA,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}
1
+ {"version":3,"file":"useBulkEdit.mjs","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;MAsBaA,WAAAA,GAAc,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAAA,GAAcC,cAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,cAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAAA,GAAgB,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAAA,EAA+B;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,IAAA,CAAA;IAEA,MAAMC,QAAAA,GAAWC,YAIfH,aAAAA,EAAe;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAAA,IAAQA,IAAAA,CAAKC,MAAM,GAAG,CAAA,EAAG;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAAA,EAAQ;AAAK,iBAAA,CAAA;AACnE,YAAA;YAEAhB,kBAAAA,CAAmB;gBACjBiB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAAA,CAAc;AACrBqB,oBAAAA,EAAAA,EAAIC,OAAAA,CAAQ,0BAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GAAO,CACXf,OAAAA,GAIGC,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}