@strapi/upload 5.59.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js +29 -0
  10. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
  12. package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  14. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  16. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  18. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  20. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  21. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  22. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  23. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  24. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  25. package/dist/admin/components/Drawer.js +12 -7
  26. package/dist/admin/components/Drawer.js.map +1 -1
  27. package/dist/admin/components/Drawer.mjs +12 -7
  28. package/dist/admin/components/Drawer.mjs.map +1 -1
  29. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
  30. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
  31. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
  32. package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +9 -4
  34. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
  35. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +9 -4
  36. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
  37. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
  46. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
  47. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
  48. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
  49. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  50. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  52. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
  54. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
  55. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
  56. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
  57. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  58. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  60. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  61. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +163 -111
  62. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  63. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +162 -114
  64. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  65. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  66. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  67. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  68. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  69. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
  70. package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
  71. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
  72. package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
  73. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  74. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  75. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  76. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  77. package/dist/admin/components/UploadProgressDialog.js +2 -1
  78. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  79. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  80. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  81. package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
  82. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  83. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
  84. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  85. package/dist/admin/index.js +10 -1
  86. package/dist/admin/index.js.map +1 -1
  87. package/dist/admin/index.mjs +10 -1
  88. package/dist/admin/index.mjs.map +1 -1
  89. package/dist/admin/pages/Assets/AssetsPage.js +14 -303
  90. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  91. package/dist/admin/pages/Assets/AssetsPage.mjs +13 -282
  92. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  93. package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
  94. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
  95. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  96. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
  97. package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  98. package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
  99. package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
  100. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  101. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
  102. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  103. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  104. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  105. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  106. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  107. package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
  108. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  109. package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
  110. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  111. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  112. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  113. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  114. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  115. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
  116. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  117. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  118. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  119. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  120. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  121. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  122. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  123. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  124. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  125. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  126. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  127. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  128. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  129. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  130. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  131. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  132. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  133. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  134. package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
  135. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  136. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  137. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  138. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  139. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  140. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  141. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  142. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  143. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  144. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  145. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  146. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  147. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  148. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  149. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  150. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  151. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  152. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  153. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  154. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  155. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  156. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  157. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  158. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  159. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  160. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  161. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  162. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  163. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  164. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  165. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
  166. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
  167. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
  168. package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
  169. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  170. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  171. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  172. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  173. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  174. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  175. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  176. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  177. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  178. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  179. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  180. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  181. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  182. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  183. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  184. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  185. package/dist/admin/services/api.js +92 -7
  186. package/dist/admin/services/api.js.map +1 -1
  187. package/dist/admin/services/api.mjs +91 -9
  188. package/dist/admin/services/api.mjs.map +1 -1
  189. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  190. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  191. package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
  192. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  193. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  194. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  195. package/dist/admin/src/components/Drawer.d.ts +8 -0
  196. package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
  197. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
  198. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  199. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  200. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
  201. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  202. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
  203. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  204. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
  205. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  206. package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
  207. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  208. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
  209. package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
  210. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  211. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  212. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  213. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  214. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  215. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  216. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  217. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  218. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  219. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  220. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  221. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  222. package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
  223. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  224. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  225. package/dist/admin/src/services/api.d.ts +24 -1
  226. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  227. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  228. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  229. package/dist/admin/store/uploadProgress.js +30 -3
  230. package/dist/admin/store/uploadProgress.js.map +1 -1
  231. package/dist/admin/store/uploadProgress.mjs +29 -4
  232. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  233. package/dist/admin/translations/en.json.js +24 -0
  234. package/dist/admin/translations/en.json.js.map +1 -1
  235. package/dist/admin/translations/en.json.mjs +24 -0
  236. package/dist/admin/translations/en.json.mjs.map +1 -1
  237. package/dist/admin/utils/findFolderPath.js +26 -0
  238. package/dist/admin/utils/findFolderPath.js.map +1 -0
  239. package/dist/admin/utils/findFolderPath.mjs +24 -0
  240. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  241. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  242. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  243. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  244. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  245. package/dist/server/audit-logs.js +264 -0
  246. package/dist/server/audit-logs.js.map +1 -0
  247. package/dist/server/audit-logs.mjs +255 -0
  248. package/dist/server/audit-logs.mjs.map +1 -0
  249. package/dist/server/bootstrap.js +4 -0
  250. package/dist/server/bootstrap.js.map +1 -1
  251. package/dist/server/bootstrap.mjs +4 -0
  252. package/dist/server/bootstrap.mjs.map +1 -1
  253. package/dist/server/controllers/admin-folder-file.js +23 -1
  254. package/dist/server/controllers/admin-folder-file.js.map +1 -1
  255. package/dist/server/controllers/admin-folder-file.mjs +23 -1
  256. package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
  257. package/dist/server/controllers/admin-settings.js +5 -1
  258. package/dist/server/controllers/admin-settings.js.map +1 -1
  259. package/dist/server/controllers/admin-settings.mjs +5 -1
  260. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  261. package/dist/server/services/folder.js +48 -1
  262. package/dist/server/services/folder.js.map +1 -1
  263. package/dist/server/services/folder.mjs +48 -1
  264. package/dist/server/services/folder.mjs.map +1 -1
  265. package/dist/server/services/image-manipulation.js +14 -7
  266. package/dist/server/services/image-manipulation.js.map +1 -1
  267. package/dist/server/services/image-manipulation.mjs +14 -7
  268. package/dist/server/services/image-manipulation.mjs.map +1 -1
  269. package/dist/server/services/upload.js +100 -16
  270. package/dist/server/services/upload.js.map +1 -1
  271. package/dist/server/services/upload.mjs +102 -18
  272. package/dist/server/services/upload.mjs.map +1 -1
  273. package/dist/server/src/audit-logs.d.ts +142 -0
  274. package/dist/server/src/audit-logs.d.ts.map +1 -0
  275. package/dist/server/src/bootstrap.d.ts.map +1 -1
  276. package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
  277. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  278. package/dist/server/src/index.d.ts +4 -4
  279. package/dist/server/src/index.d.ts.map +1 -1
  280. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  281. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  282. package/dist/server/src/services/folder.d.ts.map +1 -1
  283. package/dist/server/src/services/image-manipulation.d.ts +4 -4
  284. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  285. package/dist/server/src/services/index.d.ts +4 -4
  286. package/dist/server/src/services/index.d.ts.map +1 -1
  287. package/dist/server/src/services/upload.d.ts.map +1 -1
  288. package/dist/server/src/types.d.ts +63 -12
  289. package/dist/server/src/types.d.ts.map +1 -1
  290. package/package.json +11 -16
  291. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
  292. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
  293. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
  294. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
  295. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"AssetDetailsDrawer.js","sources":["../../../../../../admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Blocker,\n Form,\n useClipboard,\n useField,\n useForm,\n useNotification,\n useQueryParams,\n withEncodedUserParams,\n getDisplayName,\n} from '@strapi/admin/strapi-admin';\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n Field,\n Flex,\n IconButton,\n Loader,\n SingleSelect,\n SingleSelectOption,\n TextInput,\n Tooltip,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport {\n ArrowLineRight,\n ArrowsCounterClockwise,\n Crop,\n Download,\n FileError,\n Link,\n Trash,\n WarningCircle,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Drawer } from '../../../../components/Drawer';\nimport { ASSET_TYPES } from '../../../../enums';\nimport { useAIMetadataEnabled } from '../../../../hooks/useAIMetadataEnabled';\nimport { useApiErrorMessage } from '../../../../hooks/useApiErrorMessage';\nimport { useMediaLibraryPermissions } from '../../../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../../hooks/useTracking';\nimport { useUploadFileSilentlyMutation } from '../../../../services/api';\nimport {\n useDeleteAssetMutation,\n useGetAssetQuery,\n useReplaceAssetMutation,\n useUpdateAssetMutation,\n} from '../../../../services/assets';\nimport { useGetAllFoldersQuery } from '../../../../services/folders';\nimport { downloadFile } from '../../../../utils/downloadFile';\nimport {\n formatBytes,\n getFileExtension,\n prefixFileUrlWithBackendUrl,\n} from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_SELECTOR, ASSET_ITEM_CONTROL_SELECTOR } from '../../constants';\nimport { useFolderInfo } from '../../hooks/useFolderInfo';\nimport { ASSET_DETAILS_URL_PARAM, parseAssetDetailsId } from '../../hooks/useIsAssetDetailsOpen';\nimport { BusyOverlay } from '../BusyOverlay';\n\nimport { AssetCropEditor } from './AssetCropEditor';\nimport { AssetPreview } from './AssetPreview';\n\nimport type {\n AssetWithPopulatedCreatedBy,\n FocalPoint,\n} from '../../../../../../shared/contracts/files';\n\ninterface DrawerToast {\n type: 'success' | 'danger';\n message: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerNotifyContext — exposes the in-drawer toast setter so deep descendants\n * (footer action buttons) can report success/error without prop drilling.\n * -----------------------------------------------------------------------------------------------*/\n\ntype DrawerNotify = (toast: DrawerToast) => void;\n\nexport const DrawerNotifyContext = React.createContext<DrawerNotify | null>(null);\n\nconst useDrawerNotify = () => {\n const ctx = React.useContext(DrawerNotifyContext);\n if (!ctx) {\n throw new Error('useDrawerNotify must be used within AssetDetails');\n }\n return ctx;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetOperationsContext — drawer-scoped mutations + their pending state, so\n * leaf buttons (Delete, Replace) consume them without prop drilling and the\n * full-drawer busy overlay reads a single flag.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetOperations {\n replaceAsset: (file: globalThis.File) => Promise<void>;\n deleteAsset: () => Promise<void>;\n isReplacing: boolean;\n isDeleting: boolean;\n}\n\nexport const AssetOperationsContext = React.createContext<AssetOperations | null>(null);\n\nconst useAssetOperation = () => {\n const ctx = React.useContext(AssetOperationsContext);\n if (!ctx) {\n throw new Error('useAssetOperation must be used within AssetDetails');\n }\n return ctx;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useAssetDetailsParam = () => {\n const [{ query }, setQuery] = useQueryParams<{\n [ASSET_DETAILS_URL_PARAM]?: string;\n _q?: string;\n }>();\n\n const assetId = parseAssetDetailsId(query?.[ASSET_DETAILS_URL_PARAM]);\n const hasValidId = assetId !== null;\n\n // Closing is driven by removing the URL param (a navigation), so navigation\n // guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the\n // tree through the slide-out: it stays true once opened and only flips false\n // when the close animation actually ends (see onCloseAnimationEnd), so the\n // close duration lives entirely in CSS — no JS timer.\n const [isMounted, setIsMounted] = React.useState(hasValidId);\n const displayAssetId = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n if (hasValidId) {\n displayAssetId.current = assetId;\n setIsMounted(true);\n }\n }, [hasValidId, assetId]);\n\n const onCloseAnimationEnd = React.useCallback(\n (event: React.AnimationEvent) => {\n // Ignore animations bubbling up from descendants, and the slide-in.\n if (event.target === event.currentTarget && !hasValidId) {\n setIsMounted(false);\n }\n },\n [hasValidId]\n );\n\n const openDetails = React.useCallback(\n (id: number) => {\n setQuery(\n withEncodedUserParams(query, { [ASSET_DETAILS_URL_PARAM]: String(id) }),\n 'push',\n true\n );\n },\n [query, setQuery]\n );\n\n const closeDetails = React.useCallback(() => {\n setQuery(withEncodedUserParams(query, { [ASSET_DETAILS_URL_PARAM]: undefined }), 'push', true);\n }, [query, setQuery]);\n\n return {\n assetId: hasValidId ? assetId : displayAssetId.current,\n isVisible: hasValidId,\n shouldRenderDrawer: isMounted,\n onCloseAnimationEnd,\n openDetails,\n closeDetails,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DetailItem\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DetailItemProps {\n label: string;\n value: React.ReactNode;\n}\n\nconst DetailItemContainer = styled(Flex)`\n flex: 0 0 calc(50% - ${({ theme }) => theme.spaces[2]});\n`;\n\nconst DetailItem = ({ label, value }: DetailItemProps) => (\n <DetailItemContainer\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n gap={1}\n >\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n fontWeight=\"semiBold\"\n textTransform=\"uppercase\"\n >\n {label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {value ?? '-'}\n </Typography>\n </DetailItemContainer>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * DetailField\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Make the asset details Form behave as a flex column inside Drawer.Body so\n * the scrollable area can grow while the footer stays pinned at the bottom.\n * The Form component from `@strapi/admin/strapi-admin` only forwards `width`\n * + `height` to its Box, so we target the rendered `<form>` element via a\n * styled-components descendant rule.\n */\nconst FormShell = styled(Box)`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n > form {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n position: relative;\n }\n`;\n\n/**\n * In-drawer toast container\n */\nconst DrawerToastSlot = styled(Box)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[2]};\n left: 50%;\n transform: translateX(-50%);\n z-index: 10;\n width: calc(100% - ${({ theme }) => theme.spaces[2]});\n`;\n\n/**\n * Map the drawer-scoped mutation flags to a single i18n message for the busy\n * overlay loader. Returns `null` when nothing is in flight.\n *\n * Exported for the unit test: the branch order only matters when two flags are\n * true at once, which the UI makes hard to stage through the rendered drawer\n * (each trigger disables itself while its own mutation runs).\n */\nexport const getBusyMessage = (state: {\n isDeleting: boolean;\n isReplacing: boolean;\n isCropCopying: boolean;\n}): { id: string; defaultMessage: string } | null => {\n if (state.isDeleting) {\n return {\n id: getTranslationKey('asset-details.delete.loading'),\n defaultMessage: 'Deleting the file…',\n };\n }\n if (state.isCropCopying) {\n return {\n id: getTranslationKey('asset-details.crop.loading'),\n defaultMessage: 'Saving the copy…',\n };\n }\n if (state.isReplacing) {\n return {\n id: getTranslationKey('asset-details.replace.loading'),\n defaultMessage: 'Replacing the file…',\n };\n }\n return null;\n};\n\nconst StyledWarning = styled(WarningCircle)`\n width: 1.6rem;\n height: 1.6rem;\n\n path {\n fill: ${({ theme }) => theme.colors.warning500};\n }\n`;\n\ninterface DetailFieldProps {\n name: string;\n label: string;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst DetailField = ({ name, label, required, disabled }: DetailFieldProps) => {\n const { formatMessage } = useIntl();\n const field = useField<string>(name);\n const isSubmitting = useForm('DetailField', (state) => state.isSubmitting);\n\n // The form context (use-context-selector) echoes changes back\n // asynchronously — driving the input straight from `field.value` makes\n // React rewrite the DOM value after the keystroke, which throws the cursor\n // to the end of the field. The input is therefore controlled by local state\n // (synchronous, cursor-safe) and the form follows; the effect below only\n // matters for EXTERNAL value changes (discard/reset), where a cursor jump\n // is fine because the user isn't typing.\n const fieldValue = field.value ?? '';\n const [value, setValue] = React.useState(fieldValue);\n\n React.useEffect(() => {\n setValue(fieldValue);\n }, [fieldValue]);\n\n const emptyTooltipLabel = formatMessage(\n {\n id: getTranslationKey('asset-details.field.empty'),\n defaultMessage: '{label} is currently empty.',\n },\n { label }\n );\n\n return (\n <Field.Root name={name} required={required}>\n <Field.Label>{label}</Field.Label>\n <TextInput\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n field.onChange(name, event.target.value);\n }}\n endAction={\n !value ? (\n <Tooltip label={emptyTooltipLabel}>\n <StyledWarning aria-label={emptyTooltipLabel} role=\"img\" />\n </Tooltip>\n ) : undefined\n }\n type=\"text\"\n disabled={isSubmitting || disabled}\n />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LocationField\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LocationFieldProps {\n label: string;\n rootLabel: string;\n folders: Array<{ id: number; name: string }>;\n disabled?: boolean;\n}\n\nconst LocationField = ({ label, rootLabel, folders, disabled }: LocationFieldProps) => {\n const field = useField<number | null>('folder');\n const isSubmitting = useForm('LocationField', (state) => state.isSubmitting);\n\n return (\n <Field.Root name=\"folder\" required>\n <Field.Label>{label}</Field.Label>\n {/* `null` is the canonical \"root of the Media Library\" value everywhere\n in the upload domain. The DS `SingleSelectOption.value` prop is typed\n `string | number`, so we use the empty string as a DOM-only sentinel\n for the root option and map it back to `null` on change. */}\n <SingleSelect\n value={field.value == null ? '' : String(field.value)}\n onChange={(value) => {\n const next = value === '' ? null : Number(value);\n field.onChange('folder', next);\n }}\n disabled={isSubmitting || disabled}\n >\n <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>\n {folders.map((folder) => (\n <SingleSelectOption key={folder.id} value={String(folder.id)}>\n {folder.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteAssetButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeleteAssetButton = () => {\n const { formatMessage } = useIntl();\n const { deleteAsset, isDeleting } = useAssetOperation();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleConfirm = async () => {\n await deleteAsset();\n setIsOpen(false);\n };\n\n const triggerLabel = formatMessage({\n id: getTranslationKey('asset-details.delete.trigger'),\n defaultMessage: 'Delete this file',\n });\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={setIsOpen}>\n <Dialog.Trigger>\n <IconButton label={triggerLabel} variant=\"danger-light\">\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.delete.title'),\n defaultMessage: 'Delete this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n {formatMessage({\n id: getTranslationKey('asset-details.delete.description'),\n defaultMessage:\n 'This file cannot be recovered once deleted. If it is currently in use, linked content will break and image containers will be empty.',\n })}\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"danger-light\" loading={isDeleting} onClick={handleConfirm} fullWidth>\n {formatMessage({ id: 'app.components.Button.confirm', defaultMessage: 'Confirm' })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CopyLinkButton — write the absolute asset URL to the clipboard.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CopyLinkButtonProps {\n asset: AssetWithPopulatedCreatedBy;\n}\n\nconst CopyLinkButton = ({ asset }: CopyLinkButtonProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const notify = useDrawerNotify();\n\n const handleCopy = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n if (!url) return;\n const didCopy = await copy(url);\n notify({\n type: didCopy ? 'success' : 'danger',\n message: didCopy\n ? formatMessage({\n id: getTranslationKey('asset-details.copy-link.success'),\n defaultMessage: 'Link copied.',\n })\n : formatMessage({\n id: getTranslationKey('asset-details.copy-link.error'),\n defaultMessage: 'Failed to copy the link.',\n }),\n });\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.copy-link.trigger'),\n defaultMessage: 'Copy link',\n })}\n variant=\"tertiary\"\n onClick={handleCopy}\n >\n <Link />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DownloadAssetButton — fetch the file and trigger a browser download.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DownloadAssetButtonProps {\n asset: AssetWithPopulatedCreatedBy;\n}\n\nconst DownloadAssetButton = ({ asset }: DownloadAssetButtonProps) => {\n const { formatMessage } = useIntl();\n const notify = useDrawerNotify();\n const [isDownloading, setIsDownloading] = React.useState(false);\n\n const handleDownload = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n if (!url) return;\n setIsDownloading(true);\n try {\n await downloadFile(url, asset.name);\n } catch {\n notify({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('asset-details.download.error'),\n defaultMessage: 'Failed to download the file.',\n }),\n });\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.download.trigger'),\n defaultMessage: 'Download',\n })}\n variant=\"tertiary\"\n onClick={handleDownload}\n disabled={isDownloading}\n >\n <Download />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReplaceAssetButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ReplaceAssetButtonProps {\n /**\n * The asset's mime. Two jobs: the dialog only promises AI metadata when it\n * applies, and the file picker only offers files of the same type.\n */\n mime?: string | null;\n}\n\nconst ReplaceAssetButton = ({ mime }: ReplaceAssetButtonProps) => {\n const { formatMessage } = useIntl();\n const { replaceAsset, isReplacing } = useAssetOperation();\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const [isDialogOpen, setIsDialogOpen] = React.useState(false);\n const aiEnabled = useAIMetadataEnabled({ mime });\n\n const handleTriggerClick = () => {\n setIsDialogOpen(true);\n };\n\n const handleContinue = () => {\n // Confirm first, then open the native picker so the user only commits to\n // replacing after acknowledging the warning. The actual POST is delegated\n // to the parent (which owns the mutation + loading state).\n setIsDialogOpen(false);\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the native input so the same file can be picked again later.\n event.target.value = '';\n if (!file) {\n return;\n }\n await replaceAsset(file);\n };\n\n return (\n <>\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={mime ?? ''}\n multiple={false}\n onChange={handleFileChange}\n aria-hidden\n tabIndex={-1}\n />\n </VisuallyHidden>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.replace.trigger'),\n defaultMessage: 'Replace this file',\n })}\n variant=\"tertiary\"\n onClick={handleTriggerClick}\n disabled={isReplacing}\n >\n <ArrowsCounterClockwise />\n </IconButton>\n <Dialog.Root open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.title'),\n defaultMessage: 'Replace this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body textAlign=\"center\">\n <Flex direction=\"column\" textAlign=\"center\">\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description'),\n defaultMessage: 'Current content will be permanently replaced.',\n })}\n </Typography>\n {aiEnabled ? (\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description.ai'),\n defaultMessage: 'AI will generate new metadata after upload.',\n })}\n </Typography>\n ) : null}\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"secondary\" onClick={handleContinue} fullWidth>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.continue'),\n defaultMessage: 'Continue',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetImageActions - image-editing controls overlaid on the preview.\n *\n * Crop only. Replace used to sit here too, directly beneath it, which put a\n * file-level operation among the image-editing controls and read as if replacing\n * were a kind of editing. It now lives in the footer with its peers.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetImageActionsProps {\n onCrop?: () => void;\n}\n\nconst AssetImageActions = ({ onCrop }: AssetImageActionsProps) => {\n const { formatMessage } = useIntl();\n const isSubmitting = useForm('AssetImageActions', (state) => state.isSubmitting);\n\n return (\n <Flex direction=\"column\" gap={2}>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.crop.trigger'),\n defaultMessage: 'Crop',\n })}\n variant=\"tertiary\"\n onClick={onCrop}\n disabled={isSubmitting || !onCrop}\n >\n <Crop />\n </IconButton>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetDetails\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetDetailsProps {\n asset: AssetWithPopulatedCreatedBy;\n closeDetails: () => void;\n}\n\ninterface AssetFormState {\n name: string;\n caption: string;\n alternativeText: string;\n folder: number | null;\n}\n\nexport const AssetDetails = ({ asset, closeDetails }: AssetDetailsProps) => {\n const { formatMessage, formatDate } = useIntl();\n const getErrorMessage = useApiErrorMessage();\n const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions();\n const { data: folders = [] } = useGetAllFoldersQuery();\n const { toggleNotification } = useNotification();\n const [updateAsset] = useUpdateAssetMutation();\n const { trackUsage } = useTracking();\n const [replaceMutation, { isLoading: isReplacing }] = useReplaceAssetMutation();\n const [deleteMutation, { isLoading: isDeleting }] = useDeleteAssetMutation();\n const [uploadCroppedCopy, { isLoading: isCropCopying }] = useUploadFileSilentlyMutation();\n\n const [isCropOpen, setIsCropOpen] = React.useState(false);\n\n // In-drawer toast slot\n const [drawerToast, setDrawerToast] = React.useState<DrawerToast | null>(null);\n React.useEffect(() => {\n if (!drawerToast) return;\n const timer = window.setTimeout(() => setDrawerToast(null), 5000);\n return () => window.clearTimeout(timer);\n }, [drawerToast]);\n\n // Local alias matching the DrawerNotifyContext signature, so the drawer's\n // own handlers (replace, update) read like the consumers do.\n const notify = React.useCallback<DrawerNotify>((toast) => setDrawerToast(toast), []);\n\n const isImage = asset.mime?.includes(ASSET_TYPES.Image);\n\n const initialValues: AssetFormState = {\n name: asset.name ?? '',\n caption: asset.caption ?? '',\n alternativeText: asset.alternativeText ?? '',\n folder:\n typeof asset.folder === 'object' && asset.folder !== null\n ? ((asset.folder as { id: number }).id ?? null)\n : ((asset.folder as number | null | undefined) ?? null),\n };\n\n const handleSubmit = async (values: AssetFormState) => {\n const fileInfo = {\n name: values.name,\n caption: values.caption,\n alternativeText: values.alternativeText,\n folder: values.folder,\n };\n\n const res = await updateAsset({ id: asset.id, fileInfo });\n\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.update.error'),\n defaultMessage: 'Failed to update the file.',\n })\n ),\n });\n return;\n }\n\n trackUsage('didEditMediaLibraryElements', {\n location: MEDIA_LIBRARY_LOCATION,\n // Legacy sends the mime top-level type (image/video/audio/application…).\n type: asset.mime?.split('/')[0],\n changeLocation: values.folder !== initialValues.folder,\n });\n\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.update.success'),\n defaultMessage: 'File updated',\n }),\n });\n };\n\n const { title: folderName } = useFolderInfo(\n typeof asset.folder === 'object' && asset.folder !== null\n ? ((asset.folder as { id: number }).id ?? null)\n : ((asset.folder as number | null | undefined) ?? null)\n );\n\n // Owns the replace upload so isReplacing can drive the busy overlay.\n const handleReplace = React.useCallback(\n async (file: globalThis.File) => {\n const res = await replaceMutation({ id: asset.id, file, fileInfo: { name: asset.name } });\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.replace.error'),\n defaultMessage: 'Failed to replace the file.',\n })\n ),\n });\n return;\n }\n trackUsage('didReplaceMedia', { location: MEDIA_LIBRARY_LOCATION });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.replace.success'),\n defaultMessage: 'File replaced.',\n }),\n });\n },\n [asset.id, asset.name, formatMessage, getErrorMessage, notify, replaceMutation, trackUsage]\n );\n\n // Owns the delete: on error notify in-drawer (drawer stays), on success fire\n // a persistent global notification then close the drawer.\n const handleDelete = React.useCallback(async () => {\n const res = await deleteMutation(asset.id);\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.delete.error'),\n defaultMessage: 'Failed to delete the asset.',\n })\n ),\n });\n return;\n }\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('asset-details.delete.success'),\n defaultMessage: '1 element have been deleted from {folderName}',\n },\n { folderName }\n ),\n });\n closeDetails();\n }, [\n asset.id,\n closeDetails,\n deleteMutation,\n folderName,\n formatMessage,\n getErrorMessage,\n notify,\n toggleNotification,\n ]);\n\n const notifyCropError = (error?: unknown) => {\n notify({\n type: 'danger',\n message: getErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('asset-details.crop.error'),\n defaultMessage: 'Failed to update the file.',\n })\n ),\n });\n };\n\n // Apply: replace the original binary with the cropped file + focal point.\n // Close the editor first so the drawer's busy overlay is visible while the\n // mutation runs (the editor renders in a Portal above the drawer).\n const handleCropApply = async (file: globalThis.File, focalPoint: FocalPoint) => {\n setIsCropOpen(false);\n const res = await replaceMutation({\n id: asset.id,\n file,\n fileInfo: { focalPoint },\n });\n if ('error' in res) {\n notifyCropError(res.error);\n return;\n }\n trackUsage('didCropFile', { location: MEDIA_LIBRARY_LOCATION, duplicatedFile: false });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.crop.success'),\n defaultMessage: 'File updated',\n }),\n });\n };\n\n // Save as copy: upload the cropped file as a new asset in the same folder.\n const handleCropSaveAsCopy = async (file: globalThis.File, focalPoint: FocalPoint) => {\n setIsCropOpen(false);\n // Silent single-file upload (no global progress dialog). Carry over the\n // source asset's caption/alt so the copy keeps its metadata.\n const res = await uploadCroppedCopy({\n file,\n fileInfo: {\n name: asset.name,\n caption: asset.caption ?? '',\n alternativeText: asset.alternativeText ?? '',\n folder: initialValues.folder,\n focalPoint,\n },\n });\n if ('error' in res) {\n notifyCropError(res.error);\n return;\n }\n trackUsage('didCropFile', { location: MEDIA_LIBRARY_LOCATION, duplicatedFile: true });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.crop.copy-success'),\n defaultMessage: 'Copy created.',\n }),\n });\n };\n\n const operations = React.useMemo<AssetOperations>(\n () => ({\n replaceAsset: handleReplace,\n deleteAsset: handleDelete,\n isReplacing,\n isDeleting,\n }),\n [handleReplace, handleDelete, isReplacing, isDeleting]\n );\n\n return (\n // `key={asset.id}` resets the form when the drawer switches to a different\n // asset so cached values from the previous asset don't bleed in.\n <DrawerNotifyContext.Provider value={notify}>\n <AssetOperationsContext.Provider value={operations}>\n <FormShell>\n <Form key={asset.id} method=\"POST\" initialValues={initialValues} onSubmit={handleSubmit}>\n {({ modified, isSubmitting, values, resetForm }) => {\n const nameIsEmpty = ((values as AssetFormState).name ?? '').trim() === '';\n const busyMessage = getBusyMessage({ isDeleting, isReplacing, isCropCopying });\n return (\n <>\n {/* Guards every close path (X button, ESC, route change, browser\n back) by intercepting the navigation when the form is dirty.\n `onProceed` resets the form so the held navigation can complete.\n Lives inside <Form> so it can read the form context. */}\n <Blocker onProceed={resetForm} />\n {isCropOpen && isImage ? (\n <AssetCropEditor\n asset={asset}\n onClose={() => setIsCropOpen(false)}\n onApply={handleCropApply}\n onSaveAsCopy={handleCropSaveAsCopy}\n canSaveAsCopy={canCreate}\n />\n ) : null}\n {busyMessage ? <BusyOverlay>{formatMessage(busyMessage)}</BusyOverlay> : null}\n {drawerToast ? (\n <DrawerToastSlot>\n <Alert\n variant={drawerToast.type === 'success' ? 'success' : 'danger'}\n closeLabel={formatMessage({ id: 'global.close', defaultMessage: 'Close' })}\n onClose={() => setDrawerToast(null)}\n >\n {drawerToast.message}\n </Alert>\n </DrawerToastSlot>\n ) : null}\n <Drawer.ScrollableContent>\n <AssetPreview\n asset={asset}\n actions={\n isImage && canUpdate ? (\n <AssetImageActions onCrop={() => setIsCropOpen(true)} />\n ) : null\n }\n />\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={5}\n paddingRight={5}\n >\n <Typography variant=\"beta\" fontWeight=\"semiBold\" tag=\"h3\">\n {formatMessage({\n id: getTranslationKey('asset-details.fileInfo'),\n defaultMessage: 'File info',\n })}\n </Typography>\n <Flex\n wrap=\"wrap\"\n gap={4}\n background=\"neutral100\"\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={6}\n paddingRight={6}\n alignItems=\"flex-start\"\n >\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.creationDate'),\n defaultMessage: 'Creation date',\n })}\n value={\n asset.createdAt\n ? formatDate(new Date(asset.createdAt), {\n dateStyle: 'long',\n timeStyle: 'short',\n })\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.lastUpdated'),\n defaultMessage: 'Last updated',\n })}\n value={\n asset.updatedAt\n ? formatDate(new Date(asset.updatedAt), {\n dateStyle: 'long',\n timeStyle: 'short',\n })\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.createdBy'),\n defaultMessage: 'Created by',\n })}\n value={\n asset.createdBy\n ? (getDisplayName({\n firstname: asset.createdBy.firstname ?? undefined,\n lastname: asset.createdBy.lastname ?? undefined,\n username: asset.createdBy.username ?? undefined,\n email: asset.createdBy.email ?? undefined,\n }) ?? '-')\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.size'),\n defaultMessage: 'Size',\n })}\n value={asset.size ? formatBytes(asset.size, 1) : null}\n />\n {isImage && (asset.width != null || asset.height != null) && (\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.dimensions'),\n defaultMessage: 'Dimensions',\n })}\n value={\n asset.width != null && asset.height != null\n ? `${asset.width} × ${asset.height}`\n : null\n }\n />\n )}\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.extension'),\n defaultMessage: 'Extension',\n })}\n value={getFileExtension(asset.ext)}\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.assetId'),\n defaultMessage: 'Asset ID',\n })}\n value={String(asset.id)}\n />\n </Flex>\n <DetailField\n name=\"name\"\n label={formatMessage({\n id: getTranslationKey('asset-details.fileName'),\n defaultMessage: 'File name',\n })}\n required\n disabled={!canUpdate}\n />\n <LocationField\n label={formatMessage({\n id: getTranslationKey('asset-details.location'),\n defaultMessage: 'Location',\n })}\n rootLabel={formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n })}\n folders={folders}\n disabled={!canUpdate}\n />\n {/* Caption and alternative text apply to every file type\n (matches the legacy Media Library), not images only. */}\n <DetailField\n name=\"caption\"\n label={formatMessage({\n id: getTranslationKey('asset-details.caption'),\n defaultMessage: 'Caption',\n })}\n disabled={!canUpdate}\n />\n <DetailField\n name=\"alternativeText\"\n label={formatMessage({\n id: getTranslationKey('asset-details.alternativeText'),\n defaultMessage: 'Alternative text',\n })}\n disabled={!canUpdate}\n />\n </Flex>\n </Drawer.ScrollableContent>\n {/* Every footer action is permission-gated — when none survive,\n drop the whole bar instead of showing an empty strip. */}\n {(canUpdate || canCopyLink || canDownload) && (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n gap={2}\n padding={3}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px 0 0 0\"\n background=\"neutral0\"\n >\n <Flex gap={2}>\n {canUpdate && <DeleteAssetButton />}\n {canCopyLink && <CopyLinkButton asset={asset} />}\n {canDownload && <DownloadAssetButton asset={asset} />}\n {canUpdate && <ReplaceAssetButton mime={asset.mime} />}\n </Flex>\n {canUpdate && (\n <Button\n type=\"submit\"\n variant=\"default\"\n loading={isSubmitting}\n // File name is required; block submit when it's empty or whitespace so the API can't 400 on a blank value.\n disabled={!modified || isSubmitting || nameIsEmpty}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.save'),\n defaultMessage: 'Save changes',\n })}\n </Button>\n )}\n </Flex>\n )}\n </>\n );\n }}\n </Form>\n </FormShell>\n </AssetOperationsContext.Provider>\n </DrawerNotifyContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerHeader\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The icon's size lives in SVG attributes, which flex is free to override, so a\n * long asset name would squash it. Matches the grid and table rows, where the\n * file-type icon is shrink-proof and the name is what truncates.\n */\nconst HeaderIcon = styled(Flex)`\n flex-shrink: 0;\n`;\n\nconst HeaderTitle = styled(Typography)`\n min-width: 0;\n`;\n\ninterface DrawerHeaderProps {\n asset: AssetWithPopulatedCreatedBy;\n closeDetails: () => void;\n}\n\nconst DrawerHeader = ({ asset, closeDetails }: DrawerHeaderProps) => {\n const DocIcon = asset ? getAssetIcon(asset.mime, asset.ext) : FileError;\n return (\n <Flex\n gap={2}\n paddingLeft={5}\n paddingTop={3}\n paddingBottom={3}\n paddingRight={3}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0 0 1px 0\"\n >\n <HeaderIcon>\n <DocIcon width={20} height={20} />\n </HeaderIcon>\n <Drawer.Title asChild>\n <HeaderTitle variant=\"omega\" fontWeight=\"semiBold\" overflow=\"hidden\" ellipsis tag=\"h2\">\n {asset.name}\n </HeaderTitle>\n </Drawer.Title>\n <Box marginLeft=\"auto\">\n <Drawer.CloseButton onClose={closeDetails}>\n <ArrowLineRight />\n </Drawer.CloseButton>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerContentProps {\n assetId: number;\n closeDetails: () => void;\n}\n\nconst DrawerContent = ({ assetId, closeDetails }: DrawerContentProps) => {\n const { formatMessage } = useIntl();\n const {\n data: asset,\n isLoading,\n error,\n } = useGetAssetQuery(assetId, {\n refetchOnMountOrArgChange: false,\n refetchOnReconnect: false,\n refetchOnFocus: false,\n });\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error || !asset) {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4} padding={4}>\n <Alert\n variant=\"danger\"\n closeLabel={formatMessage({ id: 'global.close', defaultMessage: 'Close' })}\n onClose={closeDetails}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.error'),\n defaultMessage: 'Failed to load file details.',\n })}\n </Alert>\n </Flex>\n );\n }\n\n return (\n <>\n <DrawerHeader asset={asset} closeDetails={closeDetails} />\n <AssetDetails asset={asset} closeDetails={closeDetails} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetDetailsDrawer\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Whether a pointer press outside the panel should leave the drawer open.\n *\n * Anywhere on the page behind dismisses it, controls included. Two exceptions,\n * neither of which is \"the user meant to stay\": the part of an asset's card or\n * row whose `click` switches the drawer rather than closing it — not its own\n * checkbox or actions menu, which act on the item; and a panel already closing,\n * which `forceMount` keeps listening through its animation, where dismissing\n * again would re-trigger the unsaved-changes guard for nothing.\n */\nconst shouldKeepDrawerOpen = (\n event: { target: EventTarget | null; detail: { originalEvent: { button: number } } },\n isVisible: boolean\n) => {\n if (!isVisible) {\n return true;\n }\n\n // Radix's dismisser fires on any `pointerdown`, secondary buttons included. A\n // right-click is contextual, and with the create menu on the background one\n // press would otherwise both close this and open that.\n if (event.detail.originalEvent.button !== 0) {\n return true;\n }\n\n if (!(event.target instanceof Element)) {\n return false;\n }\n\n // The card's own controls — its checkbox, its actions menu — act on the item\n // and stop the card's click, so no switch follows and the press dismisses.\n return (\n event.target.closest(ASSET_DETAILS_TRIGGER_SELECTOR) !== null &&\n event.target.closest(ASSET_ITEM_CONTROL_SELECTOR) === null\n );\n};\n\nexport const AssetDetailsDrawer = () => {\n const { formatMessage } = useIntl();\n const { assetId, isVisible, shouldRenderDrawer, onCloseAnimationEnd, closeDetails } =\n useAssetDetailsParam();\n\n if (!shouldRenderDrawer || assetId === null) {\n return null;\n }\n\n return (\n <Drawer.Root isVisible={isVisible} onClose={closeDetails}>\n {/* Wrapper div required: Dialog.Portal uses asChild and merges ref onto each child.\n VisuallyHidden does not forward refs, so we wrap it in a div that can receive the ref. */}\n <div>\n <VisuallyHidden>\n <Drawer.Title>\n {formatMessage({\n id: getTranslationKey('asset-details.title'),\n defaultMessage: 'File details',\n })}\n </Drawer.Title>\n <Drawer.Description>\n {formatMessage({\n id: getTranslationKey('asset-details.description'),\n defaultMessage: 'Displays file information and metadata',\n })}\n </Drawer.Description>\n </VisuallyHidden>\n </div>\n <Drawer.Body\n animationDirection=\"left\"\n width=\"41.6rem\"\n // dvh, not vh: the drawer is anchored to the bottom, so with 100vh on\n // mobile (where the URL bar shrinks the visual viewport below 100vh)\n // the top of the drawer — header, title, close button — is pushed\n // off-screen. dvh tracks the actual visible height.\n height=\"100dvh\"\n onAnimationEnd={onCloseAnimationEnd}\n // Opt in to dismiss-on-outside-click; `closeDetails` is the same path\n // as the header's close button, so unsaved edits are still guarded.\n onPointerDownOutside={(event) => {\n if (shouldKeepDrawerOpen(event, isVisible)) {\n event.preventDefault();\n }\n }}\n >\n <DrawerContent assetId={assetId} closeDetails={closeDetails} />\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["DrawerNotifyContext","React","createContext","useDrawerNotify","ctx","useContext","Error","AssetOperationsContext","useAssetOperation","useAssetDetailsParam","query","setQuery","useQueryParams","assetId","parseAssetDetailsId","ASSET_DETAILS_URL_PARAM","hasValidId","isMounted","setIsMounted","useState","displayAssetId","useRef","useEffect","current","onCloseAnimationEnd","useCallback","event","target","currentTarget","openDetails","id","withEncodedUserParams","String","closeDetails","undefined","isVisible","shouldRenderDrawer","DetailItemContainer","styled","Flex","theme","spaces","DetailItem","label","value","_jsxs","direction","justifyContent","alignItems","gap","_jsx","Typography","variant","textColor","fontWeight","textTransform","FormShell","Box","DrawerToastSlot","getBusyMessage","state","isDeleting","getTranslationKey","defaultMessage","isCropCopying","isReplacing","StyledWarning","WarningCircle","colors","warning500","DetailField","name","required","disabled","formatMessage","useIntl","field","useField","isSubmitting","useForm","fieldValue","setValue","emptyTooltipLabel","Field","Root","Label","TextInput","onChange","endAction","Tooltip","aria-label","role","type","LocationField","rootLabel","folders","SingleSelect","next","Number","SingleSelectOption","map","folder","DeleteAssetButton","deleteAsset","isOpen","setIsOpen","handleConfirm","triggerLabel","Dialog","open","onOpenChange","Trigger","IconButton","Trash","Content","Header","Body","icon","width","height","fill","textAlign","Footer","Cancel","Button","fullWidth","Action","loading","onClick","CopyLinkButton","asset","copy","useClipboard","notify","handleCopy","url","prefixFileUrlWithBackendUrl","didCopy","message","Link","DownloadAssetButton","isDownloading","setIsDownloading","handleDownload","downloadFile","Download","ReplaceAssetButton","mime","replaceAsset","fileInputRef","isDialogOpen","setIsDialogOpen","aiEnabled","useAIMetadataEnabled","handleTriggerClick","handleContinue","click","handleFileChange","file","files","_Fragment","VisuallyHidden","input","ref","accept","multiple","aria-hidden","tabIndex","ArrowsCounterClockwise","AssetImageActions","onCrop","Crop","AssetDetails","formatDate","getErrorMessage","useApiErrorMessage","canCreate","canUpdate","canDownload","canCopyLink","useMediaLibraryPermissions","data","useGetAllFoldersQuery","toggleNotification","useNotification","updateAsset","useUpdateAssetMutation","trackUsage","useTracking","replaceMutation","isLoading","useReplaceAssetMutation","deleteMutation","useDeleteAssetMutation","uploadCroppedCopy","useUploadFileSilentlyMutation","isCropOpen","setIsCropOpen","drawerToast","setDrawerToast","timer","window","setTimeout","clearTimeout","toast","isImage","includes","ASSET_TYPES","Image","initialValues","caption","alternativeText","handleSubmit","values","fileInfo","res","error","location","MEDIA_LIBRARY_LOCATION","split","changeLocation","title","folderName","useFolderInfo","handleReplace","handleDelete","notifyCropError","handleCropApply","focalPoint","duplicatedFile","handleCropSaveAsCopy","operations","useMemo","Provider","Form","method","onSubmit","modified","resetForm","nameIsEmpty","trim","busyMessage","Blocker","onProceed","AssetCropEditor","onClose","onApply","onSaveAsCopy","canSaveAsCopy","BusyOverlay","Alert","closeLabel","Drawer","ScrollableContent","AssetPreview","actions","paddingTop","paddingBottom","paddingLeft","paddingRight","tag","wrap","background","createdAt","Date","dateStyle","timeStyle","updatedAt","createdBy","getDisplayName","firstname","lastname","username","email","size","formatBytes","getFileExtension","ext","padding","borderColor","borderStyle","borderWidth","HeaderIcon","HeaderTitle","DrawerHeader","DocIcon","getAssetIcon","FileError","Title","asChild","overflow","ellipsis","marginLeft","CloseButton","ArrowLineRight","DrawerContent","useGetAssetQuery","refetchOnMountOrArgChange","refetchOnReconnect","refetchOnFocus","Loader","shouldKeepDrawerOpen","detail","originalEvent","button","Element","closest","ASSET_DETAILS_TRIGGER_SELECTOR","ASSET_ITEM_CONTROL_SELECTOR","AssetDetailsDrawer","div","Description","animationDirection","onAnimationEnd","onPointerDownOutside","preventDefault"],"mappings":"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"}
1
+ {"version":3,"file":"AssetDetailsDrawer.js","sources":["../../../../../../admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Blocker,\n ConfirmDialog,\n Form,\n useClipboard,\n useField,\n useForm,\n useNotification,\n useQueryParams,\n withEncodedUserParams,\n getDisplayName,\n type FormHelpers,\n} from '@strapi/admin/strapi-admin';\nimport {\n Alert,\n Box,\n Button,\n Dialog,\n Field,\n Flex,\n IconButton,\n Loader,\n SingleSelect,\n SingleSelectOption,\n TextInput,\n Tooltip,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport {\n ArrowLineRight,\n ArrowsCounterClockwise,\n Crop,\n Download,\n FileError,\n Link,\n Trash,\n WarningCircle,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Drawer } from '../../../../components/Drawer';\nimport { ASSET_TYPES } from '../../../../enums';\nimport { useAIMetadataEnabled } from '../../../../hooks/useAIMetadataEnabled';\nimport { useApiErrorMessage } from '../../../../hooks/useApiErrorMessage';\nimport { useMediaLibraryPermissions } from '../../../../hooks/useMediaLibraryPermissions';\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../../hooks/useTracking';\nimport { useUploadFileSilentlyMutation } from '../../../../services/api';\nimport {\n useDeleteAssetMutation,\n useGetAssetQuery,\n useReplaceAssetMutation,\n useUpdateAssetMutation,\n} from '../../../../services/assets';\nimport { useGetAllFoldersQuery } from '../../../../services/folders';\nimport { downloadFile } from '../../../../utils/downloadFile';\nimport {\n formatBytes,\n getFileExtension,\n prefixFileUrlWithBackendUrl,\n} from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_SELECTOR, ASSET_ITEM_CONTROL_SELECTOR } from '../../constants';\nimport { useFolderInfo } from '../../hooks/useFolderInfo';\nimport { ASSET_DETAILS_URL_PARAM, parseAssetDetailsId } from '../../hooks/useIsAssetDetailsOpen';\nimport { BusyOverlay } from '../BusyOverlay';\n\nimport { AssetCropEditor } from './AssetCropEditor';\nimport { AssetPreview } from './AssetPreview';\n\nimport type {\n AssetWithPopulatedCreatedBy,\n FocalPoint,\n} from '../../../../../../shared/contracts/files';\n\ninterface DrawerToast {\n type: 'success' | 'danger';\n message: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerNotifyContext — exposes the in-drawer toast setter so deep descendants\n * (footer action buttons) can report success/error without prop drilling.\n * -----------------------------------------------------------------------------------------------*/\n\ntype DrawerNotify = (toast: DrawerToast) => void;\n\nexport const DrawerNotifyContext = React.createContext<DrawerNotify | null>(null);\n\nconst useDrawerNotify = () => {\n const ctx = React.useContext(DrawerNotifyContext);\n if (!ctx) {\n throw new Error('useDrawerNotify must be used within AssetDetails');\n }\n return ctx;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetOperationsContext — drawer-scoped mutations + their pending state, so\n * leaf buttons (Delete, Replace) consume them without prop drilling and the\n * full-drawer busy overlay reads a single flag.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetOperations {\n replaceAsset: (file: globalThis.File) => Promise<void>;\n deleteAsset: () => Promise<void>;\n isReplacing: boolean;\n isDeleting: boolean;\n}\n\nexport const AssetOperationsContext = React.createContext<AssetOperations | null>(null);\n\nconst useAssetOperation = () => {\n const ctx = React.useContext(AssetOperationsContext);\n if (!ctx) {\n throw new Error('useAssetOperation must be used within AssetDetails');\n }\n return ctx;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useAssetDetailsParam - read and write the open asset in URL ?{ASSET_DETAILS_URL_PARAM}={id}\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useAssetDetailsParam = () => {\n const [{ query }, setQuery] = useQueryParams<{\n [ASSET_DETAILS_URL_PARAM]?: string;\n _q?: string;\n }>();\n\n const assetId = parseAssetDetailsId(query?.[ASSET_DETAILS_URL_PARAM]);\n\n // Closing is driven by removing the URL param (a navigation), so navigation\n // guards like <Blocker> can intercept it.\n const openDetails = React.useCallback(\n (id: number) => {\n setQuery(\n withEncodedUserParams(query, { [ASSET_DETAILS_URL_PARAM]: String(id) }),\n 'push',\n true\n );\n },\n [query, setQuery]\n );\n\n const closeDetails = React.useCallback(() => {\n setQuery(withEncodedUserParams(query, { [ASSET_DETAILS_URL_PARAM]: undefined }), 'push', true);\n }, [query, setQuery]);\n\n return { assetId, openDetails, closeDetails };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDrawerPresence - keep the drawer mounted through its slide-out\n * -----------------------------------------------------------------------------------------------*/\n\nconst useDrawerPresence = (assetId: number | null) => {\n const isVisible = assetId !== null;\n\n // `isMounted` stays true once opened and only flips false when the close\n // animation actually ends (see onCloseAnimationEnd), so the close duration\n // lives entirely in CSS — no JS timer. The last id is kept so the content\n // doesn't go blank mid-slide.\n const [isMounted, setIsMounted] = React.useState(isVisible);\n const displayAssetId = React.useRef<number | null>(assetId);\n\n React.useEffect(() => {\n if (assetId !== null) {\n displayAssetId.current = assetId;\n setIsMounted(true);\n }\n }, [assetId]);\n\n const onCloseAnimationEnd = React.useCallback(\n (event: React.AnimationEvent) => {\n // Ignore animations bubbling up from descendants, and the slide-in.\n if (event.target === event.currentTarget && !isVisible) {\n setIsMounted(false);\n }\n },\n [isVisible]\n );\n\n return {\n displayAssetId: isVisible ? assetId : displayAssetId.current,\n isVisible,\n shouldRender: isMounted,\n onCloseAnimationEnd,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DetailItem\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DetailItemProps {\n label: string;\n value: React.ReactNode;\n}\n\nconst DetailItemContainer = styled(Flex)`\n flex: 0 0 calc(50% - ${({ theme }) => theme.spaces[2]});\n`;\n\nconst DetailItem = ({ label, value }: DetailItemProps) => (\n <DetailItemContainer\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n gap={1}\n >\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n fontWeight=\"semiBold\"\n textTransform=\"uppercase\"\n >\n {label}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral700\">\n {value ?? '-'}\n </Typography>\n </DetailItemContainer>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * DetailField\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Make the asset details Form behave as a flex column inside Drawer.Body so\n * the scrollable area can grow while the footer stays pinned at the bottom.\n * The Form component from `@strapi/admin/strapi-admin` only forwards `width`\n * + `height` to its Box, so we target the rendered `<form>` element via a\n * styled-components descendant rule.\n */\nconst FormShell = styled(Box)`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n > form {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n position: relative;\n }\n`;\n\n/**\n * In-drawer toast container\n */\nconst DrawerToastSlot = styled(Box)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[2]};\n left: 50%;\n transform: translateX(-50%);\n z-index: 10;\n width: calc(100% - ${({ theme }) => theme.spaces[2]});\n`;\n\n/**\n * Map the drawer-scoped mutation flags to a single i18n message for the busy\n * overlay loader. Returns `null` when nothing is in flight.\n *\n * Exported for the unit test: the branch order only matters when two flags are\n * true at once, which the UI makes hard to stage through the rendered drawer\n * (each trigger disables itself while its own mutation runs).\n */\nexport const getBusyMessage = (state: {\n isDeleting: boolean;\n isReplacing: boolean;\n isCropCopying: boolean;\n}): { id: string; defaultMessage: string } | null => {\n if (state.isDeleting) {\n return {\n id: getTranslationKey('asset-details.delete.loading'),\n defaultMessage: 'Deleting the file…',\n };\n }\n if (state.isCropCopying) {\n return {\n id: getTranslationKey('asset-details.crop.loading'),\n defaultMessage: 'Saving the copy…',\n };\n }\n if (state.isReplacing) {\n return {\n id: getTranslationKey('asset-details.replace.loading'),\n defaultMessage: 'Replacing the file…',\n };\n }\n return null;\n};\n\nconst StyledWarning = styled(WarningCircle)`\n width: 1.6rem;\n height: 1.6rem;\n\n path {\n fill: ${({ theme }) => theme.colors.warning500};\n }\n`;\n\ninterface DetailFieldProps {\n name: string;\n label: string;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst DetailField = ({ name, label, required, disabled }: DetailFieldProps) => {\n const { formatMessage } = useIntl();\n const field = useField<string>(name);\n const isSubmitting = useForm('DetailField', (state) => state.isSubmitting);\n\n // The input is controlled by local state (synchronous, cursor-safe) and the\n // form follows. This was needed when the form context echoed changes back\n // asynchronously: driving the input straight from `field.value` made React\n // rewrite the DOM value after the keystroke, which threw the cursor to the\n // end of the field. The form context now updates synchronously, but the\n // local state is kept as a safe default. The effect below only matters for\n // EXTERNAL value changes (discard/reset), where a cursor jump is fine\n // because the user isn't typing.\n const fieldValue = field.value ?? '';\n const [value, setValue] = React.useState(fieldValue);\n\n React.useEffect(() => {\n setValue(fieldValue);\n }, [fieldValue]);\n\n const emptyTooltipLabel = formatMessage(\n {\n id: getTranslationKey('asset-details.field.empty'),\n defaultMessage: '{label} is currently empty.',\n },\n { label }\n );\n\n return (\n <Field.Root name={name} required={required}>\n <Field.Label>{label}</Field.Label>\n <TextInput\n value={value}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n setValue(event.target.value);\n field.onChange(name, event.target.value);\n }}\n endAction={\n !value ? (\n <Tooltip label={emptyTooltipLabel}>\n <StyledWarning aria-label={emptyTooltipLabel} role=\"img\" />\n </Tooltip>\n ) : undefined\n }\n type=\"text\"\n disabled={isSubmitting || disabled}\n />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LocationField\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LocationFieldProps {\n label: string;\n rootLabel: string;\n folders: Array<{ id: number; name: string }>;\n disabled?: boolean;\n}\n\nconst LocationField = ({ label, rootLabel, folders, disabled }: LocationFieldProps) => {\n const field = useField<number | null>('folder');\n const isSubmitting = useForm('LocationField', (state) => state.isSubmitting);\n\n return (\n <Field.Root name=\"folder\" required>\n <Field.Label>{label}</Field.Label>\n {/* `null` is the canonical \"root of the Media Library\" value everywhere\n in the upload domain. The DS `SingleSelectOption.value` prop is typed\n `string | number`, so we use the empty string as a DOM-only sentinel\n for the root option and map it back to `null` on change. */}\n <SingleSelect\n value={field.value == null ? '' : String(field.value)}\n onChange={(value) => {\n const next = value === '' ? null : Number(value);\n field.onChange('folder', next);\n }}\n disabled={isSubmitting || disabled}\n >\n <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>\n {folders.map((folder) => (\n <SingleSelectOption key={folder.id} value={String(folder.id)}>\n {folder.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteAssetButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeleteAssetButton = () => {\n const { formatMessage } = useIntl();\n const { deleteAsset, isDeleting } = useAssetOperation();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleConfirm = async () => {\n await deleteAsset();\n setIsOpen(false);\n };\n\n const triggerLabel = formatMessage({\n id: getTranslationKey('asset-details.delete.trigger'),\n defaultMessage: 'Delete this file',\n });\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={setIsOpen}>\n <Dialog.Trigger>\n <IconButton label={triggerLabel} variant=\"danger-light\">\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.delete.title'),\n defaultMessage: 'Delete this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n {formatMessage({\n id: getTranslationKey('asset-details.delete.description'),\n defaultMessage:\n 'This file cannot be recovered once deleted. If it is currently in use, linked content will break and image containers will be empty.',\n })}\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"danger-light\" loading={isDeleting} onClick={handleConfirm} fullWidth>\n {formatMessage({ id: 'app.components.Button.confirm', defaultMessage: 'Confirm' })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CopyLinkButton — write the absolute asset URL to the clipboard.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CopyLinkButtonProps {\n asset: AssetWithPopulatedCreatedBy;\n}\n\nconst CopyLinkButton = ({ asset }: CopyLinkButtonProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const notify = useDrawerNotify();\n\n const handleCopy = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n if (!url) return;\n const didCopy = await copy(url);\n notify({\n type: didCopy ? 'success' : 'danger',\n message: didCopy\n ? formatMessage({\n id: getTranslationKey('asset-details.copy-link.success'),\n defaultMessage: 'Link copied.',\n })\n : formatMessage({\n id: getTranslationKey('asset-details.copy-link.error'),\n defaultMessage: 'Failed to copy the link.',\n }),\n });\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.copy-link.trigger'),\n defaultMessage: 'Copy link',\n })}\n variant=\"tertiary\"\n onClick={handleCopy}\n >\n <Link />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DownloadAssetButton — fetch the file and trigger a browser download.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DownloadAssetButtonProps {\n asset: AssetWithPopulatedCreatedBy;\n}\n\nconst DownloadAssetButton = ({ asset }: DownloadAssetButtonProps) => {\n const { formatMessage } = useIntl();\n const notify = useDrawerNotify();\n const [isDownloading, setIsDownloading] = React.useState(false);\n\n const handleDownload = async () => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n if (!url) return;\n setIsDownloading(true);\n try {\n await downloadFile(url, asset.name);\n } catch {\n notify({\n type: 'danger',\n message: formatMessage({\n id: getTranslationKey('asset-details.download.error'),\n defaultMessage: 'Failed to download the file.',\n }),\n });\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.download.trigger'),\n defaultMessage: 'Download',\n })}\n variant=\"tertiary\"\n onClick={handleDownload}\n disabled={isDownloading}\n >\n <Download />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReplaceAssetButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ReplaceAssetButtonProps {\n /**\n * The asset's mime. Two jobs: the dialog only promises AI metadata when it\n * applies, and the file picker only offers files of the same type.\n */\n mime?: string | null;\n}\n\nconst ReplaceAssetButton = ({ mime }: ReplaceAssetButtonProps) => {\n const { formatMessage } = useIntl();\n const { replaceAsset, isReplacing } = useAssetOperation();\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const [isDialogOpen, setIsDialogOpen] = React.useState(false);\n const aiEnabled = useAIMetadataEnabled({ mime });\n\n const handleTriggerClick = () => {\n setIsDialogOpen(true);\n };\n\n const handleContinue = () => {\n // Confirm first, then open the native picker so the user only commits to\n // replacing after acknowledging the warning. The actual POST is delegated\n // to the parent (which owns the mutation + loading state).\n setIsDialogOpen(false);\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the native input so the same file can be picked again later.\n event.target.value = '';\n if (!file) {\n return;\n }\n await replaceAsset(file);\n };\n\n return (\n <>\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={mime ?? ''}\n multiple={false}\n onChange={handleFileChange}\n aria-hidden\n tabIndex={-1}\n />\n </VisuallyHidden>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.replace.trigger'),\n defaultMessage: 'Replace this file',\n })}\n variant=\"tertiary\"\n onClick={handleTriggerClick}\n disabled={isReplacing}\n >\n <ArrowsCounterClockwise />\n </IconButton>\n <Dialog.Root open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.title'),\n defaultMessage: 'Replace this media file?',\n })}\n </Dialog.Header>\n <Dialog.Body textAlign=\"center\">\n <Flex direction=\"column\" textAlign=\"center\">\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description'),\n defaultMessage: 'Current content will be permanently replaced.',\n })}\n </Typography>\n {aiEnabled ? (\n <Typography variant=\"omega\">\n {formatMessage({\n id: getTranslationKey('asset-details.replace.description.ai'),\n defaultMessage: 'AI will generate new metadata after upload.',\n })}\n </Typography>\n ) : null}\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button variant=\"secondary\" onClick={handleContinue} fullWidth>\n {formatMessage({\n id: getTranslationKey('asset-details.replace.continue'),\n defaultMessage: 'Continue',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetImageActions - image-editing controls overlaid on the preview.\n *\n * Crop only. Replace used to sit here too, directly beneath it, which put a\n * file-level operation among the image-editing controls and read as if replacing\n * were a kind of editing. It now lives in the footer with its peers.\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetImageActionsProps {\n onCrop?: () => void;\n}\n\nconst AssetImageActions = ({ onCrop }: AssetImageActionsProps) => {\n const { formatMessage } = useIntl();\n const isSubmitting = useForm('AssetImageActions', (state) => state.isSubmitting);\n\n return (\n <Flex direction=\"column\" gap={2}>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('asset-details.crop.trigger'),\n defaultMessage: 'Crop',\n })}\n variant=\"tertiary\"\n onClick={onCrop}\n disabled={isSubmitting || !onCrop}\n >\n <Crop />\n </IconButton>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetDetails\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Writes whether the form has unsaved edits into the drawer's ref. Only the\n * drawer's close handlers read it, so a ref rather than state: toggling dirty\n * doesn't re-render the drawer. A component, not a hook, because the form state\n * is only reachable inside <Form>'s render prop.\n */\nconst ReportUnsavedEdits = ({\n target,\n hasUnsavedEdits,\n}: {\n target: React.MutableRefObject<boolean>;\n hasUnsavedEdits: boolean;\n}) => {\n React.useLayoutEffect(() => {\n target.current = hasUnsavedEdits;\n\n return () => {\n target.current = false;\n };\n }, [target, hasUnsavedEdits]);\n\n return null;\n};\n\ninterface AssetDetailsProps {\n asset: AssetWithPopulatedCreatedBy;\n closeDetails: () => void;\n /** Receives whether the form has unsaved edits. */\n hasUnsavedEditsRef?: React.MutableRefObject<boolean>;\n /** Guard unsaved edits with <Blocker>, for a drawer whose closing is a navigation. */\n guardNavigation?: boolean;\n /** After the asset was updated, replaced or cropped in place, with the server's copy. */\n onAssetChange?: (asset: AssetWithPopulatedCreatedBy) => void;\n /** After the asset was deleted from the library. */\n onAssetDelete?: (id: number) => void;\n /** `location` stamped on the tracking events, for analytics to tell hosts apart. */\n trackedLocation?: string;\n}\n\ninterface AssetFormState {\n name: string;\n caption: string;\n alternativeText: string;\n folder: number | null;\n}\n\nexport const AssetDetails = ({\n asset,\n closeDetails,\n hasUnsavedEditsRef,\n guardNavigation = false,\n onAssetChange,\n onAssetDelete,\n trackedLocation = MEDIA_LIBRARY_LOCATION,\n}: AssetDetailsProps) => {\n const { formatMessage, formatDate } = useIntl();\n const getErrorMessage = useApiErrorMessage();\n const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions();\n const { data: folders = [] } = useGetAllFoldersQuery();\n const { toggleNotification } = useNotification();\n const [updateAsset] = useUpdateAssetMutation();\n const { trackUsage } = useTracking();\n const [replaceMutation, { isLoading: isReplacing }] = useReplaceAssetMutation();\n const [deleteMutation, { isLoading: isDeleting }] = useDeleteAssetMutation();\n const [uploadCroppedCopy, { isLoading: isCropCopying }] = useUploadFileSilentlyMutation();\n\n const [isCropOpen, setIsCropOpen] = React.useState(false);\n\n // In-drawer toast slot\n const [drawerToast, setDrawerToast] = React.useState<DrawerToast | null>(null);\n React.useEffect(() => {\n if (!drawerToast) return;\n const timer = window.setTimeout(() => setDrawerToast(null), 5000);\n return () => window.clearTimeout(timer);\n }, [drawerToast]);\n\n // Local alias matching the DrawerNotifyContext signature, so the drawer's\n // own handlers (replace, update) read like the consumers do.\n const notify = React.useCallback<DrawerNotify>((toast) => setDrawerToast(toast), []);\n\n const isImage = asset.mime?.includes(ASSET_TYPES.Image);\n\n // Stable until the asset changes: <Form> resets its values whenever this\n // object does, which on every render would throw away the baseline a save\n // sets and show the pre-save values until the refetch lands.\n const initialValues = React.useMemo<AssetFormState>(\n () => ({\n name: asset.name ?? '',\n caption: asset.caption ?? '',\n alternativeText: asset.alternativeText ?? '',\n folder:\n typeof asset.folder === 'object' && asset.folder !== null\n ? ((asset.folder as { id: number }).id ?? null)\n : ((asset.folder as number | null | undefined) ?? null),\n }),\n [asset.name, asset.caption, asset.alternativeText, asset.folder]\n );\n\n const handleSubmit = async (\n values: AssetFormState,\n { resetForm }: FormHelpers<AssetFormState>\n ) => {\n const fileInfo = {\n name: values.name,\n caption: values.caption,\n alternativeText: values.alternativeText,\n folder: values.folder,\n };\n\n const res = await updateAsset({ id: asset.id, fileInfo });\n\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.update.error'),\n defaultMessage: 'Failed to update the file.',\n })\n ),\n });\n return;\n }\n\n // What was saved is the new baseline. Otherwise the form stays \"modified\"\n // until the refetched asset resets it, and closing in that gap asks about\n // edits that are already saved.\n resetForm(values);\n onAssetChange?.(res.data);\n\n trackUsage('didEditMediaLibraryElements', {\n location: trackedLocation,\n // Legacy sends the mime top-level type (image/video/audio/application…).\n type: asset.mime?.split('/')[0],\n changeLocation: values.folder !== initialValues.folder,\n });\n\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.update.success'),\n defaultMessage: 'File updated',\n }),\n });\n };\n\n const { title: folderName } = useFolderInfo(\n typeof asset.folder === 'object' && asset.folder !== null\n ? ((asset.folder as { id: number }).id ?? null)\n : ((asset.folder as number | null | undefined) ?? null)\n );\n\n // Owns the replace upload so isReplacing can drive the busy overlay.\n const handleReplace = React.useCallback(\n async (file: globalThis.File) => {\n const res = await replaceMutation({ id: asset.id, file, fileInfo: { name: asset.name } });\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.replace.error'),\n defaultMessage: 'Failed to replace the file.',\n })\n ),\n });\n return;\n }\n onAssetChange?.(res.data);\n trackUsage('didReplaceMedia', { location: trackedLocation });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.replace.success'),\n defaultMessage: 'File replaced.',\n }),\n });\n },\n [\n asset.id,\n asset.name,\n formatMessage,\n getErrorMessage,\n notify,\n onAssetChange,\n replaceMutation,\n trackedLocation,\n trackUsage,\n ]\n );\n\n // Owns the delete: on error notify in-drawer (drawer stays), on success fire\n // a persistent global notification then close the drawer.\n const handleDelete = React.useCallback(async () => {\n const res = await deleteMutation(asset.id);\n if ('error' in res) {\n notify({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('asset-details.delete.error'),\n defaultMessage: 'Failed to delete the asset.',\n })\n ),\n });\n return;\n }\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('asset-details.delete.success'),\n defaultMessage: '1 element have been deleted from {folderName}',\n },\n { folderName }\n ),\n });\n onAssetDelete?.(asset.id);\n closeDetails();\n }, [\n asset.id,\n closeDetails,\n deleteMutation,\n folderName,\n formatMessage,\n getErrorMessage,\n notify,\n onAssetDelete,\n toggleNotification,\n ]);\n\n const notifyCropError = (error?: unknown) => {\n notify({\n type: 'danger',\n message: getErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('asset-details.crop.error'),\n defaultMessage: 'Failed to update the file.',\n })\n ),\n });\n };\n\n // Apply: replace the original binary with the cropped file + focal point.\n // Close the editor first so the drawer's busy overlay is visible while the\n // mutation runs (the editor renders in a Portal above the drawer).\n const handleCropApply = async (file: globalThis.File, focalPoint: FocalPoint) => {\n setIsCropOpen(false);\n const res = await replaceMutation({\n id: asset.id,\n file,\n fileInfo: { focalPoint },\n });\n if ('error' in res) {\n notifyCropError(res.error);\n return;\n }\n onAssetChange?.(res.data);\n trackUsage('didCropFile', { location: trackedLocation, duplicatedFile: false });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.crop.success'),\n defaultMessage: 'File updated',\n }),\n });\n };\n\n // Save as copy: upload the cropped file as a new asset in the same folder.\n // The original is untouched, so `onAssetChange` stays silent.\n const handleCropSaveAsCopy = async (file: globalThis.File, focalPoint: FocalPoint) => {\n setIsCropOpen(false);\n // Silent single-file upload (no global progress dialog). Carry over the\n // source asset's caption/alt so the copy keeps its metadata.\n const res = await uploadCroppedCopy({\n file,\n fileInfo: {\n name: asset.name,\n caption: asset.caption ?? '',\n alternativeText: asset.alternativeText ?? '',\n folder: initialValues.folder,\n focalPoint,\n },\n });\n if ('error' in res) {\n notifyCropError(res.error);\n return;\n }\n trackUsage('didCropFile', { location: trackedLocation, duplicatedFile: true });\n notify({\n type: 'success',\n message: formatMessage({\n id: getTranslationKey('asset-details.crop.copy-success'),\n defaultMessage: 'Copy created.',\n }),\n });\n };\n\n const operations = React.useMemo<AssetOperations>(\n () => ({\n replaceAsset: handleReplace,\n deleteAsset: handleDelete,\n isReplacing,\n isDeleting,\n }),\n [handleReplace, handleDelete, isReplacing, isDeleting]\n );\n\n return (\n // `key={asset.id}` resets the form when the drawer switches to a different\n // asset so cached values from the previous asset don't bleed in.\n <DrawerNotifyContext.Provider value={notify}>\n <AssetOperationsContext.Provider value={operations}>\n <FormShell>\n <Form key={asset.id} method=\"POST\" initialValues={initialValues} onSubmit={handleSubmit}>\n {({ modified, isSubmitting, values, resetForm }) => {\n const nameIsEmpty = ((values as AssetFormState).name ?? '').trim() === '';\n const busyMessage = getBusyMessage({ isDeleting, isReplacing, isCropCopying });\n return (\n <>\n {/* With `guardNavigation`, every close path (X button, ESC, route\n change, browser back) is a navigation, so <Blocker> intercepts it\n when the form is dirty. `onProceed` resets the form so the held\n navigation can complete. Lives inside <Form> so it can read the\n form context. Without it, the drawer asks on its own close paths. */}\n {guardNavigation ? (\n <Blocker onProceed={resetForm} />\n ) : hasUnsavedEditsRef ? (\n <ReportUnsavedEdits\n target={hasUnsavedEditsRef}\n hasUnsavedEdits={modified && !isSubmitting}\n />\n ) : null}\n {isCropOpen && isImage ? (\n <AssetCropEditor\n asset={asset}\n onClose={() => setIsCropOpen(false)}\n onApply={handleCropApply}\n onSaveAsCopy={handleCropSaveAsCopy}\n canSaveAsCopy={canCreate}\n />\n ) : null}\n {busyMessage ? <BusyOverlay>{formatMessage(busyMessage)}</BusyOverlay> : null}\n {drawerToast ? (\n <DrawerToastSlot>\n <Alert\n variant={drawerToast.type === 'success' ? 'success' : 'danger'}\n closeLabel={formatMessage({ id: 'global.close', defaultMessage: 'Close' })}\n onClose={() => setDrawerToast(null)}\n >\n {drawerToast.message}\n </Alert>\n </DrawerToastSlot>\n ) : null}\n <Drawer.ScrollableContent>\n <AssetPreview\n asset={asset}\n actions={\n isImage && canUpdate ? (\n <AssetImageActions onCrop={() => setIsCropOpen(true)} />\n ) : null\n }\n />\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={5}\n paddingRight={5}\n >\n <Typography variant=\"beta\" fontWeight=\"semiBold\" tag=\"h3\">\n {formatMessage({\n id: getTranslationKey('asset-details.fileInfo'),\n defaultMessage: 'File info',\n })}\n </Typography>\n <Flex\n wrap=\"wrap\"\n gap={4}\n background=\"neutral100\"\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={6}\n paddingRight={6}\n alignItems=\"flex-start\"\n >\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.creationDate'),\n defaultMessage: 'Creation date',\n })}\n value={\n asset.createdAt\n ? formatDate(new Date(asset.createdAt), {\n dateStyle: 'long',\n timeStyle: 'short',\n })\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.lastUpdated'),\n defaultMessage: 'Last updated',\n })}\n value={\n asset.updatedAt\n ? formatDate(new Date(asset.updatedAt), {\n dateStyle: 'long',\n timeStyle: 'short',\n })\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.createdBy'),\n defaultMessage: 'Created by',\n })}\n value={\n asset.createdBy\n ? (getDisplayName({\n firstname: asset.createdBy.firstname ?? undefined,\n lastname: asset.createdBy.lastname ?? undefined,\n username: asset.createdBy.username ?? undefined,\n email: asset.createdBy.email ?? undefined,\n }) ?? '-')\n : null\n }\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.size'),\n defaultMessage: 'Size',\n })}\n value={asset.size ? formatBytes(asset.size, 1) : null}\n />\n {isImage && (asset.width != null || asset.height != null) && (\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.dimensions'),\n defaultMessage: 'Dimensions',\n })}\n value={\n asset.width != null && asset.height != null\n ? `${asset.width} × ${asset.height}`\n : null\n }\n />\n )}\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.extension'),\n defaultMessage: 'Extension',\n })}\n value={getFileExtension(asset.ext)}\n />\n <DetailItem\n label={formatMessage({\n id: getTranslationKey('asset-details.assetId'),\n defaultMessage: 'Asset ID',\n })}\n value={String(asset.id)}\n />\n </Flex>\n <DetailField\n name=\"name\"\n label={formatMessage({\n id: getTranslationKey('asset-details.fileName'),\n defaultMessage: 'File name',\n })}\n required\n disabled={!canUpdate}\n />\n <LocationField\n label={formatMessage({\n id: getTranslationKey('asset-details.location'),\n defaultMessage: 'Location',\n })}\n rootLabel={formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n })}\n folders={folders}\n disabled={!canUpdate}\n />\n {/* Caption and alternative text apply to every file type\n (matches the legacy Media Library), not images only. */}\n <DetailField\n name=\"caption\"\n label={formatMessage({\n id: getTranslationKey('asset-details.caption'),\n defaultMessage: 'Caption',\n })}\n disabled={!canUpdate}\n />\n <DetailField\n name=\"alternativeText\"\n label={formatMessage({\n id: getTranslationKey('asset-details.alternativeText'),\n defaultMessage: 'Alternative text',\n })}\n disabled={!canUpdate}\n />\n </Flex>\n </Drawer.ScrollableContent>\n {/* Every footer action is permission-gated — when none survive,\n drop the whole bar instead of showing an empty strip. */}\n {(canUpdate || canCopyLink || canDownload) && (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n gap={2}\n padding={3}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px 0 0 0\"\n background=\"neutral0\"\n >\n <Flex gap={2}>\n {canUpdate && <DeleteAssetButton />}\n {canCopyLink && <CopyLinkButton asset={asset} />}\n {canDownload && <DownloadAssetButton asset={asset} />}\n {canUpdate && <ReplaceAssetButton mime={asset.mime} />}\n </Flex>\n {canUpdate && (\n <Button\n type=\"submit\"\n variant=\"default\"\n loading={isSubmitting}\n // File name is required; block submit when it's empty or whitespace so the API can't 400 on a blank value.\n disabled={!modified || isSubmitting || nameIsEmpty}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.save'),\n defaultMessage: 'Save changes',\n })}\n </Button>\n )}\n </Flex>\n )}\n </>\n );\n }}\n </Form>\n </FormShell>\n </AssetOperationsContext.Provider>\n </DrawerNotifyContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerHeader\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The icon's size lives in SVG attributes, which flex is free to override, so a\n * long asset name would squash it. Matches the grid and table rows, where the\n * file-type icon is shrink-proof and the name is what truncates.\n */\nconst HeaderIcon = styled(Flex)`\n flex-shrink: 0;\n`;\n\nconst HeaderTitle = styled(Typography)`\n min-width: 0;\n`;\n\ninterface DrawerHeaderProps {\n asset: AssetWithPopulatedCreatedBy;\n closeDetails: () => void;\n}\n\nconst DrawerHeader = ({ asset, closeDetails }: DrawerHeaderProps) => {\n const DocIcon = asset ? getAssetIcon(asset.mime, asset.ext) : FileError;\n return (\n <Flex\n gap={2}\n paddingLeft={5}\n paddingTop={3}\n paddingBottom={3}\n paddingRight={3}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0 0 1px 0\"\n >\n <HeaderIcon>\n <DocIcon width={20} height={20} />\n </HeaderIcon>\n <Drawer.Title asChild>\n <HeaderTitle variant=\"omega\" fontWeight=\"semiBold\" overflow=\"hidden\" ellipsis tag=\"h2\">\n {asset.name}\n </HeaderTitle>\n </Drawer.Title>\n <Box marginLeft=\"auto\">\n <Drawer.CloseButton onClose={closeDetails}>\n <ArrowLineRight />\n </Drawer.CloseButton>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DrawerContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DrawerContentProps {\n assetId: number;\n /** Closes, asking first when there are unsaved edits. */\n requestClose: () => void;\n /** Closes unconditionally, for when the asset itself is gone. */\n closeDetails: () => void;\n hasUnsavedEditsRef: React.MutableRefObject<boolean>;\n guardNavigation: boolean;\n onAssetChange?: (asset: AssetWithPopulatedCreatedBy) => void;\n onAssetDelete?: (id: number) => void;\n trackedLocation?: string;\n}\n\nconst DrawerContent = ({\n assetId,\n requestClose,\n closeDetails,\n hasUnsavedEditsRef,\n guardNavigation,\n onAssetChange,\n onAssetDelete,\n trackedLocation,\n}: DrawerContentProps) => {\n const { formatMessage } = useIntl();\n const {\n data: asset,\n isLoading,\n error,\n } = useGetAssetQuery(assetId, {\n refetchOnMountOrArgChange: false,\n refetchOnReconnect: false,\n refetchOnFocus: false,\n });\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </Flex>\n );\n }\n\n if (error || !asset) {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4} padding={4}>\n <Alert\n variant=\"danger\"\n closeLabel={formatMessage({ id: 'global.close', defaultMessage: 'Close' })}\n onClose={requestClose}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.error'),\n defaultMessage: 'Failed to load file details.',\n })}\n </Alert>\n </Flex>\n );\n }\n\n return (\n <>\n <DrawerHeader asset={asset} closeDetails={requestClose} />\n <AssetDetails\n asset={asset}\n closeDetails={closeDetails}\n hasUnsavedEditsRef={hasUnsavedEditsRef}\n guardNavigation={guardNavigation}\n onAssetChange={onAssetChange}\n onAssetDelete={onAssetDelete}\n trackedLocation={trackedLocation}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetDetailsDrawer\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Whether a pointer press outside the panel should leave the drawer open.\n *\n * Anywhere on the page behind dismisses it, controls included. Two exceptions,\n * neither of which is \"the user meant to stay\": the part of an asset's card or\n * row whose `click` switches the drawer rather than closing it — not its own\n * checkbox or actions menu, which act on the item; and a panel already closing,\n * which `forceMount` keeps listening through its animation, where dismissing\n * again would re-trigger the unsaved-changes guard for nothing.\n */\nconst shouldKeepDrawerOpen = (\n event: { target: EventTarget | null; detail: { originalEvent: { button: number } } },\n isVisible: boolean\n) => {\n if (!isVisible) {\n return true;\n }\n\n // Radix's dismisser fires on any `pointerdown`, secondary buttons included. A\n // right-click is contextual, and with the create menu on the background one\n // press would otherwise both close this and open that.\n if (event.detail.originalEvent.button !== 0) {\n return true;\n }\n\n if (!(event.target instanceof Element)) {\n return false;\n }\n\n // The card's own controls — its checkbox, its actions menu — act on the item\n // and stop the card's click, so no switch follows and the press dismisses.\n return (\n event.target.closest(ASSET_DETAILS_TRIGGER_SELECTOR) !== null &&\n event.target.closest(ASSET_ITEM_CONTROL_SELECTOR) === null\n );\n};\n\ninterface AssetDetailsDrawerProps {\n /** The asset to show, or `null` to close the drawer. */\n assetId: number | null;\n onClose: () => void;\n /**\n * Guard unsaved edits with <Blocker> instead of the drawer's own confirmation.\n * Only for a drawer whose closing is itself a navigation, which <Blocker> then\n * covers along with route changes and browser history. Not for a host that\n * has its own <Blocker>: react-router allows one per page.\n */\n guardNavigation?: boolean;\n /**\n * After the asset was updated, replaced or cropped in place, with the server's\n * copy, so a host holding the asset (e.g. a form field) can stay in sync.\n */\n onAssetChange?: (asset: AssetWithPopulatedCreatedBy) => void;\n /** After the asset was deleted from the library, just before the drawer closes. */\n onAssetDelete?: (id: number) => void;\n /**\n * `location` stamped on the tracking events, for analytics to tell hosts\n * apart. Defaults to the Media Library page's.\n */\n trackedLocation?: string;\n}\n\nexport const AssetDetailsDrawer = ({\n assetId,\n onClose,\n guardNavigation = false,\n onAssetChange,\n onAssetDelete,\n trackedLocation,\n}: AssetDetailsDrawerProps) => {\n const { formatMessage } = useIntl();\n const { displayAssetId, isVisible, shouldRender, onCloseAnimationEnd } =\n useDrawerPresence(assetId);\n\n const hasUnsavedEditsRef = React.useRef(false);\n const [isConfirmingClose, setIsConfirmingClose] = React.useState(false);\n // Where focus was when the drawer opened — the card or the field's edit\n // button — so closing can hand it back instead of dropping it on <body>.\n const returnFocusRef = React.useRef<HTMLElement | null>(null);\n\n const requestClose = React.useCallback(() => {\n if (hasUnsavedEditsRef.current) {\n setIsConfirmingClose(true);\n return;\n }\n onClose();\n }, [onClose]);\n\n if (!shouldRender || displayAssetId === null) {\n return null;\n }\n\n return (\n <Drawer.Root isVisible={isVisible} onClose={requestClose}>\n {/* Wrapper div required: Dialog.Portal uses asChild and merges ref onto each child.\n VisuallyHidden does not forward refs, so we wrap it in a div that can receive the ref. */}\n <div>\n <VisuallyHidden>\n <Drawer.Title>\n {formatMessage({\n id: getTranslationKey('asset-details.title'),\n defaultMessage: 'File details',\n })}\n </Drawer.Title>\n <Drawer.Description>\n {formatMessage({\n id: getTranslationKey('asset-details.description'),\n defaultMessage: 'Displays file information and metadata',\n })}\n </Drawer.Description>\n </VisuallyHidden>\n </div>\n <Drawer.Body\n animationDirection=\"left\"\n width=\"41.6rem\"\n // dvh, not vh: the drawer is anchored to the bottom, so with 100vh on\n // mobile (where the URL bar shrinks the visual viewport below 100vh)\n // the top of the drawer — header, title, close button — is pushed\n // off-screen. dvh tracks the actual visible height.\n height=\"100dvh\"\n onAnimationEnd={onCloseAnimationEnd}\n // Runs before focus moves in, so this is still the element that opened it.\n onOpenAutoFocus={() => {\n returnFocusRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }}\n // By now the panel is gone: focus is on <body> unless the user moved it\n // somewhere — a press on another control dismissed the drawer — and that\n // choice wins.\n onCloseAutoFocus={(event) => {\n const target = returnFocusRef.current;\n const active = document.activeElement;\n if (target?.isConnected && (active === null || active === document.body)) {\n event.preventDefault();\n target.focus();\n }\n }}\n // Opt in to dismiss-on-outside-click; it goes through `requestClose`,\n // like the header's close button, so unsaved edits are still guarded.\n onPointerDownOutside={(event) => {\n if (shouldKeepDrawerOpen(event, isVisible)) {\n event.preventDefault();\n }\n }}\n >\n <DrawerContent\n assetId={displayAssetId}\n requestClose={requestClose}\n closeDetails={onClose}\n hasUnsavedEditsRef={hasUnsavedEditsRef}\n guardNavigation={guardNavigation}\n onAssetChange={onAssetChange}\n onAssetDelete={onAssetDelete}\n trackedLocation={trackedLocation}\n />\n {/* Rendered from inside the panel so Radix counts presses on it as\n inside, and the drawer stays put while it is open. The edits go\n with the form, which unmounts once the drawer has closed. */}\n <Dialog.Root open={isConfirmingClose} onOpenChange={setIsConfirmingClose}>\n <ConfirmDialog onConfirm={onClose} variant=\"danger\">\n {formatMessage({\n id: getTranslationKey('asset-details.unsaved.confirm'),\n defaultMessage:\n \"You have unsaved changes, are you sure you want to close this file's details? Your changes will be lost.\",\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n\n/**\n * The drawer bound to the URL's `?assetId=`, as the Media Library page uses it:\n * linkable, survives a refresh, and closing is a navigation.\n */\nexport const AssetDetailsDrawerFromUrl = () => {\n const { assetId, closeDetails } = useAssetDetailsParam();\n\n return <AssetDetailsDrawer assetId={assetId} onClose={closeDetails} guardNavigation />;\n};\n"],"names":["DrawerNotifyContext","React","createContext","useDrawerNotify","ctx","useContext","Error","AssetOperationsContext","useAssetOperation","useAssetDetailsParam","query","setQuery","useQueryParams","assetId","parseAssetDetailsId","ASSET_DETAILS_URL_PARAM","openDetails","useCallback","id","withEncodedUserParams","String","closeDetails","undefined","useDrawerPresence","isVisible","isMounted","setIsMounted","useState","displayAssetId","useRef","useEffect","current","onCloseAnimationEnd","event","target","currentTarget","shouldRender","DetailItemContainer","styled","Flex","theme","spaces","DetailItem","label","value","_jsxs","direction","justifyContent","alignItems","gap","_jsx","Typography","variant","textColor","fontWeight","textTransform","FormShell","Box","DrawerToastSlot","getBusyMessage","state","isDeleting","getTranslationKey","defaultMessage","isCropCopying","isReplacing","StyledWarning","WarningCircle","colors","warning500","DetailField","name","required","disabled","formatMessage","useIntl","field","useField","isSubmitting","useForm","fieldValue","setValue","emptyTooltipLabel","Field","Root","Label","TextInput","onChange","endAction","Tooltip","aria-label","role","type","LocationField","rootLabel","folders","SingleSelect","next","Number","SingleSelectOption","map","folder","DeleteAssetButton","deleteAsset","isOpen","setIsOpen","handleConfirm","triggerLabel","Dialog","open","onOpenChange","Trigger","IconButton","Trash","Content","Header","Body","icon","width","height","fill","textAlign","Footer","Cancel","Button","fullWidth","Action","loading","onClick","CopyLinkButton","asset","copy","useClipboard","notify","handleCopy","url","prefixFileUrlWithBackendUrl","didCopy","message","Link","DownloadAssetButton","isDownloading","setIsDownloading","handleDownload","downloadFile","Download","ReplaceAssetButton","mime","replaceAsset","fileInputRef","isDialogOpen","setIsDialogOpen","aiEnabled","useAIMetadataEnabled","handleTriggerClick","handleContinue","click","handleFileChange","file","files","_Fragment","VisuallyHidden","input","ref","accept","multiple","aria-hidden","tabIndex","ArrowsCounterClockwise","AssetImageActions","onCrop","Crop","ReportUnsavedEdits","hasUnsavedEdits","useLayoutEffect","AssetDetails","hasUnsavedEditsRef","guardNavigation","onAssetChange","onAssetDelete","trackedLocation","MEDIA_LIBRARY_LOCATION","formatDate","getErrorMessage","useApiErrorMessage","canCreate","canUpdate","canDownload","canCopyLink","useMediaLibraryPermissions","data","useGetAllFoldersQuery","toggleNotification","useNotification","updateAsset","useUpdateAssetMutation","trackUsage","useTracking","replaceMutation","isLoading","useReplaceAssetMutation","deleteMutation","useDeleteAssetMutation","uploadCroppedCopy","useUploadFileSilentlyMutation","isCropOpen","setIsCropOpen","drawerToast","setDrawerToast","timer","window","setTimeout","clearTimeout","toast","isImage","includes","ASSET_TYPES","Image","initialValues","useMemo","caption","alternativeText","handleSubmit","values","resetForm","fileInfo","res","error","location","split","changeLocation","title","folderName","useFolderInfo","handleReplace","handleDelete","notifyCropError","handleCropApply","focalPoint","duplicatedFile","handleCropSaveAsCopy","operations","Provider","Form","method","onSubmit","modified","nameIsEmpty","trim","busyMessage","Blocker","onProceed","AssetCropEditor","onClose","onApply","onSaveAsCopy","canSaveAsCopy","BusyOverlay","Alert","closeLabel","Drawer","ScrollableContent","AssetPreview","actions","paddingTop","paddingBottom","paddingLeft","paddingRight","tag","wrap","background","createdAt","Date","dateStyle","timeStyle","updatedAt","createdBy","getDisplayName","firstname","lastname","username","email","size","formatBytes","getFileExtension","ext","padding","borderColor","borderStyle","borderWidth","HeaderIcon","HeaderTitle","DrawerHeader","DocIcon","getAssetIcon","FileError","Title","asChild","overflow","ellipsis","marginLeft","CloseButton","ArrowLineRight","DrawerContent","requestClose","useGetAssetQuery","refetchOnMountOrArgChange","refetchOnReconnect","refetchOnFocus","Loader","shouldKeepDrawerOpen","detail","originalEvent","button","Element","closest","ASSET_DETAILS_TRIGGER_SELECTOR","ASSET_ITEM_CONTROL_SELECTOR","AssetDetailsDrawer","isConfirmingClose","setIsConfirmingClose","returnFocusRef","div","Description","animationDirection","onAnimationEnd","onOpenAutoFocus","document","activeElement","HTMLElement","onCloseAutoFocus","active","isConnected","body","preventDefault","focus","onPointerDownOutside","ConfirmDialog","onConfirm","AssetDetailsDrawerFromUrl"],"mappings":"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"}