@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.
- package/dist/admin/components/AssetCard/AssetCard.js +1 -0
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js +1 -0
- package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs +1 -0
- package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js +1 -0
- package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs +1 -0
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +1 -0
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +1 -0
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +1 -0
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +1 -0
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +1 -0
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +1 -0
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +1 -0
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +1 -0
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +1 -0
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +1 -0
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterList.js +2 -2
- package/dist/admin/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/components/FilterList/FilterList.mjs +2 -2
- package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.js +4 -4
- package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.mjs +4 -4
- package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +1 -0
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +4 -10
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +4 -10
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js +1 -0
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs +1 -0
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js +1 -0
- package/dist/admin/components/TableList/CellContent.js.map +1 -1
- package/dist/admin/components/TableList/CellContent.mjs +1 -0
- package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.js +1 -0
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +1 -0
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +1 -0
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -0
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js +1 -0
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs +1 -0
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +9 -21
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +9 -21
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +1 -0
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +1 -0
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/constants.js +1 -0
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs +1 -0
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +11 -0
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +11 -0
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +82 -13
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +84 -15
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/hooks/useApiErrorMessage.js +61 -0
- package/dist/admin/future/hooks/useApiErrorMessage.js.map +1 -0
- package/dist/admin/future/hooks/useApiErrorMessage.mjs +39 -0
- package/dist/admin/future/hooks/useApiErrorMessage.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +11 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +11 -0
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +8 -6
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +8 -6
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +70 -59
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +72 -61
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +7 -5
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +7 -5
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +47 -28
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +48 -29
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +87 -2
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +89 -4
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +3 -2
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +3 -2
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +4 -2
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +4 -2
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +21 -3
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +21 -3
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +4 -3
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +5 -4
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -2
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -2
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js +30 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +26 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js +5 -5
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +6 -6
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListSort.js +10 -10
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +11 -11
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js +86 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs +83 -0
- package/dist/admin/future/pages/Assets/utils/mergeUploadedAssets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.js +19 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs +17 -0
- package/dist/admin/future/pages/Assets/utils/renderedKeys.mjs.map +1 -0
- package/dist/admin/future/services/api.js +131 -13
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +133 -15
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.js +9 -3
- package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.mjs +9 -3
- package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +98 -6
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +94 -7
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/getApiErrorMessage.js +20 -0
- package/dist/admin/future/utils/getApiErrorMessage.js.map +1 -0
- package/dist/admin/future/utils/getApiErrorMessage.mjs +18 -0
- package/dist/admin/future/utils/getApiErrorMessage.mjs.map +1 -0
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +1 -0
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.js +7 -9
- package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.mjs +8 -10
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.js +1 -0
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.mjs +1 -0
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js +1 -0
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs +1 -0
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
- package/dist/admin/pages/App/components/Filters.js +8 -8
- package/dist/admin/pages/App/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/components/Filters.mjs +9 -9
- package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/App/components/Header.js +1 -1
- package/dist/admin/pages/App/components/Header.js.map +1 -1
- package/dist/admin/pages/App/components/Header.mjs +2 -2
- package/dist/admin/pages/App/components/Header.mjs.map +1 -1
- package/dist/admin/src/future/hooks/useApiErrorMessage.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +4 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +4 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +18 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeUploadedAssets.d.ts +35 -0
- package/dist/admin/src/future/pages/Assets/utils/renderedKeys.d.ts +19 -0
- package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +6 -1
- package/dist/admin/src/future/store/uploadProgress.d.ts +67 -1
- package/dist/admin/src/future/utils/getApiErrorMessage.d.ts +1 -0
- package/dist/admin/src/utils/index.d.ts +1 -0
- package/dist/admin/src/utils/rawFileToAsset.d.ts +2 -2
- package/dist/admin/src/utils/resolveFileMime.d.ts +13 -0
- package/dist/admin/translations/ca.json.js +1 -1
- package/dist/admin/translations/ca.json.mjs +1 -1
- package/dist/admin/translations/de.json.js +1 -1
- package/dist/admin/translations/de.json.mjs +1 -1
- package/dist/admin/translations/en.json.js +6 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +6 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/fr.json.js +1 -1
- package/dist/admin/translations/fr.json.mjs +1 -1
- package/dist/admin/translations/ja.json.js +1 -1
- package/dist/admin/translations/ja.json.mjs +1 -1
- package/dist/admin/translations/ko.json.js +1 -1
- package/dist/admin/translations/ko.json.mjs +1 -1
- package/dist/admin/translations/nl.json.js +1 -1
- package/dist/admin/translations/nl.json.mjs +1 -1
- package/dist/admin/translations/pl.json.js +1 -1
- package/dist/admin/translations/pl.json.mjs +1 -1
- package/dist/admin/translations/pt-BR.json.js +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +1 -1
- package/dist/admin/translations/ru.json.js +1 -1
- package/dist/admin/translations/ru.json.mjs +1 -1
- package/dist/admin/translations/sk.json.js +1 -1
- package/dist/admin/translations/sk.json.mjs +1 -1
- package/dist/admin/translations/tr.json.js +1 -1
- package/dist/admin/translations/tr.json.mjs +1 -1
- package/dist/admin/translations/uk.json.js +1 -1
- package/dist/admin/translations/uk.json.mjs +1 -1
- package/dist/admin/translations/zh-Hans.json.js +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +1 -1
- package/dist/admin/translations/zh.json.js +1 -1
- package/dist/admin/translations/zh.json.mjs +1 -1
- package/dist/admin/utils/getFolderURL.js +2 -1
- package/dist/admin/utils/getFolderURL.js.map +1 -1
- package/dist/admin/utils/getFolderURL.mjs +2 -1
- package/dist/admin/utils/getFolderURL.mjs.map +1 -1
- package/dist/admin/utils/rawFileToAsset.js +5 -3
- package/dist/admin/utils/rawFileToAsset.js.map +1 -1
- package/dist/admin/utils/rawFileToAsset.mjs +5 -3
- package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
- package/dist/admin/utils/resolveFileMime.js +69 -0
- package/dist/admin/utils/resolveFileMime.js.map +1 -0
- package/dist/admin/utils/resolveFileMime.mjs +64 -0
- package/dist/admin/utils/resolveFileMime.mjs.map +1 -0
- package/dist/admin/utils/urlsToAssets.js +8 -4
- package/dist/admin/utils/urlsToAssets.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.mjs +8 -4
- package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js +25 -5
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/upload.js +4 -0
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +4 -0
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/admin/future/utils/getBulkMoveErrorMessage.js +0 -23
- package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +0 -1
- package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +0 -21
- package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +0 -1
- package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merges just-uploaded assets into the loaded asset list so each one appears as
|
|
3
|
+
* soon as its own upload finishes, rather than when the whole batch settles.
|
|
4
|
+
*
|
|
5
|
+
* The upload is one mutation per batch, so its cache invalidation fires once at
|
|
6
|
+
* the end. These helpers bridge that gap purely client-side: the completed
|
|
7
|
+
* uploads already sit in the progress store as full `File` objects, so they can
|
|
8
|
+
* be placed into the list at their sort position with no extra request.
|
|
9
|
+
*
|
|
10
|
+
* The server list stays authoritative — merging never reorders it, and an id it
|
|
11
|
+
* already contains wins over the local copy, so the end-of-batch refetch
|
|
12
|
+
* silently takes over.
|
|
13
|
+
*/ const SORT_FIELDS = [
|
|
14
|
+
'createdAt',
|
|
15
|
+
'updatedAt',
|
|
16
|
+
'name',
|
|
17
|
+
'size'
|
|
18
|
+
];
|
|
19
|
+
const isSortField = (value)=>SORT_FIELDS.includes(value);
|
|
20
|
+
const DEFAULT_RULE = 'updatedAt:DESC';
|
|
21
|
+
const compareByField = (field, a, b)=>{
|
|
22
|
+
if (field === 'size') {
|
|
23
|
+
return (a.size ?? 0) - (b.size ?? 0);
|
|
24
|
+
}
|
|
25
|
+
if (field === 'name') {
|
|
26
|
+
return a.name.localeCompare(b.name);
|
|
27
|
+
}
|
|
28
|
+
// `createdAt` / `updatedAt` are ISO-8601, which sorts correctly as text.
|
|
29
|
+
return (a[field] ?? '').localeCompare(b[field] ?? '');
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Comparator matching a `<field>:<ASC|DESC>` sort rule, as sent to the API.
|
|
33
|
+
*
|
|
34
|
+
* Ties break on id so the order is total: without it, two files sharing a
|
|
35
|
+
* timestamp could swap places between renders.
|
|
36
|
+
*/ const getAssetComparator = (rule = DEFAULT_RULE)=>{
|
|
37
|
+
const [field, requestedDirection] = rule.split(':');
|
|
38
|
+
// An unrecognised field discards the direction too: half-applying a rule we
|
|
39
|
+
// cannot read would order the list differently from the default it stands in for.
|
|
40
|
+
const isKnownField = isSortField(field);
|
|
41
|
+
const sortField = isKnownField ? field : 'updatedAt';
|
|
42
|
+
const direction = isKnownField ? requestedDirection : 'DESC';
|
|
43
|
+
const sign = direction === 'ASC' ? 1 : -1;
|
|
44
|
+
return (a, b)=>{
|
|
45
|
+
const byField = compareByField(sortField, a, b);
|
|
46
|
+
return byField !== 0 ? sign * byField : sign * (a.id - b.id);
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Places `uploaded` into `assets` at their sort position.
|
|
51
|
+
*
|
|
52
|
+
* An upload that sorts past everything loaded is dropped unless the list is
|
|
53
|
+
* fully loaded: it belongs on a page the user has not reached, and appending it
|
|
54
|
+
* would show it adjacent to the last loaded item instead of at its real place.
|
|
55
|
+
*/ const mergeUploadedAssets = ({ assets, uploaded, sort, hasNextPage })=>{
|
|
56
|
+
if (uploaded.length === 0) {
|
|
57
|
+
return assets;
|
|
58
|
+
}
|
|
59
|
+
const loadedIds = new Set(assets.map((asset)=>asset.id));
|
|
60
|
+
const compare = getAssetComparator(sort);
|
|
61
|
+
const fresh = uploaded.filter((asset)=>!loadedIds.has(asset.id)).sort(compare);
|
|
62
|
+
if (fresh.length === 0) {
|
|
63
|
+
return assets;
|
|
64
|
+
}
|
|
65
|
+
const merged = [
|
|
66
|
+
...assets
|
|
67
|
+
];
|
|
68
|
+
for (const asset of fresh){
|
|
69
|
+
const at = merged.findIndex((loaded)=>compare(asset, loaded) < 0);
|
|
70
|
+
if (at === -1) {
|
|
71
|
+
if (hasNextPage) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
merged.push(asset);
|
|
75
|
+
} else {
|
|
76
|
+
merged.splice(at, 0, asset);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return merged;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export { getAssetComparator, mergeUploadedAssets };
|
|
83
|
+
//# sourceMappingURL=mergeUploadedAssets.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeUploadedAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/utils/mergeUploadedAssets.ts"],"sourcesContent":["/**\n * Merges just-uploaded assets into the loaded asset list so each one appears as\n * soon as its own upload finishes, rather than when the whole batch settles.\n *\n * The upload is one mutation per batch, so its cache invalidation fires once at\n * the end. These helpers bridge that gap purely client-side: the completed\n * uploads already sit in the progress store as full `File` objects, so they can\n * be placed into the list at their sort position with no extra request.\n *\n * The server list stays authoritative — merging never reorders it, and an id it\n * already contains wins over the local copy, so the end-of-batch refetch\n * silently takes over.\n */\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\ntype SortField = 'createdAt' | 'updatedAt' | 'name' | 'size';\n\nconst SORT_FIELDS: SortField[] = ['createdAt', 'updatedAt', 'name', 'size'];\n\nconst isSortField = (value: string): value is SortField =>\n (SORT_FIELDS as string[]).includes(value);\n\nconst DEFAULT_RULE = 'updatedAt:DESC';\n\nconst compareByField = (field: SortField, a: File, b: File): number => {\n if (field === 'size') {\n return (a.size ?? 0) - (b.size ?? 0);\n }\n\n if (field === 'name') {\n return a.name.localeCompare(b.name);\n }\n\n // `createdAt` / `updatedAt` are ISO-8601, which sorts correctly as text.\n return (a[field] ?? '').localeCompare(b[field] ?? '');\n};\n\n/**\n * Comparator matching a `<field>:<ASC|DESC>` sort rule, as sent to the API.\n *\n * Ties break on id so the order is total: without it, two files sharing a\n * timestamp could swap places between renders.\n */\nexport const getAssetComparator = (rule: string = DEFAULT_RULE) => {\n const [field, requestedDirection] = rule.split(':');\n // An unrecognised field discards the direction too: half-applying a rule we\n // cannot read would order the list differently from the default it stands in for.\n const isKnownField = isSortField(field);\n const sortField: SortField = isKnownField ? field : 'updatedAt';\n const direction = isKnownField ? requestedDirection : 'DESC';\n const sign = direction === 'ASC' ? 1 : -1;\n\n return (a: File, b: File): number => {\n const byField = compareByField(sortField, a, b);\n\n return byField !== 0 ? sign * byField : sign * (a.id - b.id);\n };\n};\n\n/**\n * Places `uploaded` into `assets` at their sort position.\n *\n * An upload that sorts past everything loaded is dropped unless the list is\n * fully loaded: it belongs on a page the user has not reached, and appending it\n * would show it adjacent to the last loaded item instead of at its real place.\n */\nexport const mergeUploadedAssets = ({\n assets,\n uploaded,\n sort,\n hasNextPage,\n}: {\n assets: File[];\n uploaded: File[];\n sort?: string;\n /** Whether more pages remain, i.e. the tail of the list is not loaded. */\n hasNextPage: boolean;\n}): File[] => {\n if (uploaded.length === 0) {\n return assets;\n }\n\n const loadedIds = new Set(assets.map((asset) => asset.id));\n const compare = getAssetComparator(sort);\n const fresh = uploaded.filter((asset) => !loadedIds.has(asset.id)).sort(compare);\n\n if (fresh.length === 0) {\n return assets;\n }\n\n const merged = [...assets];\n\n for (const asset of fresh) {\n const at = merged.findIndex((loaded) => compare(asset, loaded) < 0);\n\n if (at === -1) {\n if (hasNextPage) {\n continue;\n }\n merged.push(asset);\n } else {\n merged.splice(at, 0, asset);\n }\n }\n\n return merged;\n};\n"],"names":["SORT_FIELDS","isSortField","value","includes","DEFAULT_RULE","compareByField","field","a","b","size","name","localeCompare","getAssetComparator","rule","requestedDirection","split","isKnownField","sortField","direction","sign","byField","id","mergeUploadedAssets","assets","uploaded","sort","hasNextPage","length","loadedIds","Set","map","asset","compare","fresh","filter","has","merged","at","findIndex","loaded","push","splice"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var selection = require('./selection.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The keys of the items actually on screen, in render order.
|
|
7
|
+
*
|
|
8
|
+
* Single source for every consumer of the rendered set — range selection,
|
|
9
|
+
* select-all and the bulk action bar. Derived once so they cannot disagree:
|
|
10
|
+
* in "Folders: Mixed with files" the rows come from `mergeMixedList`, which
|
|
11
|
+
* withholds folders sorting after the last loaded asset, so `folders` is not
|
|
12
|
+
* the rendered folder set.
|
|
13
|
+
*/ const buildRenderedKeys = ({ folders, assets, mixedItems })=>mixedItems ? mixedItems.map((item)=>item.kind === 'folder' ? selection.folderKey(item.folder.id) : selection.assetKey(item.asset.id)) : [
|
|
14
|
+
...folders.map((folder)=>selection.folderKey(folder.id)),
|
|
15
|
+
...assets.map((asset)=>selection.assetKey(asset.id))
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
exports.buildRenderedKeys = buildRenderedKeys;
|
|
19
|
+
//# sourceMappingURL=renderedKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderedKeys.js","sources":["../../../../../../admin/src/future/pages/Assets/utils/renderedKeys.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from './selection';\n\nimport type { MixedItem } from './mergeMixedList';\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/**\n * The keys of the items actually on screen, in render order.\n *\n * Single source for every consumer of the rendered set — range selection,\n * select-all and the bulk action bar. Derived once so they cannot disagree:\n * in \"Folders: Mixed with files\" the rows come from `mergeMixedList`, which\n * withholds folders sorting after the last loaded asset, so `folders` is not\n * the rendered folder set.\n */\nexport const buildRenderedKeys = ({\n folders,\n assets,\n mixedItems,\n}: {\n folders: Folder[];\n assets: File[];\n /** The interleaved rows, when the table is in mixed mode. */\n mixedItems?: MixedItem[] | null;\n}): ItemKey[] =>\n mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n"],"names":["buildRenderedKeys","folders","assets","mixedItems","map","item","kind","folderKey","folder","id","assetKey","asset"],"mappings":";;;;AAMA;;;;;;;;AAQC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,OAAO,EACPC,MAAM,EACNC,UAAU,EAMX,GACCA,UAAAA,GACIA,WAAWC,GAAG,CAAC,CAACC,IAAAA,GACdA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWC,oBAAUF,IAAAA,CAAKG,MAAM,CAACC,EAAE,IAAIC,kBAAAA,CAASL,IAAAA,CAAKM,KAAK,CAACF,EAAE,CAAA,CAAA,GAE7E;AACKR,QAAAA,GAAAA,OAAAA,CAAQG,GAAG,CAAC,CAACI,MAAAA,GAAWD,mBAAAA,CAAUC,OAAOC,EAAE,CAAA,CAAA;AAC3CP,QAAAA,GAAAA,MAAAA,CAAOE,GAAG,CAAC,CAACO,KAAAA,GAAUD,kBAAAA,CAASC,MAAMF,EAAE,CAAA;;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { folderKey, assetKey } from './selection.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The keys of the items actually on screen, in render order.
|
|
5
|
+
*
|
|
6
|
+
* Single source for every consumer of the rendered set — range selection,
|
|
7
|
+
* select-all and the bulk action bar. Derived once so they cannot disagree:
|
|
8
|
+
* in "Folders: Mixed with files" the rows come from `mergeMixedList`, which
|
|
9
|
+
* withholds folders sorting after the last loaded asset, so `folders` is not
|
|
10
|
+
* the rendered folder set.
|
|
11
|
+
*/ const buildRenderedKeys = ({ folders, assets, mixedItems })=>mixedItems ? mixedItems.map((item)=>item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)) : [
|
|
12
|
+
...folders.map((folder)=>folderKey(folder.id)),
|
|
13
|
+
...assets.map((asset)=>assetKey(asset.id))
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
export { buildRenderedKeys };
|
|
17
|
+
//# sourceMappingURL=renderedKeys.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderedKeys.mjs","sources":["../../../../../../admin/src/future/pages/Assets/utils/renderedKeys.ts"],"sourcesContent":["import { assetKey, folderKey, type ItemKey } from './selection';\n\nimport type { MixedItem } from './mergeMixedList';\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/**\n * The keys of the items actually on screen, in render order.\n *\n * Single source for every consumer of the rendered set — range selection,\n * select-all and the bulk action bar. Derived once so they cannot disagree:\n * in \"Folders: Mixed with files\" the rows come from `mergeMixedList`, which\n * withholds folders sorting after the last loaded asset, so `folders` is not\n * the rendered folder set.\n */\nexport const buildRenderedKeys = ({\n folders,\n assets,\n mixedItems,\n}: {\n folders: Folder[];\n assets: File[];\n /** The interleaved rows, when the table is in mixed mode. */\n mixedItems?: MixedItem[] | null;\n}): ItemKey[] =>\n mixedItems\n ? mixedItems.map((item) =>\n item.kind === 'folder' ? folderKey(item.folder.id) : assetKey(item.asset.id)\n )\n : [\n ...folders.map((folder) => folderKey(folder.id)),\n ...assets.map((asset) => assetKey(asset.id)),\n ];\n"],"names":["buildRenderedKeys","folders","assets","mixedItems","map","item","kind","folderKey","folder","id","assetKey","asset"],"mappings":";;AAMA;;;;;;;;AAQC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,OAAO,EACPC,MAAM,EACNC,UAAU,EAMX,GACCA,UAAAA,GACIA,WAAWC,GAAG,CAAC,CAACC,IAAAA,GACdA,IAAAA,CAAKC,IAAI,KAAK,QAAA,GAAWC,UAAUF,IAAAA,CAAKG,MAAM,CAACC,EAAE,IAAIC,QAAAA,CAASL,IAAAA,CAAKM,KAAK,CAACF,EAAE,CAAA,CAAA,GAE7E;AACKR,QAAAA,GAAAA,OAAAA,CAAQG,GAAG,CAAC,CAACI,MAAAA,GAAWD,SAAAA,CAAUC,OAAOC,EAAE,CAAA,CAAA;AAC3CP,QAAAA,GAAAA,MAAAA,CAAOE,GAAG,CAAC,CAACO,KAAAA,GAAUD,QAAAA,CAASC,MAAMF,EAAE,CAAA;;;;;"}
|
|
@@ -43,11 +43,37 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
43
43
|
unregisterAbortController(uploadId);
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
|
+
/**
|
|
47
|
+
* Runs are chained per batch rather than started in parallel: a second pool
|
|
48
|
+
* alongside the first would double the files in flight and make `concurrency`
|
|
49
|
+
* stop meaning anything.
|
|
50
|
+
*/ const poolTails = new Map();
|
|
51
|
+
const trackPoolRun = (uploadId, run)=>{
|
|
52
|
+
// Not swallowed: the caller still gets the real result from `run`.
|
|
53
|
+
const tail = run.catch(()=>undefined);
|
|
54
|
+
poolTails.set(uploadId, tail);
|
|
55
|
+
tail.then(()=>{
|
|
56
|
+
// Leave the entry alone if another run has queued behind us in the meantime.
|
|
57
|
+
if (poolTails.get(uploadId) === tail) {
|
|
58
|
+
poolTails.delete(uploadId);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
};
|
|
46
62
|
/** Maps a server per-file outcome onto the row's terminal metadata status. */ const METADATA_STATUS_BY_RESULT = {
|
|
47
63
|
success: 'generated',
|
|
48
64
|
skipped: 'skipped',
|
|
49
65
|
error: 'failed'
|
|
50
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Re-attaches the folder an upload targeted.
|
|
69
|
+
*
|
|
70
|
+
* The create response is built from `db.query().create()` with no populate, so
|
|
71
|
+
* it comes back without the folder relation it was just given. The list needs
|
|
72
|
+
* it to tell whether a freshly uploaded asset belongs to the folder on screen.
|
|
73
|
+
*/ const withTargetFolder = (file, folder)=>file.folder != null ? file : {
|
|
74
|
+
...file,
|
|
75
|
+
folder: folder ?? null
|
|
76
|
+
};
|
|
51
77
|
/**
|
|
52
78
|
* Kicks off AI metadata generation for a freshly uploaded file.
|
|
53
79
|
*
|
|
@@ -116,7 +142,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
116
142
|
dispatch(uploadProgress.setFileUploading({
|
|
117
143
|
name: fileName,
|
|
118
144
|
index,
|
|
119
|
-
size: entry.file.size
|
|
145
|
+
size: entry.file.size,
|
|
146
|
+
uploadId
|
|
120
147
|
}));
|
|
121
148
|
const formData = new FormData();
|
|
122
149
|
formData.append('files', entry.file);
|
|
@@ -125,7 +152,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
125
152
|
const batcher = createRafBatcher.createRafBatcher((bytes)=>{
|
|
126
153
|
dispatch(uploadProgress.setFileProgress({
|
|
127
154
|
index,
|
|
128
|
-
bytes
|
|
155
|
+
bytes,
|
|
156
|
+
uploadId
|
|
129
157
|
}));
|
|
130
158
|
});
|
|
131
159
|
try {
|
|
@@ -134,7 +162,9 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
134
162
|
uploaded.push(file);
|
|
135
163
|
dispatch(uploadProgress.setFileComplete({
|
|
136
164
|
index,
|
|
137
|
-
file
|
|
165
|
+
file: withTargetFolder(file, entry.fileInfo?.folder),
|
|
166
|
+
uploadId,
|
|
167
|
+
completedAt: Date.now()
|
|
138
168
|
}));
|
|
139
169
|
// Not awaited: overlaps with the next file's upload and can't fail the batch.
|
|
140
170
|
maybeGenerateMetadata({
|
|
@@ -155,7 +185,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
155
185
|
dispatch(uploadProgress.setFileError({
|
|
156
186
|
index,
|
|
157
187
|
name: fileName,
|
|
158
|
-
message
|
|
188
|
+
message,
|
|
189
|
+
uploadId
|
|
159
190
|
}));
|
|
160
191
|
}
|
|
161
192
|
};
|
|
@@ -185,6 +216,44 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
185
216
|
data: uploaded
|
|
186
217
|
};
|
|
187
218
|
};
|
|
219
|
+
/**
|
|
220
|
+
* Reuses the batch's AbortController so one Cancel stops both drops.
|
|
221
|
+
* `runUploadPool` unregisters it on finish, hence the re-register below.
|
|
222
|
+
*
|
|
223
|
+
* Resolves with the whole batch's files, not just this leg's: the mutation
|
|
224
|
+
* models one drop, and after a merge the drop is the batch. The earlier leg's
|
|
225
|
+
* files come from the tail this run queued behind.
|
|
226
|
+
*/ const runMergedUploadPool = async ({ entries, indices, token, uploadId, dispatch, concurrency, generateAiMetadata })=>{
|
|
227
|
+
const abortController = abortControllers.get(uploadId) ?? new AbortController();
|
|
228
|
+
const run = (poolTails.get(uploadId) ?? Promise.resolve(undefined)).then((previous)=>{
|
|
229
|
+
// A failed earlier leg contributes no files; its error already reached the
|
|
230
|
+
// store, and this leg still has files of its own to upload.
|
|
231
|
+
const earlier = previous?.data ?? [];
|
|
232
|
+
if (abortController.signal.aborted) {
|
|
233
|
+
return {
|
|
234
|
+
data: earlier
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
registerAbortController(uploadId, abortController);
|
|
238
|
+
return runUploadPool({
|
|
239
|
+
entries,
|
|
240
|
+
indices,
|
|
241
|
+
token,
|
|
242
|
+
uploadId,
|
|
243
|
+
abortController,
|
|
244
|
+
dispatch,
|
|
245
|
+
concurrency,
|
|
246
|
+
generateAiMetadata
|
|
247
|
+
}).then((result)=>result.error ? result : {
|
|
248
|
+
data: [
|
|
249
|
+
...earlier,
|
|
250
|
+
...result.data ?? []
|
|
251
|
+
]
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
trackPoolRun(uploadId, run);
|
|
255
|
+
return run;
|
|
256
|
+
};
|
|
188
257
|
/* -------------------------------------------------------------------------------------------------
|
|
189
258
|
* URL upload flow (SSE) — kept as-is for this iteration
|
|
190
259
|
* -----------------------------------------------------------------------------------------------*/ /**
|
|
@@ -240,7 +309,7 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
240
309
|
/**
|
|
241
310
|
* Processes an SSE stream from the URL upload endpoint.
|
|
242
311
|
* Dispatches Redux actions for each file event and returns the final result.
|
|
243
|
-
*/ const processSSEStream = async ({ response, dispatch, uploadId, generateAiMetadata })=>{
|
|
312
|
+
*/ const processSSEStream = async ({ response, dispatch, uploadId, generateAiMetadata, folderId })=>{
|
|
244
313
|
const reader = response.body.getReader();
|
|
245
314
|
const decoder = new TextDecoder();
|
|
246
315
|
let streamResult = null;
|
|
@@ -271,7 +340,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
271
340
|
dispatch(uploadProgress.setFileUploading({
|
|
272
341
|
name: parsed.url,
|
|
273
342
|
index,
|
|
274
|
-
size: 0
|
|
343
|
+
size: 0,
|
|
344
|
+
uploadId
|
|
275
345
|
}));
|
|
276
346
|
break;
|
|
277
347
|
}
|
|
@@ -281,7 +351,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
281
351
|
dispatch(uploadProgress.setFileUploading({
|
|
282
352
|
name: payload.name,
|
|
283
353
|
index,
|
|
284
|
-
size: payload.size
|
|
354
|
+
size: payload.size,
|
|
355
|
+
uploadId
|
|
285
356
|
}));
|
|
286
357
|
break;
|
|
287
358
|
}
|
|
@@ -290,7 +361,9 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
290
361
|
const payload = parsed;
|
|
291
362
|
dispatch(uploadProgress.setFileComplete({
|
|
292
363
|
index,
|
|
293
|
-
file: payload.file
|
|
364
|
+
file: withTargetFolder(payload.file, folderId),
|
|
365
|
+
uploadId,
|
|
366
|
+
completedAt: Date.now()
|
|
294
367
|
}));
|
|
295
368
|
// Same fire-and-forget semantics as the file flow.
|
|
296
369
|
maybeGenerateMetadata({
|
|
@@ -308,7 +381,8 @@ const unregisterAbortController = (uploadId)=>{
|
|
|
308
381
|
dispatch(uploadProgress.setFileError({
|
|
309
382
|
index,
|
|
310
383
|
name: payload.name,
|
|
311
|
-
message: payload.message
|
|
384
|
+
message: payload.message,
|
|
385
|
+
uploadId
|
|
312
386
|
}));
|
|
313
387
|
break;
|
|
314
388
|
}
|
|
@@ -357,6 +431,38 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
357
431
|
}));
|
|
358
432
|
const fileNames = entries.map((entry)=>entry.fileInfo.name ?? entry.file.name);
|
|
359
433
|
const fileSizes = entries.map((entry)=>entry.file.size);
|
|
434
|
+
// `uploadFromUrls` also leaves rows `pending`, but registers no batch —
|
|
435
|
+
// so an unregistered batch is not ours to merge into, and appending would
|
|
436
|
+
// land on top of its rows.
|
|
437
|
+
const progress = getState().uploadProgress;
|
|
438
|
+
const batch = getUploadEntries(progress.uploadId);
|
|
439
|
+
const isMerge = batch !== undefined && uploadProgress.isUploadInFlight(progress.files);
|
|
440
|
+
if (isMerge) {
|
|
441
|
+
const { uploadId } = progress;
|
|
442
|
+
const offset = batch.entries.length;
|
|
443
|
+
// No `totalFiles`: the reducer derives it from the rows it appends.
|
|
444
|
+
dispatch(uploadProgress.appendUploadFiles({
|
|
445
|
+
uploadId,
|
|
446
|
+
fileNames,
|
|
447
|
+
fileSizes
|
|
448
|
+
}));
|
|
449
|
+
const mergedEntries = [
|
|
450
|
+
...batch.entries,
|
|
451
|
+
...entries
|
|
452
|
+
];
|
|
453
|
+
// Merged files adopt the batch's flags: a new concurrency would raise
|
|
454
|
+
// the ceiling it exists to impose.
|
|
455
|
+
registerUploadEntries(uploadId, mergedEntries, batch.generateAiMetadata, batch.concurrency);
|
|
456
|
+
return runMergedUploadPool({
|
|
457
|
+
entries: mergedEntries,
|
|
458
|
+
indices: entries.map((_, index)=>offset + index),
|
|
459
|
+
token,
|
|
460
|
+
uploadId,
|
|
461
|
+
dispatch,
|
|
462
|
+
concurrency: batch.concurrency,
|
|
463
|
+
generateAiMetadata: batch.generateAiMetadata
|
|
464
|
+
});
|
|
465
|
+
}
|
|
360
466
|
// Open the progress dialog
|
|
361
467
|
dispatch(uploadProgress.openUploadProgress({
|
|
362
468
|
totalFiles,
|
|
@@ -370,7 +476,7 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
370
476
|
// One AbortController per batch
|
|
371
477
|
const abortController = new AbortController();
|
|
372
478
|
registerAbortController(uploadId, abortController);
|
|
373
|
-
|
|
479
|
+
const run = runUploadPool({
|
|
374
480
|
entries,
|
|
375
481
|
indices: entries.map((_, index)=>index),
|
|
376
482
|
token,
|
|
@@ -380,6 +486,8 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
380
486
|
concurrency,
|
|
381
487
|
generateAiMetadata
|
|
382
488
|
});
|
|
489
|
+
trackPoolRun(uploadId, run);
|
|
490
|
+
return run;
|
|
383
491
|
},
|
|
384
492
|
// `Folder, LIST` refreshes the folder header count, which changes when
|
|
385
493
|
// files are added to it.
|
|
@@ -413,7 +521,11 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
413
521
|
data: uploaded
|
|
414
522
|
};
|
|
415
523
|
} catch (err) {
|
|
416
|
-
|
|
524
|
+
// Only pass on text the server actually sent. The XHR layer's own
|
|
525
|
+
// fallbacks are hardcoded English, and callers here (crop → "Save
|
|
526
|
+
// as copy") have a localized message of their own; an empty string
|
|
527
|
+
// reads as "nothing usable" and lets theirs win.
|
|
528
|
+
const message = err instanceof uploadFileViaXHR.UploadFileError && err.isServerMessage ? err.message : '';
|
|
417
529
|
return {
|
|
418
530
|
error: {
|
|
419
531
|
name: 'UnknownError',
|
|
@@ -466,7 +578,7 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
466
578
|
// Fresh AbortController for the retry run
|
|
467
579
|
const abortController = new AbortController();
|
|
468
580
|
registerAbortController(uploadId, abortController);
|
|
469
|
-
|
|
581
|
+
const run = runUploadPool({
|
|
470
582
|
entries: batch.entries,
|
|
471
583
|
indices: cancelledIndices,
|
|
472
584
|
token,
|
|
@@ -477,6 +589,11 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
477
589
|
concurrency: batch.concurrency,
|
|
478
590
|
generateAiMetadata: batch.generateAiMetadata
|
|
479
591
|
});
|
|
592
|
+
// Retried rows are `pending` again, so a drop lands on the merge branch.
|
|
593
|
+
// Untracked, that merge would find no tail to queue behind and run its
|
|
594
|
+
// pool beside this one — two pools of `concurrency` each.
|
|
595
|
+
trackPoolRun(uploadId, run);
|
|
596
|
+
return run;
|
|
480
597
|
},
|
|
481
598
|
// `Folder, LIST` refreshes the folder header count, which changes when
|
|
482
599
|
// files are added to it.
|
|
@@ -546,7 +663,8 @@ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
|
|
|
546
663
|
response,
|
|
547
664
|
dispatch,
|
|
548
665
|
uploadId,
|
|
549
|
-
generateAiMetadata
|
|
666
|
+
generateAiMetadata,
|
|
667
|
+
folderId
|
|
550
668
|
});
|
|
551
669
|
unregisterAbortController(uploadId);
|
|
552
670
|
if (streamResult && streamResult.data.length > 0) {
|