@strapi/upload 5.52.1 → 5.52.3

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 (326) hide show
  1. package/dist/admin/components/AssetCard/AssetCard.js +1 -0
  2. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  3. package/dist/admin/components/AssetCard/AssetCard.mjs +1 -0
  4. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  5. package/dist/admin/components/AssetCard/AssetCardBase.js +1 -0
  6. package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -0
  8. package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -0
  10. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  11. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -0
  12. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/AssetCard/UploadingAssetCard.js +1 -0
  14. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  15. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +1 -0
  16. package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
  17. package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -0
  18. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  19. package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -0
  20. package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
  21. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -0
  22. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  23. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -0
  24. package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  25. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -0
  26. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  27. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -0
  28. package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  29. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -0
  30. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  31. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -0
  32. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
  33. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -0
  34. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
  35. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -0
  36. package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
  37. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -0
  38. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  39. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -0
  40. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  41. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -0
  42. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  43. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -0
  44. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  45. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +1 -0
  46. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  47. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +1 -0
  48. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  49. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -0
  50. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
  51. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -0
  52. package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
  53. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +1 -0
  54. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
  55. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +1 -0
  56. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
  57. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -0
  58. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  59. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -0
  60. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  61. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -0
  62. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  63. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -0
  64. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
  65. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -0
  66. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
  67. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -0
  68. package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
  69. package/dist/admin/components/FilterList/FilterList.js +2 -2
  70. package/dist/admin/components/FilterList/FilterList.js.map +1 -1
  71. package/dist/admin/components/FilterList/FilterList.mjs +2 -2
  72. package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
  73. package/dist/admin/components/FilterPopover/FilterPopover.js +4 -4
  74. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  75. package/dist/admin/components/FilterPopover/FilterPopover.mjs +4 -4
  76. package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
  77. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +1 -0
  78. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  79. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +1 -0
  80. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  81. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -0
  82. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
  83. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -0
  84. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
  85. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +4 -10
  86. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  87. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +4 -10
  88. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
  89. package/dist/admin/components/SortPicker/SortPicker.js +1 -0
  90. package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
  91. package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
  92. package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
  93. package/dist/admin/components/TableList/CellContent.js +1 -0
  94. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  95. package/dist/admin/components/TableList/CellContent.mjs +1 -0
  96. package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
  97. package/dist/admin/components/TableList/PreviewCell.js +1 -0
  98. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  99. package/dist/admin/components/TableList/PreviewCell.mjs +1 -0
  100. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  101. package/dist/admin/components/TableList/TableList.js +1 -0
  102. package/dist/admin/components/TableList/TableList.js.map +1 -1
  103. package/dist/admin/components/TableList/TableList.mjs +1 -0
  104. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  105. package/dist/admin/components/TableList/TableRows.js +1 -0
  106. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  107. package/dist/admin/components/TableList/TableRows.mjs +1 -0
  108. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  109. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -0
  110. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
  111. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -0
  112. package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
  113. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +9 -21
  114. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  115. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +9 -21
  116. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
  117. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -0
  118. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  119. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -0
  120. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  121. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -0
  122. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  123. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -0
  124. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
  125. package/dist/admin/constants.js +1 -0
  126. package/dist/admin/constants.js.map +1 -1
  127. package/dist/admin/constants.mjs +1 -0
  128. package/dist/admin/constants.mjs.map +1 -1
  129. package/dist/admin/future/components/Drawer.js +11 -0
  130. package/dist/admin/future/components/Drawer.js.map +1 -1
  131. package/dist/admin/future/components/Drawer.mjs +11 -0
  132. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  133. package/dist/admin/future/components/UploadProgressDialog.js +82 -13
  134. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  135. package/dist/admin/future/components/UploadProgressDialog.mjs +84 -15
  136. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  137. package/dist/admin/future/hooks/useApiErrorMessage.js +61 -0
  138. package/dist/admin/future/hooks/useApiErrorMessage.js.map +1 -0
  139. package/dist/admin/future/hooks/useApiErrorMessage.mjs +39 -0
  140. package/dist/admin/future/hooks/useApiErrorMessage.mjs.map +1 -0
  141. package/dist/admin/future/pages/Assets/AssetsPage.js +11 -0
  142. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  143. package/dist/admin/future/pages/Assets/AssetsPage.mjs +11 -0
  144. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  145. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +8 -6
  146. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  147. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +8 -6
  148. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  149. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +70 -59
  150. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  151. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +72 -61
  152. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  153. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +7 -5
  154. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  155. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +7 -5
  156. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  157. package/dist/admin/future/pages/Assets/components/AssetsTable.js +47 -28
  158. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  159. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +48 -29
  160. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  161. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +87 -2
  162. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  163. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +89 -4
  164. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  165. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +3 -2
  166. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  167. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +3 -2
  168. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  169. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +4 -2
  170. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  171. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +4 -2
  172. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  173. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +21 -3
  174. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  175. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +21 -3
  176. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  177. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +4 -3
  178. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  179. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +5 -4
  180. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  181. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -2
  182. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  183. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -2
  184. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  185. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js +30 -0
  186. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -0
  187. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +26 -0
  188. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -0
  189. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +5 -5
  190. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -1
  191. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +6 -6
  192. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  193. package/dist/admin/future/pages/Assets/hooks/useListSort.js +10 -10
  194. package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -1
  195. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +11 -11
  196. package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -1
  197. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js +86 -0
  198. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js.map +1 -0
  199. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs +83 -0
  200. package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs.map +1 -0
  201. package/dist/admin/future/pages/Assets/utils/renderedKeys.js +19 -0
  202. package/dist/admin/future/pages/Assets/utils/renderedKeys.js.map +1 -0
  203. package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs +17 -0
  204. package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs.map +1 -0
  205. package/dist/admin/future/services/api.js +131 -13
  206. package/dist/admin/future/services/api.js.map +1 -1
  207. package/dist/admin/future/services/api.mjs +133 -15
  208. package/dist/admin/future/services/api.mjs.map +1 -1
  209. package/dist/admin/future/services/uploadFileViaXHR.js +9 -3
  210. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
  211. package/dist/admin/future/services/uploadFileViaXHR.mjs +9 -3
  212. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
  213. package/dist/admin/future/store/uploadProgress.js +98 -6
  214. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  215. package/dist/admin/future/store/uploadProgress.mjs +94 -7
  216. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  217. package/dist/admin/future/utils/getApiErrorMessage.js +20 -0
  218. package/dist/admin/future/utils/getApiErrorMessage.js.map +1 -0
  219. package/dist/admin/future/utils/getApiErrorMessage.mjs +18 -0
  220. package/dist/admin/future/utils/getApiErrorMessage.mjs.map +1 -0
  221. package/dist/admin/index.js +1 -0
  222. package/dist/admin/index.js.map +1 -1
  223. package/dist/admin/index.mjs +1 -0
  224. package/dist/admin/index.mjs.map +1 -1
  225. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
  226. package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
  227. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
  228. package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
  229. package/dist/admin/pages/App/MediaLibrary.js +7 -9
  230. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  231. package/dist/admin/pages/App/MediaLibrary.mjs +8 -10
  232. package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
  233. package/dist/admin/pages/App/components/BulkActions.js +1 -0
  234. package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
  235. package/dist/admin/pages/App/components/BulkActions.mjs +1 -0
  236. package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
  237. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js +1 -0
  238. package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
  239. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs +1 -0
  240. package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
  241. package/dist/admin/pages/App/components/Filters.js +8 -8
  242. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  243. package/dist/admin/pages/App/components/Filters.mjs +9 -9
  244. package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
  245. package/dist/admin/pages/App/components/Header.js +1 -1
  246. package/dist/admin/pages/App/components/Header.js.map +1 -1
  247. package/dist/admin/pages/App/components/Header.mjs +2 -2
  248. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  249. package/dist/admin/src/future/hooks/useApiErrorMessage.d.ts +17 -0
  250. package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +4 -1
  251. package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +4 -1
  252. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
  253. package/dist/admin/src/future/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +18 -0
  254. package/dist/admin/src/future/pages/Assets/utils/mergeUploadedAssets.d.ts +35 -0
  255. package/dist/admin/src/future/pages/Assets/utils/renderedKeys.d.ts +19 -0
  256. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +6 -1
  257. package/dist/admin/src/future/store/uploadProgress.d.ts +67 -1
  258. package/dist/admin/src/future/utils/getApiErrorMessage.d.ts +1 -0
  259. package/dist/admin/src/utils/index.d.ts +1 -0
  260. package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
  261. package/dist/admin/src/utils/resolveFileMime.d.ts +13 -0
  262. package/dist/admin/translations/ca.json.js +1 -1
  263. package/dist/admin/translations/ca.json.mjs +1 -1
  264. package/dist/admin/translations/de.json.js +1 -1
  265. package/dist/admin/translations/de.json.mjs +1 -1
  266. package/dist/admin/translations/en.json.js +6 -2
  267. package/dist/admin/translations/en.json.js.map +1 -1
  268. package/dist/admin/translations/en.json.mjs +6 -2
  269. package/dist/admin/translations/en.json.mjs.map +1 -1
  270. package/dist/admin/translations/es.json.js +1 -1
  271. package/dist/admin/translations/es.json.mjs +1 -1
  272. package/dist/admin/translations/fr.json.js +1 -1
  273. package/dist/admin/translations/fr.json.mjs +1 -1
  274. package/dist/admin/translations/ja.json.js +1 -1
  275. package/dist/admin/translations/ja.json.mjs +1 -1
  276. package/dist/admin/translations/ko.json.js +1 -1
  277. package/dist/admin/translations/ko.json.mjs +1 -1
  278. package/dist/admin/translations/nl.json.js +1 -1
  279. package/dist/admin/translations/nl.json.mjs +1 -1
  280. package/dist/admin/translations/pl.json.js +1 -1
  281. package/dist/admin/translations/pl.json.mjs +1 -1
  282. package/dist/admin/translations/pt-BR.json.js +1 -1
  283. package/dist/admin/translations/pt-BR.json.mjs +1 -1
  284. package/dist/admin/translations/ru.json.js +1 -1
  285. package/dist/admin/translations/ru.json.mjs +1 -1
  286. package/dist/admin/translations/sk.json.js +1 -1
  287. package/dist/admin/translations/sk.json.mjs +1 -1
  288. package/dist/admin/translations/tr.json.js +1 -1
  289. package/dist/admin/translations/tr.json.mjs +1 -1
  290. package/dist/admin/translations/uk.json.js +1 -1
  291. package/dist/admin/translations/uk.json.mjs +1 -1
  292. package/dist/admin/translations/zh-Hans.json.js +1 -1
  293. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  294. package/dist/admin/translations/zh.json.js +1 -1
  295. package/dist/admin/translations/zh.json.mjs +1 -1
  296. package/dist/admin/utils/getFolderURL.js +2 -1
  297. package/dist/admin/utils/getFolderURL.js.map +1 -1
  298. package/dist/admin/utils/getFolderURL.mjs +2 -1
  299. package/dist/admin/utils/getFolderURL.mjs.map +1 -1
  300. package/dist/admin/utils/rawFileToAsset.js +5 -3
  301. package/dist/admin/utils/rawFileToAsset.js.map +1 -1
  302. package/dist/admin/utils/rawFileToAsset.mjs +5 -3
  303. package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
  304. package/dist/admin/utils/resolveFileMime.js +69 -0
  305. package/dist/admin/utils/resolveFileMime.js.map +1 -0
  306. package/dist/admin/utils/resolveFileMime.mjs +64 -0
  307. package/dist/admin/utils/resolveFileMime.mjs.map +1 -0
  308. package/dist/admin/utils/urlsToAssets.js +8 -4
  309. package/dist/admin/utils/urlsToAssets.js.map +1 -1
  310. package/dist/admin/utils/urlsToAssets.mjs +8 -4
  311. package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
  312. package/dist/server/services/ai-metadata.js +25 -5
  313. package/dist/server/services/ai-metadata.js.map +1 -1
  314. package/dist/server/services/ai-metadata.mjs +1 -1
  315. package/dist/server/services/ai-metadata.mjs.map +1 -1
  316. package/dist/server/services/upload.js +4 -0
  317. package/dist/server/services/upload.js.map +1 -1
  318. package/dist/server/services/upload.mjs +4 -0
  319. package/dist/server/services/upload.mjs.map +1 -1
  320. package/dist/server/src/services/upload.d.ts.map +1 -1
  321. package/package.json +7 -7
  322. package/dist/admin/future/utils/getBulkMoveErrorMessage.js +0 -23
  323. package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +0 -1
  324. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +0 -21
  325. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +0 -1
  326. package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +0 -1
@@ -1,14 +1,15 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import 'react';
3
3
  import { Flex, IconButton, TextButton, Typography } from '@strapi/design-system';
4
- import { ChevronDown, ArrowsCounterClockwise, CrossCircle, MinusCircle, Cross, Check, Upload, WarningCircle, Information, CheckCircle, Sparkle } from '@strapi/icons';
4
+ import { ChevronDown, Clock, ArrowsCounterClockwise, CrossCircle, MinusCircle, Cross, Check, Upload, WarningCircle, Information, CheckCircle, Sparkle } from '@strapi/icons';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { styled, keyframes } from 'styled-components';
7
7
  import { useRetryCancelledFilesMutation, abortUpload } from '../services/api.mjs';
8
8
  import { useTypedDispatch, useTypedSelector } from '../store/hooks.mjs';
9
- import { closeUploadProgress, selectAggregateProgress, selectMetadataProgress, selectIsGeneratingMetadata, selectMetadataOutcome, cancelUpload, toggleMinimize } from '../store/uploadProgress.mjs';
9
+ import { closeUploadProgress, selectAggregateProgress, selectReportsByteProgress, selectCountBasedProgress, selectMetadataProgress, selectIsGeneratingMetadata, selectMetadataOutcome, cancelUpload, toggleMinimize } from '../store/uploadProgress.mjs';
10
10
  import { getTranslationKey } from '../utils/translations.mjs';
11
11
  import { Drawer } from './Drawer.mjs';
12
+ import { TruncatedText } from './TruncatedText.mjs';
12
13
 
13
14
  /* -------------------------------------------------------------------------------------------------
14
15
  * DialogHeader
@@ -17,6 +18,9 @@ import { Drawer } from './Drawer.mjs';
17
18
  direction: "column",
18
19
  alignItems: "flex-start",
19
20
  paddingLeft: 2,
21
+ paddingRight: 2,
22
+ paddingTop: 1,
23
+ paddingBottom: 1,
20
24
  children: [
21
25
  /*#__PURE__*/ jsx(Drawer.Title, {
22
26
  children: /*#__PURE__*/ jsx(Typography, {
@@ -40,6 +44,7 @@ import { Drawer } from './Drawer.mjs';
40
44
  });
41
45
  };
42
46
  const HeaderStatusIcon = styled(Flex)`
47
+ align-self: stretch;
43
48
  padding: ${({ theme })=>theme.spaces[3]};
44
49
  border-radius: ${({ theme })=>`${theme.borderRadius} 0 0 ${theme.borderRadius}`};
45
50
 
@@ -175,7 +180,19 @@ const HeaderStatus = ({ status, progress, totalFiles, successfulCount, errorCoun
175
180
  });
176
181
  }
177
182
  if (status === 'uploading') {
178
- const progressPercentage = progress ? Math.round(progress) : 0;
183
+ // Two separate strings so a locale can position (or omit) the percentage itself.
184
+ const title = progress === null ? formatMessage({
185
+ id: getTranslationKey('upload.progress.uploading.indeterminate'),
186
+ defaultMessage: 'Uploading {total, plural, one {# item} other {# items}}'
187
+ }, {
188
+ total: totalFiles
189
+ }) : formatMessage({
190
+ id: getTranslationKey('upload.progress.uploading.withCount'),
191
+ defaultMessage: 'Uploading {total, plural, one {# item} other {# items}} ({percentage}%)'
192
+ }, {
193
+ total: totalFiles,
194
+ percentage: Math.round(progress)
195
+ });
179
196
  return /*#__PURE__*/ jsxs(HeaderStatusWrapper, {
180
197
  children: [
181
198
  /*#__PURE__*/ jsx(HeaderStatusIcon, {
@@ -185,13 +202,7 @@ const HeaderStatus = ({ status, progress, totalFiles, successfulCount, errorCoun
185
202
  })
186
203
  }),
187
204
  /*#__PURE__*/ jsx(HeaderStatusMessage, {
188
- title: formatMessage({
189
- id: getTranslationKey('upload.progress.uploading.withCount'),
190
- defaultMessage: 'Uploading {total} items ({percentage}%)'
191
- }, {
192
- total: totalFiles,
193
- percentage: progressPercentage
194
- }),
205
+ title: title,
195
206
  metadataSubtitle: metadataSubtitle
196
207
  })
197
208
  ]
@@ -226,7 +237,12 @@ const HEADER_COLOR_MAP = {
226
237
  const DialogHeader = ({ handleClose })=>{
227
238
  const { formatMessage } = useIntl();
228
239
  const { isMinimized, files, uploadId, totalFiles } = useTypedSelector((state)=>state.uploadProgress);
229
- const progress = useTypedSelector(selectAggregateProgress);
240
+ const aggregateProgress = useTypedSelector(selectAggregateProgress);
241
+ const reportsByteProgress = useTypedSelector(selectReportsByteProgress);
242
+ const countBasedProgress = useTypedSelector(selectCountBasedProgress);
243
+ // Byte-weighted when the flow streams bytes (direct-file), else count-based (settled/total).
244
+ // Both return `null` for an indeterminate header when there's nothing to show yet.
245
+ const progress = reportsByteProgress ? aggregateProgress : countBasedProgress;
230
246
  const metadataProgress = useTypedSelector(selectMetadataProgress);
231
247
  const isGeneratingMetadata = useTypedSelector(selectIsGeneratingMetadata);
232
248
  const metadataOutcome = useTypedSelector(selectMetadataOutcome);
@@ -395,6 +411,25 @@ const IndeterminateIndicator = styled.div`
395
411
  children: /*#__PURE__*/ jsx(IndeterminateIndicator, {})
396
412
  });
397
413
  };
414
+ /**
415
+ * Without a floor of zero the row is as wide as its longest filename, which
416
+ * pushes past the panel and gives the dialog a second, horizontal scrollbar
417
+ * instead of truncating.
418
+ *
419
+ * The floor belongs to the name alone: the icon carries its size in SVG
420
+ * attributes, which flex is free to override, so letting it shrink squashes it
421
+ * against a long name instead of truncating the name.
422
+ */ const FileRowName = styled(Flex)`
423
+ min-width: 0;
424
+
425
+ > :first-child {
426
+ flex-shrink: 0;
427
+ }
428
+
429
+ > :last-child {
430
+ min-width: 0;
431
+ }
432
+ `;
398
433
  const FileRow = ({ icon, fileName, children })=>{
399
434
  return /*#__PURE__*/ jsxs(Flex, {
400
435
  direction: "column",
@@ -403,14 +438,13 @@ const FileRow = ({ icon, fileName, children })=>{
403
438
  gap: 1,
404
439
  width: "100%",
405
440
  children: [
406
- /*#__PURE__*/ jsxs(Flex, {
441
+ /*#__PURE__*/ jsxs(FileRowName, {
407
442
  gap: 2,
408
443
  children: [
409
444
  icon,
410
- /*#__PURE__*/ jsx(Typography, {
445
+ /*#__PURE__*/ jsx(TruncatedText, {
411
446
  variant: "omega",
412
447
  fontWeight: "semiBold",
413
- ellipsis: true,
414
448
  children: fileName
415
449
  })
416
450
  ]
@@ -481,6 +515,25 @@ const FileRowRenderer = ({ file })=>{
481
515
  const isCurrentFile = file.status === 'uploading';
482
516
  const isCompleted = file.status === 'complete';
483
517
  const isCancelled = file.status === 'cancelled';
518
+ const isQueued = file.status === 'pending';
519
+ if (isQueued) {
520
+ // No bar: there is nothing to report yet, and an indeterminate bar would read
521
+ // as "in progress" on a file the pool has not picked up.
522
+ return /*#__PURE__*/ jsx(FileRow, {
523
+ icon: /*#__PURE__*/ jsx(Clock, {
524
+ fill: "neutral600"
525
+ }),
526
+ fileName: file.name,
527
+ children: /*#__PURE__*/ jsx(Typography, {
528
+ variant: "pi",
529
+ textColor: "neutral600",
530
+ children: formatMessage({
531
+ id: getTranslationKey('upload.progress.file.queued'),
532
+ defaultMessage: 'Queued'
533
+ })
534
+ })
535
+ });
536
+ }
484
537
  if (isCurrentFile) {
485
538
  // Determinate only once bytes are actually being reported — a known `size` is not
486
539
  // enough. The two upload flows differ here:
@@ -521,7 +574,17 @@ const FileRowRenderer = ({ file })=>{
521
574
  children: /*#__PURE__*/ jsx(Typography, {
522
575
  variant: "pi",
523
576
  textColor: "neutral600",
524
- children: file.error
577
+ children: file.error ? /**
578
+ * The server may return a machine-readable code (e.g. `FileTooBig` from the
579
+ * body middleware) or an already human-readable sentence (e.g. the upload
580
+ * plugin's size-limit message). Translate the former, fall back to the latter.
581
+ */ formatMessage({
582
+ id: getTranslationKey(`apiError.${file.error}`),
583
+ defaultMessage: file.error
584
+ }) : formatMessage({
585
+ id: getTranslationKey('upload.generic-error'),
586
+ defaultMessage: 'An error occurred while uploading the file.'
587
+ })
525
588
  })
526
589
  });
527
590
  }
@@ -572,6 +635,9 @@ const UploadProgressDialog = ()=>{
572
635
  // in-flight row, not just the first (a `find` here dated to the strictly
573
636
  // sequential era and hid all but the lowest-index worker's row).
574
637
  const uploadingFiles = files.filter((f)=>f.status === 'uploading');
638
+ // Everything the pool has not reached yet. Listed in queue order, which is the
639
+ // order `files` is already in, so a row's position tells the user where it sits.
640
+ const queuedFiles = files.filter((f)=>f.status === 'pending');
575
641
  const completedFiles = files.filter((f)=>f.status === 'complete' || f.status === 'error' || f.status === 'cancelled').sort((a, b)=>{
576
642
  // Sort priority: error > cancelled > complete
577
643
  const priority = {
@@ -611,6 +677,9 @@ const UploadProgressDialog = ()=>{
611
677
  uploadingFiles.map((file)=>/*#__PURE__*/ jsx(FileRowRenderer, {
612
678
  file: file
613
679
  }, file.index)),
680
+ queuedFiles.map((file)=>/*#__PURE__*/ jsx(FileRowRenderer, {
681
+ file: file
682
+ }, file.index)),
614
683
  completedFiles.length > 0 && /*#__PURE__*/ jsx(CompletedFilesList, {
615
684
  children: completedFiles.map((file)=>/*#__PURE__*/ jsx(FileRowRenderer, {
616
685
  file: file
@@ -1 +1 @@
1
- {"version":3,"file":"UploadProgressDialog.mjs","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex, IconButton, TextButton, Typography } from '@strapi/design-system';\nimport {\n ArrowsCounterClockwise,\n Check,\n CheckCircle,\n ChevronDown,\n Cross,\n CrossCircle,\n Information,\n MinusCircle,\n Sparkle,\n Upload,\n WarningCircle,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { keyframes, styled } from 'styled-components';\n\nimport { abortUpload, useRetryCancelledFilesMutation } from '../services/api';\nimport { useTypedDispatch, useTypedSelector } from '../store/hooks';\nimport {\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n selectAggregateProgress,\n selectMetadataProgress,\n selectIsGeneratingMetadata,\n selectMetadataOutcome,\n} from '../store/uploadProgress';\nimport { getTranslationKey } from '../utils/translations';\n\nimport { Drawer } from './Drawer';\n\nimport type { FileMetadataStatus, FileProgress, FileProgressStatus } from '../store/uploadProgress';\nimport type { MessageDescriptor } from 'react-intl';\n\n/* -------------------------------------------------------------------------------------------------\n * DialogHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderStatusMessage = ({\n title,\n subtitle,\n metadataSubtitle,\n}: {\n title: string;\n subtitle?: string;\n metadataSubtitle?: string;\n}) => {\n return (\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingLeft={2}>\n <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.Description>\n {metadataSubtitle && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {metadataSubtitle}\n </Typography>\n )}\n </Flex>\n );\n};\n\nconst HeaderStatusIcon = styled(Flex)`\n padding: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => `${theme.borderRadius} 0 0 ${theme.borderRadius}`};\n\n > svg {\n height: 24px;\n width: 24px;\n }\n`;\n\nconst HeaderStatusWrapper = styled(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n progress?: number;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n /**\n * Count-based metadata progress, or `null` when no row entered the metadata phase.\n * Shown as an extra subtitle while generation is still in flight.\n */\n metadataProgress: number | null;\n /** Whether any row is still generating — drives whether the subtitle shows at all. */\n isGeneratingMetadata: boolean;\n /**\n * Terminal per-outcome counts, or `null` while the phase is unfinished or was never\n * entered. Replaces the in-flight subtitle once generation settles.\n */\n metadataOutcome: { generated: number; skipped: number; failed: number } | null;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n metadataProgress,\n isGeneratingMetadata,\n metadataOutcome,\n}: HeaderStatusProps) => {\n const { formatMessage } = useIntl();\n\n // Completion is upload-driven, so the terminal header can appear while metadata is\n // still generating — the subtitle keeps ticking underneath until it settles.\n //\n // Gated on work actually being in flight rather than on `progress < 100`: in a\n // sequential batch the percentage touches 100% between files, which would blink the\n // subtitle out and back in on every upload.\n //\n // Once the phase settles the line is not dropped but replaced with the outcome, so the\n // header keeps confirming what happened instead of silently losing the message.\n const metadataSubtitle = (() => {\n if (metadataProgress !== null && isGeneratingMetadata) {\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.generatingMetadata.withCount'),\n defaultMessage: 'Generating metadata with AI ({percentage}%)',\n },\n { percentage: metadataProgress }\n );\n }\n\n if (metadataOutcome === null) {\n return undefined;\n }\n\n // Only `generated` rows had metadata written, so only they can be reported as a\n // success. With none, there is nothing to confirm — an all-skipped batch of\n // non-images would otherwise read as \"generated on 0 files\". Per-row sublines\n // already spell out skipped and failed outcomes.\n if (metadataOutcome.generated === 0) {\n return undefined;\n }\n\n if (metadataOutcome.failed > 0) {\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.metadataGenerated.withFailures'),\n defaultMessage: '{generatedCount} generated, {failedCount} failed',\n },\n { generatedCount: metadataOutcome.generated, failedCount: metadataOutcome.failed }\n );\n }\n\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.metadataGenerated.withCount'),\n defaultMessage:\n '{count, plural, one {Metadata successfully generated on # file} other {Metadata successfully generated on # files}}',\n },\n { count: metadataOutcome.generated }\n );\n })();\n\n if (status === 'error') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"danger200\">\n <Cross fill=\"danger700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.failed'),\n defaultMessage: 'Upload failed',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.failed.subtitle'),\n defaultMessage: 'Please try to upload files again',\n })}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'success') {\n const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"success200\">\n <Check fill=\"success700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.success'),\n defaultMessage: 'Upload successful!',\n })}\n subtitle={subtitle}\n metadataSubtitle={metadataSubtitle}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'canceled') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"neutral200\">\n <MinusCircle fill=\"neutral700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.canceled'),\n defaultMessage: 'Upload canceled',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.canceled.subtitle'),\n defaultMessage: 'Some files were not uploaded',\n })}\n metadataSubtitle={metadataSubtitle}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'uploading') {\n const progressPercentage = progress ? Math.round(progress) : 0;\n\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"primary200\">\n <Upload fill=\"primary700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage(\n {\n id: getTranslationKey('upload.progress.uploading.withCount'),\n defaultMessage: 'Uploading {total} items ({percentage}%)',\n },\n {\n total: totalFiles,\n percentage: progressPercentage,\n }\n )}\n metadataSubtitle={metadataSubtitle}\n />\n </HeaderStatusWrapper>\n );\n }\n\n return null;\n};\n\nconst HeaderIconButton = styled(IconButton)`\n &:hover {\n background: transparent;\n }\n`;\n\nconst ChevronWrapper = styled.span<{ $isMinimized: boolean }>`\n display: flex;\n transition: transform 0.5s ease-in-out;\n transform: ${({ $isMinimized }) => ($isMinimized ? 'rotate(180deg)' : 'rotate(0deg)')};\n`;\n\nconst HEADER_COLOR_MAP = {\n uploading: { background: 'primary100' },\n canceled: { background: 'neutral100' },\n success: { background: 'success100' },\n error: { background: 'danger100' },\n} as const;\n\nconst DialogHeader = ({ handleClose }: { handleClose: () => void }) => {\n const { formatMessage } = useIntl();\n\n const { isMinimized, files, uploadId, totalFiles } = useTypedSelector(\n (state) => state.uploadProgress\n );\n const progress = useTypedSelector(selectAggregateProgress);\n const metadataProgress = useTypedSelector(selectMetadataProgress);\n const isGeneratingMetadata = useTypedSelector(selectIsGeneratingMetadata);\n const metadataOutcome = useTypedSelector(selectMetadataOutcome);\n const dispatch = useTypedDispatch();\n const [retryCancelledFiles] = useRetryCancelledFilesMutation();\n\n // The batch is complete once every file has reached a terminal state. Byte-weighted\n // progress can't be used here because errored/cancelled rows never reach 100%.\n const isComplete =\n files.length > 0 &&\n files.every((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');\n const isAllUploaded = isComplete;\n const isAllErrored = isComplete && files.every((f) => f.status === 'error');\n const hasCancelledFiles = files.some((f) => f.status === 'cancelled');\n const successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && successfulCount > 0 && !hasCancelledFiles;\n const status = ((): HeaderStatusProps['status'] => {\n if (isAllErrored) return 'error';\n if (isSuccess) return 'success';\n if (hasCancelledFiles) return 'canceled';\n\n return 'uploading';\n })();\n\n const handleCancel = () => {\n abortUpload(uploadId);\n dispatch(cancelUpload());\n };\n\n const handleRetry = async () => {\n try {\n await retryCancelledFiles().unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleToggleMinimize = () => {\n dispatch(toggleMinimize());\n };\n\n return (\n <Flex\n background={HEADER_COLOR_MAP[status].background}\n justifyContent=\"space-between\"\n margin={1}\n hasRadius\n >\n <HeaderStatus\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n metadataProgress={metadataProgress}\n isGeneratingMetadata={isGeneratingMetadata}\n metadataOutcome={metadataOutcome}\n />\n <Flex gap={1}>\n {!isAllUploaded && (\n <TextButton onClick={handleCancel} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.cancel'),\n defaultMessage: 'Cancel all',\n })}\n </TextButton>\n )}\n {hasCancelledFiles && (\n <TextButton onClick={handleRetry} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.retry'),\n defaultMessage: 'Retry',\n })}\n </TextButton>\n )}\n <HeaderIconButton\n onClick={handleToggleMinimize}\n label={formatMessage({\n id: getTranslationKey(\n isMinimized ? 'upload.progress.maximize' : 'upload.progress.minimize'\n ),\n defaultMessage: isMinimized ? 'Maximize' : 'Minimize',\n })}\n variant=\"ghost\"\n >\n <ChevronWrapper $isMinimized={isMinimized}>\n <ChevronDown />\n </ChevronWrapper>\n </HeaderIconButton>\n {isComplete && (\n <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadProgressDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProgressTrack = styled.div`\n width: 100%;\n height: ${({ theme }) => theme.spaces[1]};\n background-color: ${({ theme }) => theme.colors.neutral200};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst ProgressIndicator = styled.div<{ $percent: number }>`\n height: 100%;\n width: ${({ $percent }) => $percent}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n transition: width 0.15s linear;\n`;\n\nconst DeterminateBar = ({ percent }: { percent: number }) => {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={clamped}>\n <ProgressIndicator $percent={clamped} />\n </ProgressTrack>\n );\n};\n\nconst INDETERMINATE_INDICATOR_WIDTH = 40;\n\n/**\n * `translateX` percentages resolve against the *indicator's* own width, not the track's.\n * So -100% is exactly \"fully off the left edge\" regardless of the width above, and the\n * end offset converts a full track width into those same own-width units. Both ends sit\n * flush off-track, which keeps entry and exit symmetric — a smaller start offset would\n * make the bar pop in already partly visible.\n */\nconst indeterminateSlide = keyframes`\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(${(100 / INDETERMINATE_INDICATOR_WIDTH) * 100}%);\n }\n`;\n\nconst IndeterminateIndicator = styled.div`\n height: 100%;\n width: ${INDETERMINATE_INDICATOR_WIDTH}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n /* Linear, not an eased curve: the DS easings decelerate to a stop, which on a loop\n reads as a stall at the wrap point. Constant speed is what makes it read as a sweep. */\n animation: ${indeterminateSlide} 1.2s linear infinite;\n\n /* A perpetually moving bar is a vestibular trigger; fall back to a static track fill. */\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n width: 100%;\n opacity: 0.5;\n }\n`;\n\n/**\n * Progress bar for work whose completion fraction is genuinely unknowable, rather\n * than merely unknown-yet: the AI metadata endpoint answers in one go, and the URL\n * flow can't report bytes until the server has fetched the file and knows its size.\n *\n * Deliberately omits `aria-valuenow` — that absence is precisely how ARIA conveys\n * an indeterminate progressbar, so assistive tech announces \"busy\" instead of \"0%\".\n */\nconst IndeterminateBar = () => {\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100}>\n <IndeterminateIndicator />\n </ProgressTrack>\n );\n};\n\nconst FileRow = ({\n icon,\n fileName,\n children,\n}: {\n icon: React.ReactNode;\n fileName: string;\n children: React.ReactNode;\n}) => {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" justifyContent=\"center\" gap={1} width=\"100%\">\n <Flex gap={2}>\n {icon}\n <Typography variant=\"omega\" fontWeight=\"semiBold\" ellipsis>\n {fileName}\n </Typography>\n </Flex>\n {children}\n </Flex>\n );\n};\n\n/**\n * Icon + subline for a successfully uploaded row, keyed by its metadata phase.\n * `'none'` covers rows that never entered the phase — AI metadata disabled — and\n * renders exactly as before this feature existed. Non-images do enter the phase and\n * land on `skipped`.\n *\n * `skipped` uses a neutral `Information` icon, deliberately distinct from\n * generated/failed/cancelled — skipping is an expected outcome for a non-image, not a\n * problem to flag.\n */\nconst COMPLETED_ROW_PRESENTATION: Record<\n FileMetadataStatus | 'none',\n { icon: React.ReactNode; message: MessageDescriptor }\n> = {\n none: {\n icon: <CheckCircle fill=\"success500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.uploaded'),\n defaultMessage: 'Uploaded',\n },\n },\n generating: {\n icon: <Sparkle fill=\"primary600\" />,\n message: {\n id: getTranslationKey('upload.progress.file.generatingMetadata'),\n defaultMessage: 'Uploaded • Generating metadata…',\n },\n },\n generated: {\n icon: <CheckCircle fill=\"success500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataGenerated'),\n defaultMessage: 'Uploaded • Metadata generated',\n },\n },\n skipped: {\n icon: <Information fill=\"neutral500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataSkipped'),\n defaultMessage: 'Upload complete • Metadata generation skipped',\n },\n },\n failed: {\n icon: <WarningCircle fill=\"warning500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataFailed'),\n defaultMessage: 'Upload complete • Metadata generation failed',\n },\n },\n};\n\nconst FileRowRenderer = ({ file }: { file: FileProgress }) => {\n const { formatMessage } = useIntl();\n const isError = file.status === 'error';\n const isCurrentFile = file.status === 'uploading';\n const isCompleted = file.status === 'complete';\n const isCancelled = file.status === 'cancelled';\n\n if (isCurrentFile) {\n // Determinate only once bytes are actually being reported — a known `size` is not\n // enough. The two upload flows differ here:\n // - the direct-file flow streams real byte counts from XHR, so `uploadedBytes`\n // climbs and a determinate bar is meaningful;\n // - the URL flow learns the size from the `file:uploading` SSE event but receives\n // no incremental counts at all (the next event is `file:complete`), so\n // `uploadedBytes` stays 0 for the whole transfer.\n // Keying off `size` alone froze URL rows at a determinate 0% for the entire upload;\n // keying off reported bytes keeps them animating until there is a fraction to show.\n const hasReportedProgress = file.size > 0 && file.uploadedBytes > 0;\n\n return (\n <FileRow icon={<ArrowsCounterClockwise fill=\"secondary600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.uploading'),\n defaultMessage: 'Uploading...',\n })}\n </Typography>\n {hasReportedProgress ? (\n <DeterminateBar percent={(file.uploadedBytes / file.size) * 100} />\n ) : (\n <IndeterminateBar />\n )}\n </FileRow>\n );\n }\n\n if (isError) {\n return (\n <FileRow icon={<CrossCircle fill=\"danger500\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {file.error}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCancelled) {\n return (\n <FileRow icon={<MinusCircle fill=\"neutral600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.canceled'),\n defaultMessage: 'Canceled',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCompleted) {\n // The upload succeeded; the metadata phase (if any) drives both the icon and the\n // subline from here on — a metadata failure shows a warning, not an upload error.\n const { icon, message } = COMPLETED_ROW_PRESENTATION[file.metadataStatus ?? 'none'];\n\n return (\n <FileRow icon={icon} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(message)}\n </Typography>\n {/* Generation has no intermediate progress to report, so the bar stays indeterminate. */}\n {file.metadataStatus === 'generating' && <IndeterminateBar />}\n </FileRow>\n );\n }\n\n return null;\n};\n\nconst CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n`;\n\nexport const UploadProgressDialog = () => {\n const dispatch = useTypedDispatch();\n const { isVisible, isMinimized, files } = useTypedSelector((state) => state.uploadProgress);\n\n // With concurrent uploads several files are `uploading` at once — render every\n // in-flight row, not just the first (a `find` here dated to the strictly\n // sequential era and hid all but the lowest-index worker's row).\n const uploadingFiles = files.filter((f) => f.status === 'uploading');\n const completedFiles = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .sort((a, b) => {\n // Sort priority: error > cancelled > complete\n const priority: Record<FileProgressStatus, number> = {\n error: 0,\n cancelled: 1,\n complete: 2,\n uploading: 3,\n pending: 4,\n };\n return priority[a.status] - priority[b.status];\n });\n\n const handleClose = () => {\n dispatch(closeUploadProgress());\n };\n\n return (\n <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n >\n {uploadingFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n\n {completedFiles.length > 0 && (\n <CompletedFilesList>\n {completedFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n </CompletedFilesList>\n )}\n </Flex>\n </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","metadataSubtitle","_jsxs","Flex","direction","alignItems","paddingLeft","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","metadataProgress","isGeneratingMetadata","metadataOutcome","formatMessage","useIntl","id","getTranslationKey","defaultMessage","percentage","undefined","generated","failed","generatedCount","failedCount","count","background","Cross","fill","successCount","Check","MinusCircle","progressPercentage","Math","round","Upload","total","HeaderIconButton","IconButton","ChevronWrapper","span","$isMinimized","HEADER_COLOR_MAP","uploading","canceled","success","error","DialogHeader","handleClose","isMinimized","files","uploadId","useTypedSelector","state","uploadProgress","selectAggregateProgress","selectMetadataProgress","selectIsGeneratingMetadata","selectMetadataOutcome","dispatch","useTypedDispatch","retryCancelledFiles","useRetryCancelledFilesMutation","isComplete","length","every","f","isAllUploaded","isAllErrored","hasCancelledFiles","some","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","ProgressTrack","div","colors","neutral200","ProgressIndicator","$percent","primary700","DeterminateBar","percent","clamped","min","max","role","aria-valuemin","aria-valuemax","aria-valuenow","INDETERMINATE_INDICATOR_WIDTH","indeterminateSlide","keyframes","IndeterminateIndicator","IndeterminateBar","FileRow","icon","fileName","children","width","ellipsis","COMPLETED_ROW_PRESENTATION","none","CheckCircle","message","generating","Sparkle","skipped","Information","WarningCircle","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","hasReportedProgress","size","uploadedBytes","ArrowsCounterClockwise","name","CrossCircle","metadataStatus","CompletedFilesList","UploadProgressDialog","isVisible","uploadingFiles","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","paddingTop","paddingBottom","paddingRight","map","index"],"mappings":";;;;;;;;;;;;AAqCA;;qGAIA,MAAMA,sBAAsB,CAAC,EAC3BC,KAAK,EACLC,QAAQ,EACRC,gBAAgB,EAKjB,GAAA;AACC,IAAA,qBACEC,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,YAAA;QAAaC,WAAAA,EAAa,CAAA;;AAC5D,0BAAAC,GAAA,CAACC,OAAOC,KAAK,EAAA;AACX,gBAAA,QAAA,gBAAAF,GAAA,CAACG,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,OAAA;AAASZ,oBAAAA,QAAAA,EAAAA;;;AAE/B,0BAAAQ,GAAA,CAACC,OAAOI,WAAW,EAAA;AACjB,gBAAA,QAAA,gBAAAL,GAAA,CAACG,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,IAAA;oBAAKE,SAAAA,EAAU,YAAA;AAChCb,oBAAAA,QAAAA,EAAAA;;;AAGJC,YAAAA,gBAAAA,kBACCM,GAAA,CAACG,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,IAAA;gBAAKE,SAAAA,EAAU,YAAA;AAChCZ,gBAAAA,QAAAA,EAAAA;;;;AAKX,CAAA;AAEA,MAAMa,gBAAAA,GAAmBC,MAAAA,CAAOZ,IAAAA,CAAK;WAC1B,EAAE,CAAC,EAAEa,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC3B,iBAAA,EAAE,CAAC,EAAED,KAAK,EAAE,GAAK,CAAA,EAAGA,KAAAA,CAAME,YAAY,CAAC,KAAK,EAAEF,KAAAA,CAAME,YAAY,EAAE,CAAC;;;;;;AAMpF,CAAC;AAED,MAAMC,mBAAAA,GAAsBJ,MAAAA,CAAOZ,IAAAA,CAAK;;AAExC,CAAC;AAsBD,MAAMiB,eAAe,CAAC,EACpBC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,eAAe,EACfC,UAAU,EACVC,gBAAgB,EAChBC,oBAAoB,EACpBC,eAAe,EACG,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;;;;;;;;;;IAW1B,MAAM7B,gBAAAA,GAAmB,CAAC,IAAA;QACxB,IAAIyB,gBAAAA,KAAqB,QAAQC,oBAAAA,EAAsB;AACrD,YAAA,OAAOE,aAAAA,CACL;AACEE,gBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,8CAAA,CAAA;gBACtBC,cAAAA,EAAgB;aAClB,EACA;gBAAEC,UAAAA,EAAYR;AAAiB,aAAA,CAAA;AAEnC,QAAA;AAEA,QAAA,IAAIE,oBAAoB,IAAA,EAAM;YAC5B,OAAOO,SAAAA;AACT,QAAA;;;;;QAMA,IAAIP,eAAAA,CAAgBQ,SAAS,KAAK,CAAA,EAAG;YACnC,OAAOD,SAAAA;AACT,QAAA;QAEA,IAAIP,eAAAA,CAAgBS,MAAM,GAAG,CAAA,EAAG;AAC9B,YAAA,OAAOR,aAAAA,CACL;AACEE,gBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,gDAAA,CAAA;gBACtBC,cAAAA,EAAgB;aAClB,EACA;AAAEK,gBAAAA,cAAAA,EAAgBV,gBAAgBQ,SAAS;AAAEG,gBAAAA,WAAAA,EAAaX,gBAAgBS;AAAO,aAAA,CAAA;AAErF,QAAA;AAEA,QAAA,OAAOR,aAAAA,CACL;AACEE,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,6CAAA,CAAA;YACtBC,cAAAA,EACE;SACJ,EACA;AAAEO,YAAAA,KAAAA,EAAOZ,gBAAgBQ;AAAU,SAAA,CAAA;IAEvC,CAAA,GAAA;AAEA,IAAA,IAAIf,WAAW,OAAA,EAAS;AACtB,QAAA,qBACEnB,IAAA,CAACiB,mBAAAA,EAAAA;;8BACCZ,GAAA,CAACO,gBAAAA,EAAAA;oBAAiB2B,UAAAA,EAAW,WAAA;AAC3B,oBAAA,QAAA,gBAAAlC,GAAA,CAACmC,KAAAA,EAAAA;wBAAMC,IAAAA,EAAK;;;8BAEdpC,GAAA,CAACT,mBAAAA,EAAAA;AACCC,oBAAAA,KAAAA,EAAO8B,aAAAA,CAAc;AACnBE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,wBAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AACAjC,oBAAAA,QAAAA,EAAU6B,aAAAA,CAAc;AACtBE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,iCAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA;;;;AAIR,IAAA;AAEA,IAAA,IAAIZ,WAAW,SAAA,EAAW;QACxB,MAAMrB,QAAAA,GACJyB,UAAAA,GAAa,CAAA,GACTI,aAAAA,CACE;AACEE,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,6CAAA,CAAA;YACtBC,cAAAA,EAAgB;SAClB,EACA;YAAEW,YAAAA,EAAcpB,eAAAA;AAAiBC,YAAAA;AAAW,SAAA,CAAA,GAE9CI,aAAAA,CACE;AACEE,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,kCAAA,CAAA;YACtBC,cAAAA,EAAgB;SAClB,EACA;YAAEO,KAAAA,EAAOhB;AAAgB,SAAA,CAAA;AAGjC,QAAA,qBACEtB,IAAA,CAACiB,mBAAAA,EAAAA;;8BACCZ,GAAA,CAACO,gBAAAA,EAAAA;oBAAiB2B,UAAAA,EAAW,YAAA;AAC3B,oBAAA,QAAA,gBAAAlC,GAAA,CAACsC,KAAAA,EAAAA;wBAAMF,IAAAA,EAAK;;;8BAEdpC,GAAA,CAACT,mBAAAA,EAAAA;AACCC,oBAAAA,KAAAA,EAAO8B,aAAAA,CAAc;AACnBE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,yBAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAjC,QAAAA,EAAUA,QAAAA;oBACVC,gBAAAA,EAAkBA;;;;AAI1B,IAAA;AAEA,IAAA,IAAIoB,WAAW,UAAA,EAAY;AACzB,QAAA,qBACEnB,IAAA,CAACiB,mBAAAA,EAAAA;;8BACCZ,GAAA,CAACO,gBAAAA,EAAAA;oBAAiB2B,UAAAA,EAAW,YAAA;AAC3B,oBAAA,QAAA,gBAAAlC,GAAA,CAACuC,WAAAA,EAAAA;wBAAYH,IAAAA,EAAK;;;8BAEpBpC,GAAA,CAACT,mBAAAA,EAAAA;AACCC,oBAAAA,KAAAA,EAAO8B,aAAAA,CAAc;AACnBE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,0BAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AACAjC,oBAAAA,QAAAA,EAAU6B,aAAAA,CAAc;AACtBE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,mCAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAhC,gBAAAA,EAAkBA;;;;AAI1B,IAAA;AAEA,IAAA,IAAIoB,WAAW,WAAA,EAAa;AAC1B,QAAA,MAAM0B,kBAAAA,GAAqBzB,QAAAA,GAAW0B,IAAAA,CAAKC,KAAK,CAAC3B,QAAAA,CAAAA,GAAY,CAAA;AAE7D,QAAA,qBACEpB,IAAA,CAACiB,mBAAAA,EAAAA;;8BACCZ,GAAA,CAACO,gBAAAA,EAAAA;oBAAiB2B,UAAAA,EAAW,YAAA;AAC3B,oBAAA,QAAA,gBAAAlC,GAAA,CAAC2C,MAAAA,EAAAA;wBAAOP,IAAAA,EAAK;;;8BAEfpC,GAAA,CAACT,mBAAAA,EAAAA;AACCC,oBAAAA,KAAAA,EAAO8B,aAAAA,CACL;AACEE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,qCAAA,CAAA;wBACtBC,cAAAA,EAAgB;qBAClB,EACA;wBACEkB,KAAAA,EAAO5B,UAAAA;wBACPW,UAAAA,EAAYa;AACd,qBAAA,CAAA;oBAEF9C,gBAAAA,EAAkBA;;;;AAI1B,IAAA;IAEA,OAAO,IAAA;AACT,CAAA;AAEA,MAAMmD,gBAAAA,GAAmBrC,MAAAA,CAAOsC,UAAAA,CAAW;;;;AAI3C,CAAC;AAED,MAAMC,cAAAA,GAAiBvC,MAAAA,CAAOwC,IAA+B;;;AAGhD,aAAA,EAAE,CAAC,EAAEC,YAAY,EAAE,GAAMA,YAAAA,GAAe,mBAAmB,cAAA,CAAgB;AACxF,CAAC;AAED,MAAMC,gBAAAA,GAAmB;IACvBC,SAAAA,EAAW;QAAEjB,UAAAA,EAAY;AAAa,KAAA;IACtCkB,QAAAA,EAAU;QAAElB,UAAAA,EAAY;AAAa,KAAA;IACrCmB,OAAAA,EAAS;QAAEnB,UAAAA,EAAY;AAAa,KAAA;IACpCoB,KAAAA,EAAO;QAAEpB,UAAAA,EAAY;AAAY;AACnC,CAAA;AAEA,MAAMqB,YAAAA,GAAe,CAAC,EAAEC,WAAW,EAA+B,GAAA;IAChE,MAAM,EAAElC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAM,EAAEkC,WAAW,EAAEC,KAAK,EAAEC,QAAQ,EAAE3C,UAAU,EAAE,GAAG4C,gBAAAA,CACnD,CAACC,KAAAA,GAAUA,MAAMC,cAAc,CAAA;AAEjC,IAAA,MAAM/C,WAAW6C,gBAAAA,CAAiBG,uBAAAA,CAAAA;AAClC,IAAA,MAAM5C,mBAAmByC,gBAAAA,CAAiBI,sBAAAA,CAAAA;AAC1C,IAAA,MAAM5C,uBAAuBwC,gBAAAA,CAAiBK,0BAAAA,CAAAA;AAC9C,IAAA,MAAM5C,kBAAkBuC,gBAAAA,CAAiBM,qBAAAA,CAAAA;AACzC,IAAA,MAAMC,QAAAA,GAAWC,gBAAAA,EAAAA;IACjB,MAAM,CAACC,oBAAoB,GAAGC,8BAAAA,EAAAA;;;IAI9B,MAAMC,UAAAA,GACJb,MAAMc,MAAM,GAAG,KACfd,KAAAA,CAAMe,KAAK,CAAC,CAACC,CAAAA,GAAMA,EAAE5D,MAAM,KAAK,cAAc4D,CAAAA,CAAE5D,MAAM,KAAK,OAAA,IAAW4D,CAAAA,CAAE5D,MAAM,KAAK,WAAA,CAAA;AACrF,IAAA,MAAM6D,aAAAA,GAAgBJ,UAAAA;IACtB,MAAMK,YAAAA,GAAeL,cAAcb,KAAAA,CAAMe,KAAK,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAE5D,MAAM,KAAK,OAAA,CAAA;IACnE,MAAM+D,iBAAAA,GAAoBnB,MAAMoB,IAAI,CAAC,CAACJ,CAAAA,GAAMA,CAAAA,CAAE5D,MAAM,KAAK,WAAA,CAAA;IACzD,MAAMG,eAAAA,GAAkByC,KAAAA,CAAMqB,MAAM,CAAC,CAACL,IAAMA,CAAAA,CAAE5D,MAAM,KAAK,UAAA,CAAA,CAAY0D,MAAM;IAC3E,MAAMtD,UAAAA,GAAawC,KAAAA,CAAMqB,MAAM,CAAC,CAACL,IAAMA,CAAAA,CAAE5D,MAAM,KAAK,OAAA,CAAA,CAAS0D,MAAM;;AAEnE,IAAA,MAAMQ,SAAAA,GAAYT,UAAAA,IAActD,eAAAA,GAAkB,CAAA,IAAK,CAAC4D,iBAAAA;IACxD,MAAM/D,MAAAA,GAAS,CAAC,IAAA;AACd,QAAA,IAAI8D,cAAc,OAAO,OAAA;AACzB,QAAA,IAAII,WAAW,OAAO,SAAA;AACtB,QAAA,IAAIH,mBAAmB,OAAO,UAAA;QAE9B,OAAO,WAAA;IACT,CAAA,GAAA;AAEA,IAAA,MAAMI,YAAAA,GAAe,IAAA;QACnBC,WAAAA,CAAYvB,QAAAA,CAAAA;QACZQ,QAAAA,CAASgB,YAAAA,EAAAA,CAAAA;AACX,IAAA,CAAA;AAEA,IAAA,MAAMC,WAAAA,GAAc,UAAA;QAClB,IAAI;AACF,YAAA,MAAMf,sBAAsBgB,MAAM,EAAA;AACpC,QAAA,CAAA,CAAE,OAAM;;AAER,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,oBAAAA,GAAuB,IAAA;QAC3BnB,QAAAA,CAASoB,cAAAA,EAAAA,CAAAA;AACX,IAAA,CAAA;AAEA,IAAA,qBACE5F,IAAA,CAACC,IAAAA,EAAAA;AACCsC,QAAAA,UAAAA,EAAYgB,gBAAgB,CAACpC,MAAAA,CAAO,CAACoB,UAAU;QAC/CsD,cAAAA,EAAe,eAAA;QACfC,MAAAA,EAAQ,CAAA;QACRC,SAAS,EAAA,IAAA;;0BAET1F,GAAA,CAACa,YAAAA,EAAAA;gBACCC,MAAAA,EAAQA,MAAAA;gBACRC,QAAAA,EAAUA,QAAAA;gBACVC,UAAAA,EAAYA,UAAAA;gBACZC,eAAAA,EAAiBA,eAAAA;gBACjBC,UAAAA,EAAYA,UAAAA;gBACZC,gBAAAA,EAAkBA,gBAAAA;gBAClBC,oBAAAA,EAAsBA,oBAAAA;gBACtBC,eAAAA,EAAiBA;;0BAEnB1B,IAAA,CAACC,IAAAA,EAAAA;gBAAK+F,GAAAA,EAAK,CAAA;;AACR,oBAAA,CAAChB,+BACA3E,GAAA,CAAC4F,UAAAA,EAAAA;wBAAWC,OAAAA,EAASZ,YAAAA;wBAAca,UAAAA,EAAW,MAAA;kCAC3CxE,aAAAA,CAAc;AACbE,4BAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,wBAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA;;AAGHmD,oBAAAA,iBAAAA,kBACC7E,GAAA,CAAC4F,UAAAA,EAAAA;wBAAWC,OAAAA,EAAST,WAAAA;wBAAaU,UAAAA,EAAW,MAAA;kCAC1CxE,aAAAA,CAAc;AACbE,4BAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,uBAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA;;kCAGJ1B,GAAA,CAAC6C,gBAAAA,EAAAA;wBACCgD,OAAAA,EAASP,oBAAAA;AACTS,wBAAAA,KAAAA,EAAOzE,aAAAA,CAAc;4BACnBE,EAAAA,EAAIC,iBAAAA,CACFgC,cAAc,0BAAA,GAA6B,0BAAA,CAAA;AAE7C/B,4BAAAA,cAAAA,EAAgB+B,cAAc,UAAA,GAAa;AAC7C,yBAAA,CAAA;wBACArD,OAAAA,EAAQ,OAAA;AAER,wBAAA,QAAA,gBAAAJ,GAAA,CAAC+C,cAAAA,EAAAA;4BAAeE,YAAAA,EAAcQ,WAAAA;AAC5B,4BAAA,QAAA,gBAAAzD,GAAA,CAACgG,WAAAA,EAAAA,EAAAA;;;oBAGJzB,UAAAA,kBACCvE,GAAA,CAACC,OAAOgG,WAAW,EAAA;wBACjBC,OAAAA,EAAS1C,WAAAA;AACTuC,wBAAAA,KAAAA,EAAOzE,aAAAA,CAAc;AACnBE,4BAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,uBAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA;;;;;;AAMZ,CAAA;AAEA;;AAEkG,qGAElG,MAAMyE,aAAAA,GAAgB3F,MAAAA,CAAO4F,GAAG;;UAEtB,EAAE,CAAC,EAAE3F,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;oBACvB,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAM4F,MAAM,CAACC,UAAU,CAAC;;;AAG7D,CAAC;AAED,MAAMC,iBAAAA,GAAoB/F,MAAAA,CAAO4F,GAAyB;;AAEjD,SAAA,EAAE,CAAC,EAAEI,QAAQ,EAAE,GAAKA,QAAAA,CAAS;oBAClB,EAAE,CAAC,EAAE/F,KAAK,EAAE,GAAKA,KAAAA,CAAM4F,MAAM,CAACI,UAAU,CAAC;;;AAG7D,CAAC;AAED,MAAMC,cAAAA,GAAiB,CAAC,EAAEC,OAAO,EAAuB,GAAA;IACtD,MAAMC,OAAAA,GAAUnE,IAAAA,CAAKoE,GAAG,CAAC,GAAA,EAAKpE,IAAAA,CAAKqE,GAAG,CAAC,CAAA,EAAGrE,IAAAA,CAAKC,KAAK,CAACiE,OAAAA,CAAAA,CAAAA,CAAAA;AACrD,IAAA,qBACE3G,GAAA,CAACmG,aAAAA,EAAAA;QAAcY,IAAAA,EAAK,aAAA;QAAcC,eAAAA,EAAe,CAAA;QAAGC,eAAAA,EAAe,GAAA;QAAKC,eAAAA,EAAeN,OAAAA;AACrF,QAAA,QAAA,gBAAA5G,GAAA,CAACuG,iBAAAA,EAAAA;YAAkBC,QAAAA,EAAUI;;;AAGnC,CAAA;AAEA,MAAMO,6BAAAA,GAAgC,EAAA;AAEtC;;;;;;IAOA,MAAMC,kBAAAA,GAAqBC,SAAS;;;;;0BAKV,EAAG,GAAA,GAAMF,6BAAAA,GAAiC,GAAA,CAAI;;AAExE,CAAC;AAED,MAAMG,sBAAAA,GAAyB9G,MAAAA,CAAO4F,GAAG;;AAEhC,SAAA,EAAEe,6BAAAA,CAA8B;oBACrB,EAAE,CAAC,EAAE1G,KAAK,EAAE,GAAKA,KAAAA,CAAM4F,MAAM,CAACI,UAAU,CAAC;;;;AAIhD,aAAA,EAAEW,kBAAAA,CAAmB;;;;;;;;AAQlC,CAAC;AAED;;;;;;;AAOC,IACD,MAAMG,gBAAAA,GAAmB,IAAA;AACvB,IAAA,qBACEvH,GAAA,CAACmG,aAAAA,EAAAA;QAAcY,IAAAA,EAAK,aAAA;QAAcC,eAAAA,EAAe,CAAA;QAAGC,eAAAA,EAAe,GAAA;AACjE,QAAA,QAAA,gBAAAjH,GAAA,CAACsH,sBAAAA,EAAAA,EAAAA;;AAGP,CAAA;AAEA,MAAME,OAAAA,GAAU,CAAC,EACfC,IAAI,EACJC,QAAQ,EACRC,QAAQ,EAKT,GAAA;AACC,IAAA,qBACEhI,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,SAAA;QAAU0F,cAAAA,EAAe,QAAA;QAASG,GAAAA,EAAK,CAAA;QAAGiC,KAAAA,EAAM,MAAA;;0BAClFjI,IAAA,CAACC,IAAAA,EAAAA;gBAAK+F,GAAAA,EAAK,CAAA;;AACR8B,oBAAAA,IAAAA;kCACDzH,GAAA,CAACG,UAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,OAAA;wBAAQ0F,UAAAA,EAAW,UAAA;wBAAW+B,QAAQ,EAAA,IAAA;AACvDH,wBAAAA,QAAAA,EAAAA;;;;AAGJC,YAAAA;;;AAGP,CAAA;AAEA;;;;;;;;;AASC,IACD,MAAMG,0BAAAA,GAGF;IACFC,IAAAA,EAAM;AACJN,QAAAA,IAAAA,gBAAMzH,GAAA,CAACgI,WAAAA,EAAAA;YAAY5F,IAAAA,EAAK;;QACxB6F,OAAAA,EAAS;AACPzG,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,+BAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAwG,UAAAA,EAAY;AACVT,QAAAA,IAAAA,gBAAMzH,GAAA,CAACmI,OAAAA,EAAAA;YAAQ/F,IAAAA,EAAK;;QACpB6F,OAAAA,EAAS;AACPzG,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,yCAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAG,SAAAA,EAAW;AACT4F,QAAAA,IAAAA,gBAAMzH,GAAA,CAACgI,WAAAA,EAAAA;YAAY5F,IAAAA,EAAK;;QACxB6F,OAAAA,EAAS;AACPzG,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,wCAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACA0G,OAAAA,EAAS;AACPX,QAAAA,IAAAA,gBAAMzH,GAAA,CAACqI,WAAAA,EAAAA;YAAYjG,IAAAA,EAAK;;QACxB6F,OAAAA,EAAS;AACPzG,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,sCAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB;AACF,KAAA;IACAI,MAAAA,EAAQ;AACN2F,QAAAA,IAAAA,gBAAMzH,GAAA,CAACsI,aAAAA,EAAAA;YAAclG,IAAAA,EAAK;;QAC1B6F,OAAAA,EAAS;AACPzG,YAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,qCAAA,CAAA;YACtBC,cAAAA,EAAgB;AAClB;AACF;AACF,CAAA;AAEA,MAAM6G,eAAAA,GAAkB,CAAC,EAAEC,IAAI,EAA0B,GAAA;IACvD,MAAM,EAAElH,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAMkH,OAAAA,GAAUD,IAAAA,CAAK1H,MAAM,KAAK,OAAA;IAChC,MAAM4H,aAAAA,GAAgBF,IAAAA,CAAK1H,MAAM,KAAK,WAAA;IACtC,MAAM6H,WAAAA,GAAcH,IAAAA,CAAK1H,MAAM,KAAK,UAAA;IACpC,MAAM8H,WAAAA,GAAcJ,IAAAA,CAAK1H,MAAM,KAAK,WAAA;AAEpC,IAAA,IAAI4H,aAAAA,EAAe;;;;;;;;;;AAUjB,QAAA,MAAMG,sBAAsBL,IAAAA,CAAKM,IAAI,GAAG,CAAA,IAAKN,IAAAA,CAAKO,aAAa,GAAG,CAAA;AAElE,QAAA,qBACEpJ,IAAA,CAAC6H,OAAAA,EAAAA;AAAQC,YAAAA,IAAAA,gBAAMzH,GAAA,CAACgJ,sBAAAA,EAAAA;gBAAuB5G,IAAAA,EAAK;;AAAmBsF,YAAAA,QAAAA,EAAUc,KAAKS,IAAI;;8BAChFjJ,GAAA,CAACG,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,IAAA;oBAAKE,SAAAA,EAAU,YAAA;8BAChCgB,aAAAA,CAAc;AACbE,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,gCAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA;;AAEDmH,gBAAAA,mBAAAA,iBACC7I,GAAA,CAAC0G,cAAAA,EAAAA;AAAeC,oBAAAA,OAAAA,EAAS,IAAC6B,CAAKO,aAAa,GAAGP,IAAAA,CAAKM,IAAI,GAAI;mCAE5D9I,GAAA,CAACuH,gBAAAA,EAAAA,EAAAA;;;AAIT,IAAA;AAEA,IAAA,IAAIkB,OAAAA,EAAS;AACX,QAAA,qBACEzI,GAAA,CAACwH,OAAAA,EAAAA;AAAQC,YAAAA,IAAAA,gBAAMzH,GAAA,CAACkJ,WAAAA,EAAAA;gBAAY9G,IAAAA,EAAK;;AAAgBsF,YAAAA,QAAAA,EAAUc,KAAKS,IAAI;AAClE,YAAA,QAAA,gBAAAjJ,GAAA,CAACG,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,IAAA;gBAAKE,SAAAA,EAAU,YAAA;AAChCkI,gBAAAA,QAAAA,EAAAA,IAAAA,CAAKlF;;;AAId,IAAA;AAEA,IAAA,IAAIsF,WAAAA,EAAa;AACf,QAAA,qBACE5I,GAAA,CAACwH,OAAAA,EAAAA;AAAQC,YAAAA,IAAAA,gBAAMzH,GAAA,CAACuC,WAAAA,EAAAA;gBAAYH,IAAAA,EAAK;;AAAiBsF,YAAAA,QAAAA,EAAUc,KAAKS,IAAI;AACnE,YAAA,QAAA,gBAAAjJ,GAAA,CAACG,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,IAAA;gBAAKE,SAAAA,EAAU,YAAA;0BAChCgB,aAAAA,CAAc;AACbE,oBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,+BAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA;;;AAIR,IAAA;AAEA,IAAA,IAAIiH,WAAAA,EAAa;;;QAGf,MAAM,EAAElB,IAAI,EAAEQ,OAAO,EAAE,GAAGH,0BAA0B,CAACU,IAAAA,CAAKW,cAAc,IAAI,MAAA,CAAO;AAEnF,QAAA,qBACExJ,IAAA,CAAC6H,OAAAA,EAAAA;YAAQC,IAAAA,EAAMA,IAAAA;AAAMC,YAAAA,QAAAA,EAAUc,KAAKS,IAAI;;8BACtCjJ,GAAA,CAACG,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,IAAA;oBAAKE,SAAAA,EAAU,YAAA;8BAChCgB,aAAAA,CAAc2G,OAAAA;;gBAGhBO,IAAAA,CAAKW,cAAc,KAAK,YAAA,kBAAgBnJ,GAAA,CAACuH,gBAAAA,EAAAA,EAAAA;;;AAGhD,IAAA;IAEA,OAAO,IAAA;AACT,CAAA;AAEA,MAAM6B,kBAAAA,GAAqB5I,MAAAA,CAAOZ,IAAAA,CAAK;;OAEhC,EAAE,CAAC,EAAEa,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC,CAAA,CAAE,CAAC;;AAExC,CAAC;MAEY2I,oBAAAA,GAAuB,IAAA;AAClC,IAAA,MAAMlF,QAAAA,GAAWC,gBAAAA,EAAAA;AACjB,IAAA,MAAM,EAAEkF,SAAS,EAAE7F,WAAW,EAAEC,KAAK,EAAE,GAAGE,gBAAAA,CAAiB,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,cAAc,CAAA;;;;IAK1F,MAAMyF,cAAAA,GAAiB7F,MAAMqB,MAAM,CAAC,CAACL,CAAAA,GAAMA,CAAAA,CAAE5D,MAAM,KAAK,WAAA,CAAA;IACxD,MAAM0I,cAAAA,GAAiB9F,MACpBqB,MAAM,CAAC,CAACL,CAAAA,GAAMA,CAAAA,CAAE5D,MAAM,KAAK,UAAA,IAAc4D,EAAE5D,MAAM,KAAK,WAAW4D,CAAAA,CAAE5D,MAAM,KAAK,WAAA,CAAA,CAC9E2I,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAAA;;AAER,QAAA,MAAMC,QAAAA,GAA+C;YACnDtG,KAAAA,EAAO,CAAA;YACPuG,SAAAA,EAAW,CAAA;YACXC,QAAAA,EAAU,CAAA;YACV3G,SAAAA,EAAW,CAAA;YACX4G,OAAAA,EAAS;AACX,SAAA;QACA,OAAOH,QAAQ,CAACF,CAAAA,CAAE5I,MAAM,CAAC,GAAG8I,QAAQ,CAACD,CAAAA,CAAE7I,MAAM,CAAC;AAChD,IAAA,CAAA,CAAA;AAEF,IAAA,MAAM0C,WAAAA,GAAc,IAAA;QAClBW,QAAAA,CAAS6F,mBAAAA,EAAAA,CAAAA;AACX,IAAA,CAAA;IAEA,qBACEhK,GAAA,CAACC,OAAOgK,IAAI,EAAA;QAACX,SAAAA,EAAWA,SAAAA;QAAWpD,OAAAA,EAAS1C,WAAAA;gCAC1C7D,IAAA,CAACM,OAAOiK,IAAI,EAAA;YAACC,kBAAAA,EAAmB,IAAA;YAAKvC,KAAAA,EAAM,SAAA;YAAUwC,SAAAA,EAAU,SAAA;;8BAC7DpK,GAAA,CAACuD,YAAAA,EAAAA;oBAAaC,WAAAA,EAAaA;;AAC3B,8BAAAxD,GAAA,CAACC,OAAOoK,iBAAiB,EAAA;AAACC,oBAAAA,iBAAAA,EAAmB,CAAC7G,WAAAA;AAC5C,oBAAA,QAAA,gBAAA9D,IAAA,CAACC,IAAAA,EAAAA;wBACCC,SAAAA,EAAU,QAAA;wBACVC,UAAAA,EAAW,SAAA;wBACX6F,GAAAA,EAAK,CAAA;wBACL4E,UAAAA,EAAY,CAAA;wBACZC,aAAAA,EAAe,CAAA;wBACfzK,WAAAA,EAAa,CAAA;wBACb0K,YAAAA,EAAc,CAAA;;AAEblB,4BAAAA,cAAAA,CAAemB,GAAG,CAAC,CAAClC,IAAAA,iBACnBxI,GAAA,CAACuI,eAAAA,EAAAA;oCAAiCC,IAAAA,EAAMA;AAAlBA,iCAAAA,EAAAA,IAAAA,CAAKmC,KAAK,CAAA,CAAA;4BAGjCnB,cAAAA,CAAehF,MAAM,GAAG,CAAA,kBACvBxE,GAAA,CAACoJ,kBAAAA,EAAAA;AACEI,gCAAAA,QAAAA,EAAAA,cAAAA,CAAekB,GAAG,CAAC,CAAClC,IAAAA,iBACnBxI,GAAA,CAACuI,eAAAA,EAAAA;wCAAiCC,IAAAA,EAAMA;AAAlBA,qCAAAA,EAAAA,IAAAA,CAAKmC,KAAK,CAAA;;;;;;;;AASlD;;;;"}
1
+ {"version":3,"file":"UploadProgressDialog.mjs","sources":["../../../../admin/src/future/components/UploadProgressDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Flex, IconButton, TextButton, Typography } from '@strapi/design-system';\nimport {\n ArrowsCounterClockwise,\n Check,\n CheckCircle,\n ChevronDown,\n Clock,\n Cross,\n CrossCircle,\n Information,\n MinusCircle,\n Sparkle,\n Upload,\n WarningCircle,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { keyframes, styled } from 'styled-components';\n\nimport { abortUpload, useRetryCancelledFilesMutation } from '../services/api';\nimport { useTypedDispatch, useTypedSelector } from '../store/hooks';\nimport {\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n selectAggregateProgress,\n selectReportsByteProgress,\n selectCountBasedProgress,\n selectMetadataProgress,\n selectIsGeneratingMetadata,\n selectMetadataOutcome,\n} from '../store/uploadProgress';\nimport { getTranslationKey } from '../utils/translations';\n\nimport { Drawer } from './Drawer';\nimport { TruncatedText } from './TruncatedText';\n\nimport type { FileMetadataStatus, FileProgress, FileProgressStatus } from '../store/uploadProgress';\nimport type { MessageDescriptor } from 'react-intl';\n\n/* -------------------------------------------------------------------------------------------------\n * DialogHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderStatusMessage = ({\n title,\n subtitle,\n metadataSubtitle,\n}: {\n title: string;\n subtitle?: string;\n metadataSubtitle?: string;\n}) => {\n return (\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingLeft={2}\n paddingRight={2}\n paddingTop={1}\n paddingBottom={1}\n >\n <Drawer.Title>\n <Typography variant=\"omega\">{title}</Typography>\n </Drawer.Title>\n <Drawer.Description>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {subtitle}\n </Typography>\n </Drawer.Description>\n {metadataSubtitle && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {metadataSubtitle}\n </Typography>\n )}\n </Flex>\n );\n};\n\nconst HeaderStatusIcon = styled(Flex)`\n align-self: stretch;\n padding: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => `${theme.borderRadius} 0 0 ${theme.borderRadius}`};\n\n > svg {\n height: 24px;\n width: 24px;\n }\n`;\n\nconst HeaderStatusWrapper = styled(Flex)`\n align-items: center;\n`;\n\ntype HeaderStatusProps = {\n status: 'uploading' | 'success' | 'error' | 'canceled';\n /** Byte-weighted progress, or `null` for a batch that reports no bytes (the URL flow). */\n progress: number | null;\n totalFiles: number;\n successfulCount: number;\n errorCount: number;\n /**\n * Count-based metadata progress, or `null` when no row entered the metadata phase.\n * Shown as an extra subtitle while generation is still in flight.\n */\n metadataProgress: number | null;\n /** Whether any row is still generating — drives whether the subtitle shows at all. */\n isGeneratingMetadata: boolean;\n /**\n * Terminal per-outcome counts, or `null` while the phase is unfinished or was never\n * entered. Replaces the in-flight subtitle once generation settles.\n */\n metadataOutcome: { generated: number; skipped: number; failed: number } | null;\n};\n\nconst HeaderStatus = ({\n status,\n progress,\n totalFiles,\n successfulCount,\n errorCount,\n metadataProgress,\n isGeneratingMetadata,\n metadataOutcome,\n}: HeaderStatusProps) => {\n const { formatMessage } = useIntl();\n\n // Completion is upload-driven, so the terminal header can appear while metadata is\n // still generating — the subtitle keeps ticking underneath until it settles.\n //\n // Gated on work actually being in flight rather than on `progress < 100`: in a\n // sequential batch the percentage touches 100% between files, which would blink the\n // subtitle out and back in on every upload.\n //\n // Once the phase settles the line is not dropped but replaced with the outcome, so the\n // header keeps confirming what happened instead of silently losing the message.\n const metadataSubtitle = (() => {\n if (metadataProgress !== null && isGeneratingMetadata) {\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.generatingMetadata.withCount'),\n defaultMessage: 'Generating metadata with AI ({percentage}%)',\n },\n { percentage: metadataProgress }\n );\n }\n\n if (metadataOutcome === null) {\n return undefined;\n }\n\n // Only `generated` rows had metadata written, so only they can be reported as a\n // success. With none, there is nothing to confirm — an all-skipped batch of\n // non-images would otherwise read as \"generated on 0 files\". Per-row sublines\n // already spell out skipped and failed outcomes.\n if (metadataOutcome.generated === 0) {\n return undefined;\n }\n\n if (metadataOutcome.failed > 0) {\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.metadataGenerated.withFailures'),\n defaultMessage: '{generatedCount} generated, {failedCount} failed',\n },\n { generatedCount: metadataOutcome.generated, failedCount: metadataOutcome.failed }\n );\n }\n\n return formatMessage(\n {\n id: getTranslationKey('upload.progress.metadataGenerated.withCount'),\n defaultMessage:\n '{count, plural, one {Metadata successfully generated on # file} other {Metadata successfully generated on # files}}',\n },\n { count: metadataOutcome.generated }\n );\n })();\n\n if (status === 'error') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"danger200\">\n <Cross fill=\"danger700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.failed'),\n defaultMessage: 'Upload failed',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.failed.subtitle'),\n defaultMessage: 'Please try to upload files again',\n })}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'success') {\n const subtitle =\n errorCount > 0\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle.withErrors'),\n defaultMessage: '{successCount} uploaded, {errorCount} failed',\n },\n { successCount: successfulCount, errorCount }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.success.subtitle'),\n defaultMessage: '{count} files uploaded successfully',\n },\n { count: successfulCount }\n );\n\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"success200\">\n <Check fill=\"success700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.success'),\n defaultMessage: 'Upload successful!',\n })}\n subtitle={subtitle}\n metadataSubtitle={metadataSubtitle}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'canceled') {\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"neutral200\">\n <MinusCircle fill=\"neutral700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage\n title={formatMessage({\n id: getTranslationKey('upload.progress.canceled'),\n defaultMessage: 'Upload canceled',\n })}\n subtitle={formatMessage({\n id: getTranslationKey('upload.progress.canceled.subtitle'),\n defaultMessage: 'Some files were not uploaded',\n })}\n metadataSubtitle={metadataSubtitle}\n />\n </HeaderStatusWrapper>\n );\n }\n\n if (status === 'uploading') {\n // Two separate strings so a locale can position (or omit) the percentage itself.\n const title =\n progress === null\n ? formatMessage(\n {\n id: getTranslationKey('upload.progress.uploading.indeterminate'),\n defaultMessage: 'Uploading {total, plural, one {# item} other {# items}}',\n },\n { total: totalFiles }\n )\n : formatMessage(\n {\n id: getTranslationKey('upload.progress.uploading.withCount'),\n defaultMessage:\n 'Uploading {total, plural, one {# item} other {# items}} ({percentage}%)',\n },\n {\n total: totalFiles,\n percentage: Math.round(progress),\n }\n );\n\n return (\n <HeaderStatusWrapper>\n <HeaderStatusIcon background=\"primary200\">\n <Upload fill=\"primary700\" />\n </HeaderStatusIcon>\n <HeaderStatusMessage title={title} metadataSubtitle={metadataSubtitle} />\n </HeaderStatusWrapper>\n );\n }\n\n return null;\n};\n\nconst HeaderIconButton = styled(IconButton)`\n &:hover {\n background: transparent;\n }\n`;\n\nconst ChevronWrapper = styled.span<{ $isMinimized: boolean }>`\n display: flex;\n transition: transform 0.5s ease-in-out;\n transform: ${({ $isMinimized }) => ($isMinimized ? 'rotate(180deg)' : 'rotate(0deg)')};\n`;\n\nconst HEADER_COLOR_MAP = {\n uploading: { background: 'primary100' },\n canceled: { background: 'neutral100' },\n success: { background: 'success100' },\n error: { background: 'danger100' },\n} as const;\n\nconst DialogHeader = ({ handleClose }: { handleClose: () => void }) => {\n const { formatMessage } = useIntl();\n\n const { isMinimized, files, uploadId, totalFiles } = useTypedSelector(\n (state) => state.uploadProgress\n );\n const aggregateProgress = useTypedSelector(selectAggregateProgress);\n const reportsByteProgress = useTypedSelector(selectReportsByteProgress);\n const countBasedProgress = useTypedSelector(selectCountBasedProgress);\n // Byte-weighted when the flow streams bytes (direct-file), else count-based (settled/total).\n // Both return `null` for an indeterminate header when there's nothing to show yet.\n const progress = reportsByteProgress ? aggregateProgress : countBasedProgress;\n const metadataProgress = useTypedSelector(selectMetadataProgress);\n const isGeneratingMetadata = useTypedSelector(selectIsGeneratingMetadata);\n const metadataOutcome = useTypedSelector(selectMetadataOutcome);\n const dispatch = useTypedDispatch();\n const [retryCancelledFiles] = useRetryCancelledFilesMutation();\n\n // The batch is complete once every file has reached a terminal state. Byte-weighted\n // progress can't be used here because errored/cancelled rows never reach 100%.\n const isComplete =\n files.length > 0 &&\n files.every((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled');\n const isAllUploaded = isComplete;\n const isAllErrored = isComplete && files.every((f) => f.status === 'error');\n const hasCancelledFiles = files.some((f) => f.status === 'cancelled');\n const successfulCount = files.filter((f) => f.status === 'complete').length;\n const errorCount = files.filter((f) => f.status === 'error').length;\n // Success includes partial success (some files succeeded, even if some failed)\n const isSuccess = isComplete && successfulCount > 0 && !hasCancelledFiles;\n const status = ((): HeaderStatusProps['status'] => {\n if (isAllErrored) return 'error';\n if (isSuccess) return 'success';\n if (hasCancelledFiles) return 'canceled';\n\n return 'uploading';\n })();\n\n const handleCancel = () => {\n abortUpload(uploadId);\n dispatch(cancelUpload());\n };\n\n const handleRetry = async () => {\n try {\n await retryCancelledFiles().unwrap();\n } catch {\n // Error is already dispatched to store from the API queryFn\n }\n };\n\n const handleToggleMinimize = () => {\n dispatch(toggleMinimize());\n };\n\n return (\n <Flex\n background={HEADER_COLOR_MAP[status].background}\n justifyContent=\"space-between\"\n margin={1}\n hasRadius\n >\n <HeaderStatus\n status={status}\n progress={progress}\n totalFiles={totalFiles}\n successfulCount={successfulCount}\n errorCount={errorCount}\n metadataProgress={metadataProgress}\n isGeneratingMetadata={isGeneratingMetadata}\n metadataOutcome={metadataOutcome}\n />\n <Flex gap={1}>\n {!isAllUploaded && (\n <TextButton onClick={handleCancel} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.cancel'),\n defaultMessage: 'Cancel all',\n })}\n </TextButton>\n )}\n {hasCancelledFiles && (\n <TextButton onClick={handleRetry} fontWeight=\"bold\">\n {formatMessage({\n id: getTranslationKey('upload.progress.retry'),\n defaultMessage: 'Retry',\n })}\n </TextButton>\n )}\n <HeaderIconButton\n onClick={handleToggleMinimize}\n label={formatMessage({\n id: getTranslationKey(\n isMinimized ? 'upload.progress.maximize' : 'upload.progress.minimize'\n ),\n defaultMessage: isMinimized ? 'Maximize' : 'Minimize',\n })}\n variant=\"ghost\"\n >\n <ChevronWrapper $isMinimized={isMinimized}>\n <ChevronDown />\n </ChevronWrapper>\n </HeaderIconButton>\n {isComplete && (\n <Drawer.CloseButton\n onClose={handleClose}\n label={formatMessage({\n id: getTranslationKey('upload.progress.close'),\n defaultMessage: 'Close',\n })}\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadProgressDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProgressTrack = styled.div`\n width: 100%;\n height: ${({ theme }) => theme.spaces[1]};\n background-color: ${({ theme }) => theme.colors.neutral200};\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst ProgressIndicator = styled.div<{ $percent: number }>`\n height: 100%;\n width: ${({ $percent }) => $percent}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n transition: width 0.15s linear;\n`;\n\nconst DeterminateBar = ({ percent }: { percent: number }) => {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={clamped}>\n <ProgressIndicator $percent={clamped} />\n </ProgressTrack>\n );\n};\n\nconst INDETERMINATE_INDICATOR_WIDTH = 40;\n\n/**\n * `translateX` percentages resolve against the *indicator's* own width, not the track's.\n * So -100% is exactly \"fully off the left edge\" regardless of the width above, and the\n * end offset converts a full track width into those same own-width units. Both ends sit\n * flush off-track, which keeps entry and exit symmetric — a smaller start offset would\n * make the bar pop in already partly visible.\n */\nconst indeterminateSlide = keyframes`\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(${(100 / INDETERMINATE_INDICATOR_WIDTH) * 100}%);\n }\n`;\n\nconst IndeterminateIndicator = styled.div`\n height: 100%;\n width: ${INDETERMINATE_INDICATOR_WIDTH}%;\n background-color: ${({ theme }) => theme.colors.primary700};\n border-radius: 4px;\n /* Linear, not an eased curve: the DS easings decelerate to a stop, which on a loop\n reads as a stall at the wrap point. Constant speed is what makes it read as a sweep. */\n animation: ${indeterminateSlide} 1.2s linear infinite;\n\n /* A perpetually moving bar is a vestibular trigger; fall back to a static track fill. */\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n width: 100%;\n opacity: 0.5;\n }\n`;\n\n/**\n * Progress bar for work whose completion fraction is genuinely unknowable, rather\n * than merely unknown-yet: the AI metadata endpoint answers in one go, and the URL\n * flow can't report bytes until the server has fetched the file and knows its size.\n *\n * Deliberately omits `aria-valuenow` — that absence is precisely how ARIA conveys\n * an indeterminate progressbar, so assistive tech announces \"busy\" instead of \"0%\".\n */\nconst IndeterminateBar = () => {\n return (\n <ProgressTrack role=\"progressbar\" aria-valuemin={0} aria-valuemax={100}>\n <IndeterminateIndicator />\n </ProgressTrack>\n );\n};\n\n/**\n * Without a floor of zero the row is as wide as its longest filename, which\n * pushes past the panel and gives the dialog a second, horizontal scrollbar\n * instead of truncating.\n *\n * The floor belongs to the name alone: the icon carries its size in SVG\n * attributes, which flex is free to override, so letting it shrink squashes it\n * against a long name instead of truncating the name.\n */\nconst FileRowName = styled(Flex)`\n min-width: 0;\n\n > :first-child {\n flex-shrink: 0;\n }\n\n > :last-child {\n min-width: 0;\n }\n`;\n\nconst FileRow = ({\n icon,\n fileName,\n children,\n}: {\n icon: React.ReactNode;\n fileName: string;\n children: React.ReactNode;\n}) => {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" justifyContent=\"center\" gap={1} width=\"100%\">\n <FileRowName gap={2}>\n {icon}\n <TruncatedText variant=\"omega\" fontWeight=\"semiBold\">\n {fileName}\n </TruncatedText>\n </FileRowName>\n {children}\n </Flex>\n );\n};\n\n/**\n * Icon + subline for a successfully uploaded row, keyed by its metadata phase.\n * `'none'` covers rows that never entered the phase — AI metadata disabled — and\n * renders exactly as before this feature existed. Non-images do enter the phase and\n * land on `skipped`.\n *\n * `skipped` uses a neutral `Information` icon, deliberately distinct from\n * generated/failed/cancelled — skipping is an expected outcome for a non-image, not a\n * problem to flag.\n */\nconst COMPLETED_ROW_PRESENTATION: Record<\n FileMetadataStatus | 'none',\n { icon: React.ReactNode; message: MessageDescriptor }\n> = {\n none: {\n icon: <CheckCircle fill=\"success500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.uploaded'),\n defaultMessage: 'Uploaded',\n },\n },\n generating: {\n icon: <Sparkle fill=\"primary600\" />,\n message: {\n id: getTranslationKey('upload.progress.file.generatingMetadata'),\n defaultMessage: 'Uploaded • Generating metadata…',\n },\n },\n generated: {\n icon: <CheckCircle fill=\"success500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataGenerated'),\n defaultMessage: 'Uploaded • Metadata generated',\n },\n },\n skipped: {\n icon: <Information fill=\"neutral500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataSkipped'),\n defaultMessage: 'Upload complete • Metadata generation skipped',\n },\n },\n failed: {\n icon: <WarningCircle fill=\"warning500\" />,\n message: {\n id: getTranslationKey('upload.progress.file.metadataFailed'),\n defaultMessage: 'Upload complete • Metadata generation failed',\n },\n },\n};\n\nconst FileRowRenderer = ({ file }: { file: FileProgress }) => {\n const { formatMessage } = useIntl();\n const isError = file.status === 'error';\n const isCurrentFile = file.status === 'uploading';\n const isCompleted = file.status === 'complete';\n const isCancelled = file.status === 'cancelled';\n const isQueued = file.status === 'pending';\n\n if (isQueued) {\n // No bar: there is nothing to report yet, and an indeterminate bar would read\n // as \"in progress\" on a file the pool has not picked up.\n return (\n <FileRow icon={<Clock fill=\"neutral600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.queued'),\n defaultMessage: 'Queued',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCurrentFile) {\n // Determinate only once bytes are actually being reported — a known `size` is not\n // enough. The two upload flows differ here:\n // - the direct-file flow streams real byte counts from XHR, so `uploadedBytes`\n // climbs and a determinate bar is meaningful;\n // - the URL flow learns the size from the `file:uploading` SSE event but receives\n // no incremental counts at all (the next event is `file:complete`), so\n // `uploadedBytes` stays 0 for the whole transfer.\n // Keying off `size` alone froze URL rows at a determinate 0% for the entire upload;\n // keying off reported bytes keeps them animating until there is a fraction to show.\n const hasReportedProgress = file.size > 0 && file.uploadedBytes > 0;\n\n return (\n <FileRow icon={<ArrowsCounterClockwise fill=\"secondary600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.uploading'),\n defaultMessage: 'Uploading...',\n })}\n </Typography>\n {hasReportedProgress ? (\n <DeterminateBar percent={(file.uploadedBytes / file.size) * 100} />\n ) : (\n <IndeterminateBar />\n )}\n </FileRow>\n );\n }\n\n if (isError) {\n return (\n <FileRow icon={<CrossCircle fill=\"danger500\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {file.error\n ? /**\n * The server may return a machine-readable code (e.g. `FileTooBig` from the\n * body middleware) or an already human-readable sentence (e.g. the upload\n * plugin's size-limit message). Translate the former, fall back to the latter.\n */\n formatMessage({\n id: getTranslationKey(`apiError.${file.error}`),\n defaultMessage: file.error,\n })\n : formatMessage({\n id: getTranslationKey('upload.generic-error'),\n defaultMessage: 'An error occurred while uploading the file.',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCancelled) {\n return (\n <FileRow icon={<MinusCircle fill=\"neutral600\" />} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('upload.progress.file.canceled'),\n defaultMessage: 'Canceled',\n })}\n </Typography>\n </FileRow>\n );\n }\n\n if (isCompleted) {\n // The upload succeeded; the metadata phase (if any) drives both the icon and the\n // subline from here on — a metadata failure shows a warning, not an upload error.\n const { icon, message } = COMPLETED_ROW_PRESENTATION[file.metadataStatus ?? 'none'];\n\n return (\n <FileRow icon={icon} fileName={file.name}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(message)}\n </Typography>\n {/* Generation has no intermediate progress to report, so the bar stays indeterminate. */}\n {file.metadataStatus === 'generating' && <IndeterminateBar />}\n </FileRow>\n );\n }\n\n return null;\n};\n\nconst CompletedFilesList = styled(Flex)`\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n`;\n\nexport const UploadProgressDialog = () => {\n const dispatch = useTypedDispatch();\n const { isVisible, isMinimized, files } = useTypedSelector((state) => state.uploadProgress);\n\n // With concurrent uploads several files are `uploading` at once — render every\n // in-flight row, not just the first (a `find` here dated to the strictly\n // sequential era and hid all but the lowest-index worker's row).\n const uploadingFiles = files.filter((f) => f.status === 'uploading');\n // Everything the pool has not reached yet. Listed in queue order, which is the\n // order `files` is already in, so a row's position tells the user where it sits.\n const queuedFiles = files.filter((f) => f.status === 'pending');\n const completedFiles = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .sort((a, b) => {\n // Sort priority: error > cancelled > complete\n const priority: Record<FileProgressStatus, number> = {\n error: 0,\n cancelled: 1,\n complete: 2,\n uploading: 3,\n pending: 4,\n };\n return priority[a.status] - priority[b.status];\n });\n\n const handleClose = () => {\n dispatch(closeUploadProgress());\n };\n\n return (\n <Drawer.Root isVisible={isVisible} onClose={handleClose}>\n <Drawer.Body animationDirection=\"up\" width=\"41.6rem\" maxHeight=\"34.2rem\">\n <DialogHeader handleClose={handleClose} />\n <Drawer.ScrollableContent isContentExpanded={!isMinimized}>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n >\n {uploadingFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n\n {queuedFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n\n {completedFiles.length > 0 && (\n <CompletedFilesList>\n {completedFiles.map((file) => (\n <FileRowRenderer key={file.index} file={file} />\n ))}\n </CompletedFilesList>\n )}\n </Flex>\n </Drawer.ScrollableContent>\n </Drawer.Body>\n </Drawer.Root>\n );\n};\n"],"names":["HeaderStatusMessage","title","subtitle","metadataSubtitle","_jsxs","Flex","direction","alignItems","paddingLeft","paddingRight","paddingTop","paddingBottom","_jsx","Drawer","Title","Typography","variant","Description","textColor","HeaderStatusIcon","styled","theme","spaces","borderRadius","HeaderStatusWrapper","HeaderStatus","status","progress","totalFiles","successfulCount","errorCount","metadataProgress","isGeneratingMetadata","metadataOutcome","formatMessage","useIntl","id","getTranslationKey","defaultMessage","percentage","undefined","generated","failed","generatedCount","failedCount","count","background","Cross","fill","successCount","Check","MinusCircle","total","Math","round","Upload","HeaderIconButton","IconButton","ChevronWrapper","span","$isMinimized","HEADER_COLOR_MAP","uploading","canceled","success","error","DialogHeader","handleClose","isMinimized","files","uploadId","useTypedSelector","state","uploadProgress","aggregateProgress","selectAggregateProgress","reportsByteProgress","selectReportsByteProgress","countBasedProgress","selectCountBasedProgress","selectMetadataProgress","selectIsGeneratingMetadata","selectMetadataOutcome","dispatch","useTypedDispatch","retryCancelledFiles","useRetryCancelledFilesMutation","isComplete","length","every","f","isAllUploaded","isAllErrored","hasCancelledFiles","some","filter","isSuccess","handleCancel","abortUpload","cancelUpload","handleRetry","unwrap","handleToggleMinimize","toggleMinimize","justifyContent","margin","hasRadius","gap","TextButton","onClick","fontWeight","label","ChevronDown","CloseButton","onClose","ProgressTrack","div","colors","neutral200","ProgressIndicator","$percent","primary700","DeterminateBar","percent","clamped","min","max","role","aria-valuemin","aria-valuemax","aria-valuenow","INDETERMINATE_INDICATOR_WIDTH","indeterminateSlide","keyframes","IndeterminateIndicator","IndeterminateBar","FileRowName","FileRow","icon","fileName","children","width","TruncatedText","COMPLETED_ROW_PRESENTATION","none","CheckCircle","message","generating","Sparkle","skipped","Information","WarningCircle","FileRowRenderer","file","isError","isCurrentFile","isCompleted","isCancelled","isQueued","Clock","name","hasReportedProgress","size","uploadedBytes","ArrowsCounterClockwise","CrossCircle","metadataStatus","CompletedFilesList","UploadProgressDialog","isVisible","uploadingFiles","queuedFiles","completedFiles","sort","a","b","priority","cancelled","complete","pending","closeUploadProgress","Root","Body","animationDirection","maxHeight","ScrollableContent","isContentExpanded","map","index"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var reactIntl = require('react-intl');
5
+ var getApiErrorMessage = require('../utils/getApiErrorMessage.js');
6
+ var translations = require('../utils/translations.js');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ /**
29
+ * Turns an API error into something displayable, falling back to the caller's
30
+ * own localized copy when the error carries nothing usable.
31
+ *
32
+ * The server sends either a bare code (`body.ts`'s `FileTooBig`) or a ready-made
33
+ * sentence, and the same button can produce either. A code with a
34
+ * `upload.apiError.*` entry resolves to it; anything else is returned untouched.
35
+ *
36
+ * Checking `messages` rather than passing the text as `defaultMessage` keeps
37
+ * untrusted server text away from the ICU parser, where a stray `{` (a
38
+ * validation message echoing a field name) fails to parse — silent in
39
+ * production, but a throw under Jest, which patches `console.error`.
40
+ *
41
+ * Memoized because consumers hold the result in their own `useCallback`
42
+ * dependency arrays.
43
+ */ const useApiErrorMessage = ()=>{
44
+ const { formatMessage, messages } = reactIntl.useIntl();
45
+ return React__namespace.useCallback((error, fallback)=>{
46
+ const message = getApiErrorMessage.getApiErrorMessage(error);
47
+ if (!message) {
48
+ return fallback;
49
+ }
50
+ const id = translations.getTranslationKey(`apiError.${message}`);
51
+ return messages[id] ? formatMessage({
52
+ id
53
+ }) : message;
54
+ }, [
55
+ formatMessage,
56
+ messages
57
+ ]);
58
+ };
59
+
60
+ exports.useApiErrorMessage = useApiErrorMessage;
61
+ //# sourceMappingURL=useApiErrorMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApiErrorMessage.js","sources":["../../../../admin/src/future/hooks/useApiErrorMessage.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getApiErrorMessage } from '../utils/getApiErrorMessage';\nimport { getTranslationKey } from '../utils/translations';\n\n/**\n * Turns an API error into something displayable, falling back to the caller's\n * own localized copy when the error carries nothing usable.\n *\n * The server sends either a bare code (`body.ts`'s `FileTooBig`) or a ready-made\n * sentence, and the same button can produce either. A code with a\n * `upload.apiError.*` entry resolves to it; anything else is returned untouched.\n *\n * Checking `messages` rather than passing the text as `defaultMessage` keeps\n * untrusted server text away from the ICU parser, where a stray `{` (a\n * validation message echoing a field name) fails to parse — silent in\n * production, but a throw under Jest, which patches `console.error`.\n *\n * Memoized because consumers hold the result in their own `useCallback`\n * dependency arrays.\n */\nexport const useApiErrorMessage = () => {\n const { formatMessage, messages } = useIntl();\n\n return React.useCallback(\n (error: unknown, fallback: string) => {\n const message = getApiErrorMessage(error);\n\n if (!message) {\n return fallback;\n }\n\n const id = getTranslationKey(`apiError.${message}`);\n\n return messages[id] ? formatMessage({ id }) : message;\n },\n [formatMessage, messages]\n );\n};\n"],"names":["useApiErrorMessage","formatMessage","messages","useIntl","React","useCallback","error","fallback","message","getApiErrorMessage","id","getTranslationKey"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;;;;;;;;;;;;;;;UAgBaA,kBAAAA,GAAqB,IAAA;AAChC,IAAA,MAAM,EAAEC,aAAa,EAAEC,QAAQ,EAAE,GAAGC,iBAAAA,EAAAA;AAEpC,IAAA,OAAOC,gBAAAA,CAAMC,WAAW,CACtB,CAACC,KAAAA,EAAgBC,QAAAA,GAAAA;AACf,QAAA,MAAMC,UAAUC,qCAAAA,CAAmBH,KAAAA,CAAAA;AAEnC,QAAA,IAAI,CAACE,OAAAA,EAAS;YACZ,OAAOD,QAAAA;AACT,QAAA;AAEA,QAAA,MAAMG,EAAAA,GAAKC,8BAAAA,CAAkB,CAAC,SAAS,EAAEH,OAAAA,CAAAA,CAAS,CAAA;AAElD,QAAA,OAAON,QAAQ,CAACQ,EAAAA,CAAG,GAAGT,aAAAA,CAAc;AAAES,YAAAA;SAAG,CAAA,GAAKF,OAAAA;IAChD,CAAA,EACA;AAACP,QAAAA,aAAAA;AAAeC,QAAAA;AAAS,KAAA,CAAA;AAE7B;;;;"}
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { getApiErrorMessage } from '../utils/getApiErrorMessage.mjs';
4
+ import { getTranslationKey } from '../utils/translations.mjs';
5
+
6
+ /**
7
+ * Turns an API error into something displayable, falling back to the caller's
8
+ * own localized copy when the error carries nothing usable.
9
+ *
10
+ * The server sends either a bare code (`body.ts`'s `FileTooBig`) or a ready-made
11
+ * sentence, and the same button can produce either. A code with a
12
+ * `upload.apiError.*` entry resolves to it; anything else is returned untouched.
13
+ *
14
+ * Checking `messages` rather than passing the text as `defaultMessage` keeps
15
+ * untrusted server text away from the ICU parser, where a stray `{` (a
16
+ * validation message echoing a field name) fails to parse — silent in
17
+ * production, but a throw under Jest, which patches `console.error`.
18
+ *
19
+ * Memoized because consumers hold the result in their own `useCallback`
20
+ * dependency arrays.
21
+ */ const useApiErrorMessage = ()=>{
22
+ const { formatMessage, messages } = useIntl();
23
+ return React.useCallback((error, fallback)=>{
24
+ const message = getApiErrorMessage(error);
25
+ if (!message) {
26
+ return fallback;
27
+ }
28
+ const id = getTranslationKey(`apiError.${message}`);
29
+ return messages[id] ? formatMessage({
30
+ id
31
+ }) : message;
32
+ }, [
33
+ formatMessage,
34
+ messages
35
+ ]);
36
+ };
37
+
38
+ export { useApiErrorMessage };
39
+ //# sourceMappingURL=useApiErrorMessage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApiErrorMessage.mjs","sources":["../../../../admin/src/future/hooks/useApiErrorMessage.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getApiErrorMessage } from '../utils/getApiErrorMessage';\nimport { getTranslationKey } from '../utils/translations';\n\n/**\n * Turns an API error into something displayable, falling back to the caller's\n * own localized copy when the error carries nothing usable.\n *\n * The server sends either a bare code (`body.ts`'s `FileTooBig`) or a ready-made\n * sentence, and the same button can produce either. A code with a\n * `upload.apiError.*` entry resolves to it; anything else is returned untouched.\n *\n * Checking `messages` rather than passing the text as `defaultMessage` keeps\n * untrusted server text away from the ICU parser, where a stray `{` (a\n * validation message echoing a field name) fails to parse — silent in\n * production, but a throw under Jest, which patches `console.error`.\n *\n * Memoized because consumers hold the result in their own `useCallback`\n * dependency arrays.\n */\nexport const useApiErrorMessage = () => {\n const { formatMessage, messages } = useIntl();\n\n return React.useCallback(\n (error: unknown, fallback: string) => {\n const message = getApiErrorMessage(error);\n\n if (!message) {\n return fallback;\n }\n\n const id = getTranslationKey(`apiError.${message}`);\n\n return messages[id] ? formatMessage({ id }) : message;\n },\n [formatMessage, messages]\n );\n};\n"],"names":["useApiErrorMessage","formatMessage","messages","useIntl","React","useCallback","error","fallback","message","getApiErrorMessage","id","getTranslationKey"],"mappings":";;;;;AAOA;;;;;;;;;;;;;;;UAgBaA,kBAAAA,GAAqB,IAAA;AAChC,IAAA,MAAM,EAAEC,aAAa,EAAEC,QAAQ,EAAE,GAAGC,OAAAA,EAAAA;AAEpC,IAAA,OAAOC,KAAAA,CAAMC,WAAW,CACtB,CAACC,KAAAA,EAAgBC,QAAAA,GAAAA;AACf,QAAA,MAAMC,UAAUC,kBAAAA,CAAmBH,KAAAA,CAAAA;AAEnC,QAAA,IAAI,CAACE,OAAAA,EAAS;YACZ,OAAOD,QAAAA;AACT,QAAA;AAEA,QAAA,MAAMG,EAAAA,GAAKC,iBAAAA,CAAkB,CAAC,SAAS,EAAEH,OAAAA,CAAAA,CAAS,CAAA;AAElD,QAAA,OAAON,QAAQ,CAACQ,EAAAA,CAAG,GAAGT,aAAAA,CAAc;AAAES,YAAAA;SAAG,CAAA,GAAKF,OAAAA;IAChD,CAAA,EACA;AAACP,QAAAA,aAAAA;AAAeC,QAAAA;AAAS,KAAA,CAAA;AAE7B;;;;"}
@@ -46,6 +46,7 @@ var useListSort = require('./hooks/useListSort.js');
46
46
  var buildAssetFilters = require('./utils/buildAssetFilters.js');
47
47
  var listQueryKey = require('./utils/listQueryKey.js');
48
48
  var mergeMixedList = require('./utils/mergeMixedList.js');
49
+ var renderedKeys = require('./utils/renderedKeys.js');
49
50
 
50
51
  function _interopNamespace(e) {
51
52
  if (e && e.__esModule) return e;
@@ -127,6 +128,13 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
127
128
  assetsSort,
128
129
  hasNextPage
129
130
  ]);
131
+ // Derived once here so the table, the grid and the bulk bar all agree on what
132
+ // is on screen — in mixed mode that is not simply every folder.
133
+ const renderedKeys$1 = renderedKeys.buildRenderedKeys({
134
+ folders,
135
+ assets,
136
+ mixedItems
137
+ });
130
138
  const loadMoreRef = useInfiniteScrollSentinel.useInfiniteScrollSentinel({
131
139
  hasNextPage,
132
140
  isFetchingMore,
@@ -174,11 +182,13 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
174
182
  isGridView ? /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
175
183
  folders: folders,
176
184
  assets: assets,
185
+ renderedKeys: renderedKeys$1,
177
186
  onAssetItemClick: onAssetItemClick
178
187
  }) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
179
188
  assets: assets,
180
189
  folders: folders,
181
190
  mixedItems: mixedItems,
191
+ renderedKeys: renderedKeys$1,
182
192
  onAssetItemClick: onAssetItemClick
183
193
  }),
184
194
  /*#__PURE__*/ jsxRuntime.jsx("div", {
@@ -199,6 +209,7 @@ const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets,
199
209
  }),
200
210
  /*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {
201
211
  assets: assets,
212
+ renderedKeys: renderedKeys$1,
202
213
  locations: locations
203
214
  })
204
215
  ]