@strapi/upload 5.37.1 → 5.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AudioAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AudioAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AudioPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/AudioPreview.mjs.map +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/DocAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PageSize.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PageSize.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/PaginationFooter.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/utils/isSelectable.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/DialogFooter.js.map +1 -1
- package/dist/admin/components/AssetDialog/DialogFooter.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
- package/dist/admin/components/AssetGridList/AssetGridList.js.map +1 -1
- package/dist/admin/components/AssetGridList/AssetGridList.mjs.map +1 -1
- package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
- package/dist/admin/components/AssetGridList/Draggable.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/Breadcrumbs.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/components/ContextInfo/ContextInfo.js.map +1 -1
- package/dist/admin/components/ContextInfo/ContextInfo.mjs.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/DialogHeader.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/DialogHeader.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +1 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +1 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/RemoveAssetDialog.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/RemoveFolderDialog.mjs.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.js.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssetGrid.mjs.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssets.js.map +1 -1
- package/dist/admin/components/EmptyAssets/EmptyAssets.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.js.map +1 -1
- package/dist/admin/components/FilterList/FilterTag.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterValueInput.js.map +1 -1
- package/dist/admin/components/FilterPopover/FilterValueInput.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/utils/getFilterList.js.map +1 -1
- package/dist/admin/components/FilterPopover/utils/getFilterList.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBody/FolderCardBody.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardBodyAction/FolderCardBodyAction.mjs.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.mjs.map +1 -1
- package/dist/admin/components/FolderCard/contexts/FolderCard.js.map +1 -1
- package/dist/admin/components/FolderCard/contexts/FolderCard.mjs.map +1 -1
- package/dist/admin/components/FolderGridList/FolderGridList.js.map +1 -1
- package/dist/admin/components/FolderGridList/FolderGridList.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/SelectTree/Option.js.map +1 -1
- package/dist/admin/components/SelectTree/Option.mjs.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.mjs +1 -1
- package/dist/admin/components/SelectTree/SelectTree.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/getOpenValues.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/getOpenValues.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/getValuesToClose.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/getValuesToClose.mjs.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js.map +1 -1
- package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -1
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.js.map +1 -1
- package/dist/admin/components/UploadProgress/UploadProgress.mjs.map +1 -1
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +189 -0
- package/dist/admin/future/components/Drawer.js.map +1 -0
- package/dist/admin/future/components/Drawer.mjs +166 -0
- package/dist/admin/future/components/Drawer.mjs.map +1 -0
- package/dist/admin/future/components/UploadProgressDialog.js +60 -101
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +62 -84
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.js +155 -100
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +160 -105
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +406 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +384 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +215 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +194 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +37 -8
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +38 -9
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +35 -5
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +37 -7
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js +143 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs +141 -0
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +127 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs +106 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/constants.js.map +1 -1
- package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/services/api.js +181 -97
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +181 -98
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +14 -1
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +14 -2
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +16 -1
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +16 -2
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/store/hooks.js.map +1 -1
- package/dist/admin/future/store/hooks.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +7 -4
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +7 -4
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/files.js +105 -3
- package/dist/admin/future/utils/files.js.map +1 -1
- package/dist/admin/future/utils/files.mjs +104 -4
- package/dist/admin/future/utils/files.mjs.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.js +3 -3
- package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
- package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
- package/dist/admin/future/utils/translations.js.map +1 -1
- package/dist/admin/future/utils/translations.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
- package/dist/admin/hooks/useAiAvailability.js.map +1 -1
- package/dist/admin/hooks/useAiAvailability.mjs.map +1 -1
- package/dist/admin/hooks/useAssets.js.map +1 -1
- package/dist/admin/hooks/useAssets.mjs.map +1 -1
- package/dist/admin/hooks/useBulkEdit.js.map +1 -1
- package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
- package/dist/admin/hooks/useBulkMove.js.map +1 -1
- package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
- package/dist/admin/hooks/useBulkRemove.js.map +1 -1
- package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
- package/dist/admin/hooks/useConfig.js.map +1 -1
- package/dist/admin/hooks/useConfig.mjs.map +1 -1
- package/dist/admin/hooks/useCropImg.js.map +1 -1
- package/dist/admin/hooks/useCropImg.mjs.map +1 -1
- package/dist/admin/hooks/useEditAsset.js.map +1 -1
- package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
- package/dist/admin/hooks/useEditFolder.js.map +1 -1
- package/dist/admin/hooks/useEditFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolder.js.map +1 -1
- package/dist/admin/hooks/useFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolderStructure.js.map +1 -1
- package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
- package/dist/admin/hooks/useFolders.js.map +1 -1
- package/dist/admin/hooks/useFolders.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.mjs.map +1 -1
- package/dist/admin/hooks/usePersistentState.js.map +1 -1
- package/dist/admin/hooks/usePersistentState.mjs.map +1 -1
- package/dist/admin/hooks/useRemoveAsset.js.map +1 -1
- package/dist/admin/hooks/useRemoveAsset.mjs.map +1 -1
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
- package/dist/admin/hooks/useSettings.js.map +1 -1
- package/dist/admin/hooks/useSettings.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/hooks/useUpload.js.map +1 -1
- package/dist/admin/hooks/useUpload.mjs.map +1 -1
- package/dist/admin/hooks/utils/renameKeys.js.map +1 -1
- package/dist/admin/hooks/utils/renameKeys.mjs.map +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +1 -152
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +2 -141
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/pages/App/App.js.map +1 -1
- package/dist/admin/pages/App/App.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +3 -3
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actionTypes.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actions.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/actions.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/init.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/init.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.js +1 -1
- package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.mjs +2 -2
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.js.map +1 -1
- package/dist/admin/pages/App/components/BulkDeleteButton.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.mjs.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
- package/dist/admin/pages/App/components/Filters.js.map +1 -1
- package/dist/admin/pages/App/components/Filters.mjs.map +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/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
- package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
- package/dist/admin/pluginId.js.map +1 -1
- package/dist/admin/pluginId.mjs.map +1 -1
- package/dist/admin/src/future/components/Drawer.d.ts +32 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsGrid.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/ImportFromUrlDialog.d.ts +7 -0
- package/dist/admin/src/future/services/api.d.ts +10 -1
- package/dist/admin/src/future/services/assets.d.ts +2 -2
- package/dist/admin/src/future/services/folders.d.ts +1 -1
- package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
- package/dist/admin/src/future/utils/files.d.ts +70 -0
- package/dist/admin/translations/en.json.js +35 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +35 -3
- 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/utils/appendSearchParamsToUrl.js.map +1 -1
- package/dist/admin/utils/appendSearchParamsToUrl.mjs.map +1 -1
- package/dist/admin/utils/containsAssetFilter.js.map +1 -1
- package/dist/admin/utils/containsAssetFilter.mjs.map +1 -1
- package/dist/admin/utils/createAssetUrl.js.map +1 -1
- package/dist/admin/utils/createAssetUrl.mjs.map +1 -1
- package/dist/admin/utils/displayedFilters.js.map +1 -1
- package/dist/admin/utils/displayedFilters.mjs.map +1 -1
- package/dist/admin/utils/downloadFile.js.map +1 -1
- package/dist/admin/utils/downloadFile.mjs.map +1 -1
- package/dist/admin/utils/findRecursiveFolderByValue.js.map +1 -1
- package/dist/admin/utils/findRecursiveFolderByValue.mjs.map +1 -1
- package/dist/admin/utils/formatBytes.js.map +1 -1
- package/dist/admin/utils/formatBytes.mjs.map +1 -1
- package/dist/admin/utils/formatDuration.js.map +1 -1
- package/dist/admin/utils/formatDuration.mjs.map +1 -1
- package/dist/admin/utils/getAPIInnerErrors.js.map +1 -1
- package/dist/admin/utils/getAPIInnerErrors.mjs.map +1 -1
- package/dist/admin/utils/getAllowedFiles.js.map +1 -1
- package/dist/admin/utils/getAllowedFiles.mjs.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataCM.js.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataCM.mjs.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataML.js.map +1 -1
- package/dist/admin/utils/getBreadcrumbDataML.mjs.map +1 -1
- package/dist/admin/utils/getFileExtension.js.map +1 -1
- package/dist/admin/utils/getFileExtension.mjs.map +1 -1
- package/dist/admin/utils/getFolderParents.js.map +1 -1
- package/dist/admin/utils/getFolderParents.mjs.map +1 -1
- package/dist/admin/utils/getFolderURL.js.map +1 -1
- package/dist/admin/utils/getFolderURL.mjs.map +1 -1
- package/dist/admin/utils/getTrad.js.map +1 -1
- package/dist/admin/utils/getTrad.mjs.map +1 -1
- package/dist/admin/utils/icons.js.map +1 -1
- package/dist/admin/utils/icons.mjs +1 -1
- package/dist/admin/utils/icons.mjs.map +1 -1
- package/dist/admin/utils/moveElement.js.map +1 -1
- package/dist/admin/utils/moveElement.mjs.map +1 -1
- package/dist/admin/utils/normalizeAPIError.js.map +1 -1
- package/dist/admin/utils/normalizeAPIError.mjs.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.js.map +1 -1
- package/dist/admin/utils/prefixFileUrlWithBackendUrl.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/rawFileToAsset.js.map +1 -1
- package/dist/admin/utils/rawFileToAsset.mjs.map +1 -1
- package/dist/admin/utils/toSingularTypes.js.map +1 -1
- package/dist/admin/utils/toSingularTypes.mjs.map +1 -1
- package/dist/admin/utils/typeFromMime.js.map +1 -1
- package/dist/admin/utils/typeFromMime.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
- package/dist/admin/utils/urlsToAssets.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/content-types/file.js.map +1 -1
- package/dist/server/content-types/file.mjs.map +1 -1
- package/dist/server/content-types/folder.js.map +1 -1
- package/dist/server/content-types/folder.mjs +1 -1
- package/dist/server/content-types/folder.mjs.map +1 -1
- package/dist/server/content-types/index.js.map +1 -1
- package/dist/server/content-types/index.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +1 -1
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +2 -2
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder.js.map +1 -1
- package/dist/server/controllers/admin-folder.mjs +1 -1
- package/dist/server/controllers/admin-folder.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +144 -0
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +147 -3
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
- package/dist/server/controllers/utils/folders.js.map +1 -1
- package/dist/server/controllers/utils/folders.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/configureView.js.map +1 -1
- package/dist/server/controllers/validation/admin/configureView.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/settings.js.map +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/utils.js.map +1 -1
- package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
- package/dist/server/controllers/view-configuration.js.map +1 -1
- package/dist/server/controllers/view-configuration.mjs.map +1 -1
- package/dist/server/graphql.js.map +1 -1
- package/dist/server/graphql.mjs.map +1 -1
- package/dist/server/index.js +8 -8
- package/dist/server/middlewares/upload.js.map +1 -1
- package/dist/server/middlewares/upload.mjs.map +1 -1
- package/dist/server/models/ai-metadata-job.js.map +1 -1
- package/dist/server/models/ai-metadata-job.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin.js +10 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +10 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +4 -4
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/routes/validation/upload.mjs.map +1 -1
- package/dist/server/routes/view-configuration.js.map +1 -1
- package/dist/server/routes/view-configuration.mjs.map +1 -1
- package/dist/server/services/ai-metadata-jobs.js.map +1 -1
- package/dist/server/services/ai-metadata-jobs.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/extensions/index.js.map +1 -1
- package/dist/server/services/extensions/index.mjs.map +1 -1
- package/dist/server/services/extensions/utils.js.map +1 -1
- package/dist/server/services/extensions/utils.mjs.map +1 -1
- package/dist/server/services/file.js +120 -1
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +122 -3
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +1 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +1 -1
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +13 -0
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +15 -0
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/utils/cron.js.map +1 -1
- package/dist/server/utils/cron.mjs.map +1 -1
- package/dist/server/utils/images.js.map +1 -1
- package/dist/server/utils/images.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/dist/shared/contracts/files.d.ts +11 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.mjs","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { adminApi } from '@strapi/admin/strapi-admin';\n\nimport {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n setUploadFailed,\n retryCancelledFiles,\n} from '../store/uploadProgress';\n\nimport type {\n CreateFilesStream,\n CreateFilesStreamEvents,\n} from '../../../../shared/contracts/files';\n\ninterface UploadFilesArgs {\n formData: FormData;\n totalFiles: number;\n}\n\ninterface RootState {\n admin_app: {\n token?: string | null;\n };\n uploadProgress: {\n uploadId: number;\n files: Array<{\n index: number;\n name: string;\n size: number;\n status: 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n }>;\n };\n}\n\n/**\n * Stores original File objects for retry functionality.\n *\n * Similar to abortControllers, File objects cannot be stored in Redux state\n * (they are not serializable). This Map allows us to retry cancelled uploads\n * by retrieving the original files using the uploadId.\n */\nconst uploadedFiles = new Map<number, File[]>();\n\n/**\n * Registers files for a specific upload to enable retry.\n */\nconst registerUploadedFiles = (uploadId: number, files: File[]) => {\n uploadedFiles.set(uploadId, files);\n};\n\n/**\n * Retrieves stored files for an upload.\n */\nconst getUploadedFiles = (uploadId: number): File[] | undefined => {\n return uploadedFiles.get(uploadId);\n};\n\n/**\n * Manages abort controllers for in-flight uploads.\n *\n * Design decision: Uses a Map to track uploads by their unique uploadId.\n * This approach is necessary because:\n * 1. Redux state cannot store function references (abort controllers)\n * 2. RTK Query's signal is only accessible within the queryFn\n * 3. The upload is triggered in AssetsPage but cancelled from UploadProgressDialog\n *\n * The uploadId ensures we abort the correct upload even if multiple uploads\n * are queued, though the current UI prevents simultaneous uploads.\n */\nconst abortControllers = new Map<number, AbortController>();\n\n/**\n * Registers an abort controller for a specific upload.\n * Called internally when an upload starts.\n */\nconst registerAbortController = (uploadId: number, controller: AbortController) => {\n abortControllers.set(uploadId, controller);\n};\n\n/**\n * Removes an abort controller when an upload completes or is aborted.\n */\nconst unregisterAbortController = (uploadId: number) => {\n abortControllers.delete(uploadId);\n};\n\n/**\n * Aborts an upload by its uploadId.\n * Called from the UploadProgressDialog when the user clicks cancel or close.\n */\nexport const abortUpload = (uploadId: number) => {\n const controller = abortControllers.get(uploadId);\n if (controller) {\n controller.abort();\n unregisterAbortController(uploadId);\n }\n};\n\n/**\n * Parses a raw SSE text chunk into event/data pairs.\n *\n * SSE format:\n * event: <eventName>\\n\n * data: <json>\\n\n * \\n\n */\nconst parseSSEEvents = (chunk: string): Array<{ event: string; data: string }> => {\n const events: Array<{ event: string; data: string }> = [];\n const blocks = chunk.split('\\n\\n').filter(Boolean);\n\n for (const block of blocks) {\n let event = '';\n let data = '';\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event: ')) {\n event = line.slice(7);\n } else if (line.startsWith('data: ')) {\n data = line.slice(6);\n }\n }\n\n if (event && data) {\n events.push({ event, data });\n }\n }\n\n return events;\n};\n\n/**\n * Makes a streaming upload request to the server.\n *\n * We use fetch directly instead of RTK Query's fetchBaseQuery because:\n * 1. We need access to the raw Response to read the body as a stream\n * 2. RTK Query's baseQuery awaits the full response and parses it as JSON,\n * which doesn't work for Server-Sent Events (SSE) streaming\n * 3. The stream must be read incrementally via response.body.getReader()\n * to dispatch progress updates as files upload\n */\nconst fetchUploadStream = async ({\n token,\n formData,\n signal,\n}: {\n token: string | null | undefined;\n formData: FormData;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream`, {\n method: 'POST',\n headers,\n body: formData,\n signal,\n });\n};\n\n/**\n * Options for processing an SSE upload stream.\n */\ninterface ProcessSSEStreamOptions {\n response: Response;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n}\n\n/**\n * Processes an SSE stream from the upload endpoint.\n * Dispatches Redux actions for each file event and returns the final result.\n *\n * @param options.response - The fetch Response object with SSE body\n * @param options.dispatch - Redux dispatch function\n * @param options.indexMapper - Optional function to map server indices to state indices (for retry)\n * @param options.logPrefix - Optional prefix for console logs\n * @returns The stream result or null if no files completed\n */\nconst processSSEStream = async ({\n response,\n dispatch,\n indexMapper = (i) => i,\n}: ProcessSSEStreamOptions): Promise<CreateFilesStream.Response | null> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let streamResult: CreateFilesStream.Response | null = null;\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete SSE events from the buffer\n const lastDoubleNewline = buffer.lastIndexOf('\\n\\n');\n if (lastDoubleNewline === -1) {\n // No complete events yet, keep buffering\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const completePart = buffer.slice(0, lastDoubleNewline + 2);\n buffer = buffer.slice(lastDoubleNewline + 2);\n\n const events = parseSSEEvents(completePart);\n\n for (const { event, data } of events) {\n const parsed = JSON.parse(data);\n const mappedIndex = indexMapper(parsed.index as number);\n\n switch (event) {\n case 'file:uploading': {\n const payload = parsed as CreateFilesStreamEvents.FileUploadingEvent;\n dispatch(\n setFileUploading({\n name: payload.name,\n index: mappedIndex,\n total: payload.total,\n size: payload.size,\n })\n );\n break;\n }\n case 'file:complete': {\n const payload = parsed as CreateFilesStreamEvents.FileCompleteEvent;\n dispatch(\n setFileComplete({\n index: mappedIndex,\n file: payload.file,\n })\n );\n break;\n }\n case 'file:error': {\n const payload = parsed as CreateFilesStreamEvents.FileErrorEvent;\n dispatch(\n setFileError({\n index: mappedIndex,\n name: payload.name,\n message: payload.message,\n })\n );\n break;\n }\n case 'stream:complete': {\n const payload = parsed as CreateFilesStreamEvents.StreamCompleteEvent;\n streamResult = {\n data: payload.data,\n errors: payload.errors,\n };\n break;\n }\n default:\n console.error(`[SSE Upload] unknown event: ${event}`, parsed);\n }\n }\n }\n\n return streamResult;\n};\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * Stream upload files to the /upload/unstable/stream endpoint.\n * Reads SSE stream for per-file progress updates.\n */\n uploadFilesStream: builder.mutation<CreateFilesStream.Response, UploadFilesArgs>({\n queryFn: async ({ formData, totalFiles }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract file names and sizes from FormData\n const files = formData.getAll('files') as File[];\n const fileInfoJson = formData.get('fileInfo') as string;\n const fileInfo = JSON.parse(fileInfoJson) as Array<{ name: string }>;\n const fileNames = fileInfo.map((info) => info.name);\n const fileSizes = files.map((file) => file.size);\n\n // Open the progress dialog and get the uploadId\n dispatch(openUploadProgress({ totalFiles, fileNames, fileSizes }));\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Store original files for retry functionality\n registerUploadedFiles(uploadId, files);\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n // Try to parse error message from response\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n // If we can't parse the error, use a generic message with status code\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n // Mark all files as failed in the UI\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n // If stream ended without completing any files, mark all as failed\n const errorMessage = 'No files were uploaded successfully';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n // Don't mark as failed for user-initiated cancellations\n return {\n error: { name: 'UnknownError', message: 'Upload cancelled' },\n };\n }\n\n // For network errors or other exceptions, mark all files as failed\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Retry uploading cancelled files.\n * Retrieves original File objects and re-uploads only the cancelled ones.\n */\n retryCancelledFilesStream: builder.mutation<CreateFilesStream.Response, void>({\n queryFn: async (_, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n const { uploadId, files: stateFiles } = (getState() as RootState).uploadProgress;\n\n // Get cancelled files with their original indices\n const cancelledFiles = stateFiles.filter((f) => f.status === 'cancelled');\n if (cancelledFiles.length === 0) {\n return { error: { name: 'UnknownError', message: 'No cancelled files to retry' } };\n }\n\n // Get the original File objects\n const originalFiles = getUploadedFiles(uploadId);\n if (!originalFiles) {\n return { error: { name: 'UnknownError', message: 'Original files not found' } };\n }\n\n // Build mapping from new index to original index\n const indexMapping = cancelledFiles.map((f) => f.index);\n const filesToRetry = cancelledFiles.map((f) => originalFiles[f.index]);\n\n // Reset cancelled files to pending\n dispatch(retryCancelledFiles());\n\n // Build FormData for retry\n const formData = new FormData();\n const fileInfoArray = filesToRetry.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: null, // TODO: preserve folder from original upload if needed\n }));\n\n filesToRetry.forEach((file) => {\n formData.append('files', file);\n });\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n\n // Create abort controller for this retry\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Retry request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Retry failed with status ${response.status}`;\n }\n\n // Mark retried files as failed\n for (const originalIndex of indexMapping) {\n dispatch(\n setFileError({\n index: originalIndex,\n name: stateFiles[originalIndex].name,\n message: errorMessage,\n })\n );\n }\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n indexMapper: (serverIndex) => indexMapping[serverIndex],\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return {\n error: {\n name: 'UnknownError',\n message: 'No files were uploaded successfully',\n },\n };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return {\n error: { name: 'UnknownError', message: 'Retry cancelled' },\n };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n });\n\nexport const { useUploadFilesStreamMutation, useRetryCancelledFilesStreamMutation } = uploadApi;\nexport { uploadApi };\n"],"names":["uploadedFiles","Map","registerUploadedFiles","uploadId","files","set","getUploadedFiles","get","abortControllers","registerAbortController","controller","unregisterAbortController","delete","abortUpload","abort","parseSSEEvents","chunk","events","blocks","split","filter","Boolean","block","event","data","line","startsWith","slice","push","fetchUploadStream","token","formData","signal","backendURL","window","strapi","headers","Authorization","fetch","method","body","processSSEStream","response","dispatch","indexMapper","i","reader","getReader","decoder","TextDecoder","streamResult","buffer","done","value","read","decode","stream","lastDoubleNewline","lastIndexOf","completePart","parsed","JSON","parse","mappedIndex","index","payload","setFileUploading","name","total","size","setFileComplete","file","setFileError","message","errors","console","error","uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFilesStream","mutation","queryFn","totalFiles","getState","admin_app","getAll","fileInfoJson","fileInfo","fileNames","map","info","fileSizes","openUploadProgress","updateProgress","uploadProgress","abortController","AbortController","ok","errorMessage","errorData","json","status","setUploadFailed","length","err","DOMException","Error","invalidatesTags","type","id","retryCancelledFilesStream","_","stateFiles","cancelledFiles","f","originalFiles","indexMapping","filesToRetry","retryCancelledFiles","FormData","fileInfoArray","caption","alternativeText","folder","forEach","append","stringify","originalIndex","serverIndex","useUploadFilesStreamMutation","useRetryCancelledFilesStreamMutation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.mjs","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { adminApi } from '@strapi/admin/strapi-admin';\n\nimport {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n setUploadFailed,\n retryCancelledFiles,\n} from '../store/uploadProgress';\nimport { getFilenameFromUrl } from '../utils/files';\n\nimport type {\n CreateFilesStream,\n CreateFilesStreamEvents,\n} from '../../../../shared/contracts/files';\n\ninterface UploadFilesArgs {\n formData: FormData;\n totalFiles: number;\n}\n\ninterface UploadFromUrlsArgs {\n urls: string[];\n folderId: number | null;\n}\n\ninterface RootState {\n admin_app: {\n token?: string | null;\n };\n uploadProgress: {\n uploadId: number;\n files: Array<{\n index: number;\n name: string;\n size: number;\n status: 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n }>;\n };\n}\n\n/**\n * Stores original File objects for retry functionality.\n *\n * Similar to abortControllers, File objects cannot be stored in Redux state\n * (they are not serializable). This Map allows us to retry cancelled uploads\n * by retrieving the original files using the uploadId.\n */\nconst uploadedFiles = new Map<number, File[]>();\n\n/**\n * Registers files for a specific upload to enable retry.\n */\nconst registerUploadedFiles = (uploadId: number, files: File[]) => {\n uploadedFiles.set(uploadId, files);\n};\n\n/**\n * Retrieves stored files for an upload.\n */\nconst getUploadedFiles = (uploadId: number): File[] | undefined => {\n return uploadedFiles.get(uploadId);\n};\n\n/**\n * Manages abort controllers for in-flight uploads.\n *\n * Design decision: Uses a Map to track uploads by their unique uploadId.\n * This approach is necessary because:\n * 1. Redux state cannot store function references (abort controllers)\n * 2. RTK Query's signal is only accessible within the queryFn\n * 3. The upload is triggered in AssetsPage but cancelled from UploadProgressDialog\n *\n * The uploadId ensures we abort the correct upload even if multiple uploads\n * are queued, though the current UI prevents simultaneous uploads.\n */\nconst abortControllers = new Map<number, AbortController>();\n\n/**\n * Registers an abort controller for a specific upload.\n * Called internally when an upload starts.\n */\nconst registerAbortController = (uploadId: number, controller: AbortController) => {\n abortControllers.set(uploadId, controller);\n};\n\n/**\n * Removes an abort controller when an upload completes or is aborted.\n */\nconst unregisterAbortController = (uploadId: number) => {\n abortControllers.delete(uploadId);\n};\n\n/**\n * Aborts an upload by its uploadId.\n * Called from the UploadProgressDialog when the user clicks cancel or close.\n */\nexport const abortUpload = (uploadId: number) => {\n const controller = abortControllers.get(uploadId);\n if (controller) {\n controller.abort();\n unregisterAbortController(uploadId);\n }\n};\n\n/**\n * Parses a raw SSE text chunk into event/data pairs.\n *\n * SSE format:\n * event: <eventName>\\n\n * data: <json>\\n\n * \\n\n */\nconst parseSSEEvents = (chunk: string): Array<{ event: string; data: string }> => {\n const events: Array<{ event: string; data: string }> = [];\n const blocks = chunk.split('\\n\\n').filter(Boolean);\n\n for (const block of blocks) {\n let event = '';\n let data = '';\n\n for (const line of block.split('\\n')) {\n if (line.startsWith('event: ')) {\n event = line.slice(7);\n } else if (line.startsWith('data: ')) {\n data = line.slice(6);\n }\n }\n\n if (event && data) {\n events.push({ event, data });\n }\n }\n\n return events;\n};\n\n/**\n * Makes a streaming upload request to the server.\n *\n * We use fetch directly instead of RTK Query's fetchBaseQuery because:\n * 1. We need access to the raw Response to read the body as a stream\n * 2. RTK Query's baseQuery awaits the full response and parses it as JSON,\n * which doesn't work for Server-Sent Events (SSE) streaming\n * 3. The stream must be read incrementally via response.body.getReader()\n * to dispatch progress updates as files upload\n */\nconst fetchUploadStream = async ({\n token,\n formData,\n signal,\n}: {\n token: string | null | undefined;\n formData: FormData;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream`, {\n method: 'POST',\n headers,\n body: formData,\n signal,\n });\n};\n\n/**\n * Makes a streaming upload-from-URLs request to the server.\n * Sends URLs as JSON body instead of FormData.\n */\nconst fetchUrlUploadStream = async ({\n token,\n urls,\n folderId,\n signal,\n}: {\n token: string | null | undefined;\n urls: string[];\n folderId: number | null;\n signal: AbortSignal;\n}): Promise<Response> => {\n const backendURL = window.strapi.backendURL;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return fetch(`${backendURL}/upload/unstable/stream-from-urls`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ urls, folderId }),\n signal,\n });\n};\n\n/**\n * Options for processing an SSE upload stream.\n */\ninterface ProcessSSEStreamOptions {\n response: Response;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n}\n\n/**\n * Processes an SSE stream from the upload endpoint.\n * Dispatches Redux actions for each file event and returns the final result.\n *\n * @param options.response - The fetch Response object with SSE body\n * @param options.dispatch - Redux dispatch function\n * @param options.indexMapper - Optional function to map server indices to state indices (for retry)\n * @param options.logPrefix - Optional prefix for console logs\n * @returns The stream result or null if no files completed\n */\nconst processSSEStream = async ({\n response,\n dispatch,\n indexMapper = (i) => i,\n}: ProcessSSEStreamOptions): Promise<CreateFilesStream.Response | null> => {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let streamResult: CreateFilesStream.Response | null = null;\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete SSE events from the buffer\n const lastDoubleNewline = buffer.lastIndexOf('\\n\\n');\n if (lastDoubleNewline === -1) {\n // No complete events yet, keep buffering\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const completePart = buffer.slice(0, lastDoubleNewline + 2);\n buffer = buffer.slice(lastDoubleNewline + 2);\n\n const events = parseSSEEvents(completePart);\n\n for (const { event, data } of events) {\n const parsed = JSON.parse(data);\n const mappedIndex = indexMapper(parsed.index as number);\n\n switch (event) {\n case 'file:fetching': {\n // URL is being fetched server-side - mark as uploading (processing)\n dispatch(\n setFileUploading({\n name: parsed.url as string,\n index: mappedIndex,\n total: parsed.total as number,\n size: 0,\n })\n );\n break;\n }\n case 'file:uploading': {\n const payload = parsed as CreateFilesStreamEvents.FileUploadingEvent;\n dispatch(\n setFileUploading({\n name: payload.name,\n index: mappedIndex,\n total: payload.total,\n size: payload.size,\n })\n );\n break;\n }\n case 'file:complete': {\n const payload = parsed as CreateFilesStreamEvents.FileCompleteEvent;\n dispatch(\n setFileComplete({\n index: mappedIndex,\n file: payload.file,\n })\n );\n break;\n }\n case 'file:error': {\n const payload = parsed as CreateFilesStreamEvents.FileErrorEvent;\n dispatch(\n setFileError({\n index: mappedIndex,\n name: payload.name,\n message: payload.message,\n })\n );\n break;\n }\n case 'stream:complete': {\n const payload = parsed as CreateFilesStreamEvents.StreamCompleteEvent;\n streamResult = {\n data: payload.data,\n errors: payload.errors,\n };\n break;\n }\n default:\n console.error(`[SSE Upload] unknown event: ${event}`, parsed);\n }\n }\n }\n\n return streamResult;\n};\n\n/**\n * Options for performing a streaming upload.\n */\ninterface PerformStreamUploadOptions {\n token: string | null | undefined;\n formData: FormData;\n abortController: AbortController;\n uploadId: number;\n dispatch: Dispatch;\n indexMapper?: (serverIndex: number) => number;\n onUploadFailed?: (message: string) => void;\n}\n\n/**\n * Error shape returned by upload operations.\n */\ninterface UploadError {\n name: 'UnknownError';\n message: string;\n status?: number;\n}\n\n/**\n * Result of a streaming upload operation.\n * Matches RTK Query's expected return type for queryFn.\n */\ntype UploadResult =\n | { data: CreateFilesStream.Response; error?: undefined }\n | { error: UploadError; data?: undefined };\n\n/**\n * Performs the actual streaming upload to the server.\n * Shared by uploadFilesStream, retryCancelledFilesStream, and uploadFromUrls.\n *\n * @param options - Upload configuration\n * @returns The upload result or error\n */\nconst performStreamUpload = async ({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n indexMapper = (i) => i,\n onUploadFailed = (message) => dispatch(setUploadFailed({ message })),\n}: PerformStreamUploadOptions): Promise<UploadResult> => {\n try {\n const response = await fetchUploadStream({\n token,\n formData,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n onUploadFailed(errorMessage);\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n const streamResult = await processSSEStream({\n response,\n dispatch,\n indexMapper,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return { data: { data: [], errors: [] } };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { error: { name: 'UnknownError', message: 'Upload cancelled' } };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n onUploadFailed(errorMessage);\n\n return {\n error: {\n name: 'UnknownError',\n message: errorMessage,\n },\n };\n }\n};\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n /**\n * Stream upload files to the /upload/unstable/stream endpoint.\n * Reads SSE stream for per-file progress updates.\n */\n uploadFilesStream: builder.mutation<CreateFilesStream.Response, UploadFilesArgs>({\n queryFn: async ({ formData, totalFiles }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract file names and sizes from FormData\n const files = formData.getAll('files') as File[];\n const fileInfoJson = formData.get('fileInfo') as string;\n const fileInfo = JSON.parse(fileInfoJson) as Array<{ name: string }>;\n const fileNames = fileInfo.map((info) => info.name);\n const fileSizes = files.map((file) => file.size);\n\n // Open the progress dialog\n dispatch(openUploadProgress({ totalFiles, fileNames, fileSizes }));\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Store original files for retry functionality\n registerUploadedFiles(uploadId, files);\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n return performStreamUpload({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n });\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Retry uploading cancelled files.\n * Retrieves original File objects and re-uploads only the cancelled ones.\n */\n retryCancelledFilesStream: builder.mutation<CreateFilesStream.Response, void>({\n queryFn: async (_, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n const { uploadId, files: stateFiles } = (getState() as RootState).uploadProgress;\n\n // Get cancelled files with their original indices\n const cancelledFiles = stateFiles.filter((f) => f.status === 'cancelled');\n if (cancelledFiles.length === 0) {\n return { error: { name: 'UnknownError', message: 'No cancelled files to retry' } };\n }\n\n // Get the original File objects\n const originalFiles = getUploadedFiles(uploadId);\n if (!originalFiles) {\n return { error: { name: 'UnknownError', message: 'Original files not found' } };\n }\n\n // Build mapping from new index to original index\n const indexMapping = cancelledFiles.map((f) => f.index);\n const filesToRetry = cancelledFiles.map((f) => originalFiles[f.index]);\n\n // Reset cancelled files to pending\n dispatch(retryCancelledFiles());\n\n // Build FormData for retry\n const formData = new FormData();\n const fileInfoArray = filesToRetry.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: null, // TODO: preserve folder from original upload if needed\n }));\n\n filesToRetry.forEach((file) => {\n formData.append('files', file);\n });\n formData.append('fileInfo', JSON.stringify(fileInfoArray));\n\n // Create abort controller for this retry\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n // Custom error handler: mark individual retried files as failed\n const onUploadFailed = (message: string) => {\n for (const originalIndex of indexMapping) {\n dispatch(\n setFileError({\n index: originalIndex,\n name: stateFiles[originalIndex].name,\n message,\n })\n );\n }\n };\n\n return performStreamUpload({\n token,\n formData,\n abortController,\n uploadId,\n dispatch,\n indexMapper: (serverIndex) => indexMapping[serverIndex],\n onUploadFailed,\n });\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n\n /**\n * Upload files from URLs.\n * Sends URLs to the server which fetches and uploads them.\n */\n uploadFromUrls: builder.mutation<CreateFilesStream.Response, UploadFromUrlsArgs>({\n queryFn: async ({ urls, folderId }, { dispatch, getState }) => {\n const token = (getState() as RootState).admin_app?.token;\n\n // Extract filenames from URLs for the progress dialog\n const fileNames = urls.map((url) => getFilenameFromUrl(url));\n\n // Open progress dialog with all URLs as pending files\n dispatch(\n openUploadProgress({\n totalFiles: urls.length,\n fileNames,\n })\n );\n dispatch(updateProgress(0));\n\n // Get the uploadId from state after dispatching\n const uploadId = (getState() as RootState).uploadProgress.uploadId;\n\n // Create abort controller for this upload\n const abortController = new AbortController();\n registerAbortController(uploadId, abortController);\n\n try {\n // Send URLs to server for fetching and uploading\n const response = await fetchUrlUploadStream({\n token,\n urls,\n folderId,\n signal: abortController.signal,\n });\n\n if (!response.ok || !response.body) {\n unregisterAbortController(uploadId);\n\n let errorMessage = 'Upload request failed';\n try {\n const errorData = await response.json();\n if (errorData.error?.message) {\n errorMessage = errorData.error.message;\n } else if (errorData.message) {\n errorMessage = errorData.message;\n }\n } catch {\n errorMessage = `Upload failed with status ${response.status}`;\n }\n\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError' as const,\n message: errorMessage,\n status: response.status,\n },\n };\n }\n\n // Process SSE stream from server\n const streamResult = await processSSEStream({\n response,\n dispatch,\n });\n\n unregisterAbortController(uploadId);\n\n if (streamResult && streamResult.data.length > 0) {\n return { data: streamResult };\n }\n\n return { data: { data: [], errors: [] } };\n } catch (err) {\n unregisterAbortController(uploadId);\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { error: { name: 'UnknownError' as const, message: 'Upload cancelled' } };\n }\n\n const errorMessage = err instanceof Error ? err.message : 'Network error occurred';\n dispatch(setUploadFailed({ message: errorMessage }));\n\n return {\n error: {\n name: 'UnknownError' as const,\n message: errorMessage,\n },\n };\n }\n },\n invalidatesTags: [{ type: 'Asset', id: 'LIST' }],\n }),\n }),\n });\n\nexport const {\n useUploadFilesStreamMutation,\n useRetryCancelledFilesStreamMutation,\n useUploadFromUrlsMutation,\n} = uploadApi;\nexport { uploadApi };\n"],"names":["uploadedFiles","Map","registerUploadedFiles","uploadId","files","set","getUploadedFiles","get","abortControllers","registerAbortController","controller","unregisterAbortController","delete","abortUpload","abort","parseSSEEvents","chunk","events","blocks","split","filter","Boolean","block","event","data","line","startsWith","slice","push","fetchUploadStream","token","formData","signal","backendURL","window","strapi","headers","Authorization","fetch","method","body","fetchUrlUploadStream","urls","folderId","JSON","stringify","processSSEStream","response","dispatch","indexMapper","i","reader","getReader","decoder","TextDecoder","streamResult","buffer","done","value","read","decode","stream","lastDoubleNewline","lastIndexOf","completePart","parsed","parse","mappedIndex","index","setFileUploading","name","url","total","size","payload","setFileComplete","file","setFileError","message","errors","console","error","performStreamUpload","abortController","onUploadFailed","setUploadFailed","ok","errorMessage","errorData","json","status","length","err","DOMException","Error","uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFilesStream","mutation","queryFn","totalFiles","getState","admin_app","getAll","fileInfoJson","fileInfo","fileNames","map","info","fileSizes","openUploadProgress","updateProgress","uploadProgress","AbortController","invalidatesTags","type","id","retryCancelledFilesStream","_","stateFiles","cancelledFiles","f","originalFiles","indexMapping","filesToRetry","retryCancelledFiles","FormData","fileInfoArray","caption","alternativeText","folder","forEach","append","originalIndex","serverIndex","uploadFromUrls","getFilenameFromUrl","useUploadFilesStreamMutation","useRetryCancelledFilesStreamMutation","useUploadFromUrlsMutation"],"mappings":"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"}
|
|
@@ -57,10 +57,23 @@ const assetsApi = api.uploadApi.injectEndpoints({
|
|
|
57
57
|
id: 'LIST'
|
|
58
58
|
}
|
|
59
59
|
]
|
|
60
|
+
}),
|
|
61
|
+
getAsset: builder.query({
|
|
62
|
+
query: (id)=>({
|
|
63
|
+
url: `/upload/files/${id}`,
|
|
64
|
+
method: 'GET'
|
|
65
|
+
}),
|
|
66
|
+
providesTags: (_result, _error, id)=>[
|
|
67
|
+
{
|
|
68
|
+
type: 'Asset',
|
|
69
|
+
id
|
|
70
|
+
}
|
|
71
|
+
]
|
|
60
72
|
})
|
|
61
73
|
})
|
|
62
74
|
});
|
|
63
|
-
const { useGetAssetsQuery } = assetsApi;
|
|
75
|
+
const { useGetAssetsQuery, useGetAssetQuery } = assetsApi;
|
|
64
76
|
|
|
77
|
+
exports.useGetAssetQuery = useGetAssetQuery;
|
|
65
78
|
exports.useGetAssetsQuery = useGetAssetsQuery;
|
|
66
79
|
//# sourceMappingURL=assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"assets.js","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n GetFiles,\n File,\n Pagination,\n AssetWithPopulatedCreatedBy,\n} from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => {\n const { folder, ...rest } = params as GetAssetsParams;\n\n const queryParams: Record<string, unknown> = { ...rest };\n\n if (folder != null) {\n queryParams['filters'] = {\n $and: [{ folder: { id: folder } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ folder: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/files',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFiles.Response['data']) => response,\n providesTags: (result) =>\n result\n ? [\n ...result.results.map(({ id }) => ({ type: 'Asset' as const, id })),\n { type: 'Asset', id: 'LIST' },\n ]\n : [{ type: 'Asset', id: 'LIST' }],\n }),\n getAsset: builder.query<AssetWithPopulatedCreatedBy, number>({\n query: (id) => ({\n url: `/upload/files/${id}`,\n method: 'GET',\n }),\n providesTags: (_result, _error, id) => [{ type: 'Asset' as const, id }],\n }),\n }),\n});\n\nexport const { useGetAssetsQuery, useGetAssetQuery } = assetsApi;\n"],"names":["assetsApi","uploadApi","injectEndpoints","endpoints","builder","getAssets","query","params","folder","rest","queryParams","$and","id","$null","url","method","config","transformResponse","response","providesTags","result","results","map","type","getAsset","_result","_error","useGetAssetsQuery","useGetAssetQuery"],"mappings":";;;;AAqBA,MAAMA,SAAAA,GAAYC,aAAAA,CAAUC,eAAe,CAAC;IAC1CC,SAAAA,EAAW,CAACC,WAAa;YACvBC,SAAAA,EAAWD,OAAAA,CAAQE,KAAK,CAA4C;gBAClEA,KAAAA,EAAO,CAACC,MAAAA,GAAS,EAAE,GAAA;AACjB,oBAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAM,GAAGF,MAAAA;AAE5B,oBAAA,MAAMG,WAAAA,GAAuC;AAAE,wBAAA,GAAGD;AAAK,qBAAA;AAEvD,oBAAA,IAAID,UAAU,IAAA,EAAM;wBAClBE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAAA,EAAM;AAAC,gCAAA;oCAAEH,MAAAA,EAAQ;wCAAEI,EAAAA,EAAIJ;AAAO;AAAE;AAAE;AACpC,yBAAA;oBACF,CAAA,MAAO;wBACLE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAAA,EAAM;AAAC,gCAAA;oCAAEH,MAAAA,EAAQ;wCAAEI,EAAAA,EAAI;4CAAEC,KAAAA,EAAO;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF,oBAAA;oBAEA,OAAO;wBACLC,GAAAA,EAAK,eAAA;wBACLC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;4BAAET,MAAAA,EAAQG;AAAY;AAChC,qBAAA;AACF,gBAAA,CAAA;AACAO,gBAAAA,iBAAAA,EAAmB,CAACC,QAAAA,GAAwCA,QAAAA;gBAC5DC,YAAAA,EAAc,CAACC,SACbA,MAAAA,GACI;2BACKA,MAAAA,CAAOC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;gCAAEW,IAAAA,EAAM,OAAA;AAAkBX,gCAAAA;6BAAG,CAAA,CAAA;AAChE,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;4BAASX,EAAAA,EAAI;AAAO;qBAC7B,GACD;AAAC,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;4BAASX,EAAAA,EAAI;AAAO;AAAE;AACvC,aAAA,CAAA;YACAY,QAAAA,EAAUpB,OAAAA,CAAQE,KAAK,CAAsC;gBAC3DA,KAAAA,EAAO,CAACM,MAAQ;wBACdE,GAAAA,EAAK,CAAC,cAAc,EAAEF,EAAAA,CAAAA,CAAI;wBAC1BG,MAAAA,EAAQ;qBACV,CAAA;gBACAI,YAAAA,EAAc,CAACM,OAAAA,EAASC,MAAAA,EAAQd,EAAAA,GAAO;AAAC,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;AAAkBX,4BAAAA;AAAG;AAAE;AACzE,aAAA;SACF;AACF,CAAA,CAAA;MAEa,EAAEe,iBAAiB,EAAEC,gBAAgB,EAAE,GAAG5B;;;;;"}
|
|
@@ -55,10 +55,22 @@ const assetsApi = uploadApi.injectEndpoints({
|
|
|
55
55
|
id: 'LIST'
|
|
56
56
|
}
|
|
57
57
|
]
|
|
58
|
+
}),
|
|
59
|
+
getAsset: builder.query({
|
|
60
|
+
query: (id)=>({
|
|
61
|
+
url: `/upload/files/${id}`,
|
|
62
|
+
method: 'GET'
|
|
63
|
+
}),
|
|
64
|
+
providesTags: (_result, _error, id)=>[
|
|
65
|
+
{
|
|
66
|
+
type: 'Asset',
|
|
67
|
+
id
|
|
68
|
+
}
|
|
69
|
+
]
|
|
58
70
|
})
|
|
59
71
|
})
|
|
60
72
|
});
|
|
61
|
-
const { useGetAssetsQuery } = assetsApi;
|
|
73
|
+
const { useGetAssetsQuery, useGetAssetQuery } = assetsApi;
|
|
62
74
|
|
|
63
|
-
export { useGetAssetsQuery };
|
|
75
|
+
export { useGetAssetQuery, useGetAssetsQuery };
|
|
64
76
|
//# sourceMappingURL=assets.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.mjs","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"assets.mjs","sources":["../../../../admin/src/future/services/assets.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n GetFiles,\n File,\n Pagination,\n AssetWithPopulatedCreatedBy,\n} from '../../../../shared/contracts/files';\n\ninterface GetAssetsParams {\n page?: number;\n pageSize?: number;\n folder?: number | null;\n sort?: string;\n}\n\ninterface GetAssetsResponse {\n results: File[];\n pagination: Pagination;\n}\n\nconst assetsApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getAssets: builder.query<GetAssetsResponse, GetAssetsParams | void>({\n query: (params = {}) => {\n const { folder, ...rest } = params as GetAssetsParams;\n\n const queryParams: Record<string, unknown> = { ...rest };\n\n if (folder != null) {\n queryParams['filters'] = {\n $and: [{ folder: { id: folder } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ folder: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/files',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFiles.Response['data']) => response,\n providesTags: (result) =>\n result\n ? [\n ...result.results.map(({ id }) => ({ type: 'Asset' as const, id })),\n { type: 'Asset', id: 'LIST' },\n ]\n : [{ type: 'Asset', id: 'LIST' }],\n }),\n getAsset: builder.query<AssetWithPopulatedCreatedBy, number>({\n query: (id) => ({\n url: `/upload/files/${id}`,\n method: 'GET',\n }),\n providesTags: (_result, _error, id) => [{ type: 'Asset' as const, id }],\n }),\n }),\n});\n\nexport const { useGetAssetsQuery, useGetAssetQuery } = assetsApi;\n"],"names":["assetsApi","uploadApi","injectEndpoints","endpoints","builder","getAssets","query","params","folder","rest","queryParams","$and","id","$null","url","method","config","transformResponse","response","providesTags","result","results","map","type","getAsset","_result","_error","useGetAssetsQuery","useGetAssetQuery"],"mappings":";;AAqBA,MAAMA,SAAAA,GAAYC,SAAAA,CAAUC,eAAe,CAAC;IAC1CC,SAAAA,EAAW,CAACC,WAAa;YACvBC,SAAAA,EAAWD,OAAAA,CAAQE,KAAK,CAA4C;gBAClEA,KAAAA,EAAO,CAACC,MAAAA,GAAS,EAAE,GAAA;AACjB,oBAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAM,GAAGF,MAAAA;AAE5B,oBAAA,MAAMG,WAAAA,GAAuC;AAAE,wBAAA,GAAGD;AAAK,qBAAA;AAEvD,oBAAA,IAAID,UAAU,IAAA,EAAM;wBAClBE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAAA,EAAM;AAAC,gCAAA;oCAAEH,MAAAA,EAAQ;wCAAEI,EAAAA,EAAIJ;AAAO;AAAE;AAAE;AACpC,yBAAA;oBACF,CAAA,MAAO;wBACLE,WAAW,CAAC,UAAU,GAAG;4BACvBC,IAAAA,EAAM;AAAC,gCAAA;oCAAEH,MAAAA,EAAQ;wCAAEI,EAAAA,EAAI;4CAAEC,KAAAA,EAAO;AAAK;AAAE;AAAE;AAAE;AAC7C,yBAAA;AACF,oBAAA;oBAEA,OAAO;wBACLC,GAAAA,EAAK,eAAA;wBACLC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;4BAAET,MAAAA,EAAQG;AAAY;AAChC,qBAAA;AACF,gBAAA,CAAA;AACAO,gBAAAA,iBAAAA,EAAmB,CAACC,QAAAA,GAAwCA,QAAAA;gBAC5DC,YAAAA,EAAc,CAACC,SACbA,MAAAA,GACI;2BACKA,MAAAA,CAAOC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,EAAE,IAAM;gCAAEW,IAAAA,EAAM,OAAA;AAAkBX,gCAAAA;6BAAG,CAAA,CAAA;AAChE,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;4BAASX,EAAAA,EAAI;AAAO;qBAC7B,GACD;AAAC,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;4BAASX,EAAAA,EAAI;AAAO;AAAE;AACvC,aAAA,CAAA;YACAY,QAAAA,EAAUpB,OAAAA,CAAQE,KAAK,CAAsC;gBAC3DA,KAAAA,EAAO,CAACM,MAAQ;wBACdE,GAAAA,EAAK,CAAC,cAAc,EAAEF,EAAAA,CAAAA,CAAI;wBAC1BG,MAAAA,EAAQ;qBACV,CAAA;gBACAI,YAAAA,EAAc,CAACM,OAAAA,EAASC,MAAAA,EAAQd,EAAAA,GAAO;AAAC,wBAAA;4BAAEW,IAAAA,EAAM,OAAA;AAAkBX,4BAAAA;AAAG;AAAE;AACzE,aAAA;SACF;AACF,CAAA,CAAA;MAEa,EAAEe,iBAAiB,EAAEC,gBAAgB,EAAE,GAAG5B;;;;"}
|
|
@@ -62,6 +62,20 @@ const foldersApi = api.uploadApi.injectEndpoints({
|
|
|
62
62
|
];
|
|
63
63
|
}
|
|
64
64
|
}),
|
|
65
|
+
createFolder: builder.mutation({
|
|
66
|
+
query: (body)=>({
|
|
67
|
+
url: '/upload/folders',
|
|
68
|
+
method: 'POST',
|
|
69
|
+
data: body
|
|
70
|
+
}),
|
|
71
|
+
transformResponse: (response)=>response.data,
|
|
72
|
+
invalidatesTags: [
|
|
73
|
+
{
|
|
74
|
+
type: 'Folder',
|
|
75
|
+
id: 'LIST'
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}),
|
|
65
79
|
getFolder: builder.query({
|
|
66
80
|
query: ({ id })=>({
|
|
67
81
|
url: `/upload/folders/${id}`,
|
|
@@ -94,8 +108,9 @@ const foldersApi = api.uploadApi.injectEndpoints({
|
|
|
94
108
|
})
|
|
95
109
|
})
|
|
96
110
|
});
|
|
97
|
-
const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
111
|
+
const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
98
112
|
|
|
113
|
+
exports.useCreateFolderMutation = useCreateFolderMutation;
|
|
99
114
|
exports.useGetFolderQuery = useGetFolderQuery;
|
|
100
115
|
exports.useGetFoldersQuery = useGetFoldersQuery;
|
|
101
116
|
//# sourceMappingURL=folders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folders.js","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"folders.js","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n CreateFolders,\n GetFolder,\n GetFolders,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [{ type: 'Folder', id: 'LIST' }],\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery } = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery"],"mappings":"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"}
|
|
@@ -60,6 +60,20 @@ const foldersApi = uploadApi.injectEndpoints({
|
|
|
60
60
|
];
|
|
61
61
|
}
|
|
62
62
|
}),
|
|
63
|
+
createFolder: builder.mutation({
|
|
64
|
+
query: (body)=>({
|
|
65
|
+
url: '/upload/folders',
|
|
66
|
+
method: 'POST',
|
|
67
|
+
data: body
|
|
68
|
+
}),
|
|
69
|
+
transformResponse: (response)=>response.data,
|
|
70
|
+
invalidatesTags: [
|
|
71
|
+
{
|
|
72
|
+
type: 'Folder',
|
|
73
|
+
id: 'LIST'
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}),
|
|
63
77
|
getFolder: builder.query({
|
|
64
78
|
query: ({ id })=>({
|
|
65
79
|
url: `/upload/folders/${id}`,
|
|
@@ -92,7 +106,7 @@ const foldersApi = uploadApi.injectEndpoints({
|
|
|
92
106
|
})
|
|
93
107
|
})
|
|
94
108
|
});
|
|
95
|
-
const { useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
109
|
+
const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery } = foldersApi;
|
|
96
110
|
|
|
97
|
-
export { useGetFolderQuery, useGetFoldersQuery };
|
|
111
|
+
export { useCreateFolderMutation, useGetFolderQuery, useGetFoldersQuery };
|
|
98
112
|
//# sourceMappingURL=folders.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {
|
|
1
|
+
{"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n CreateFolders,\n GetFolder,\n GetFolders,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [{ type: 'Folder', id: 'LIST' }],\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery } = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;;;AAKA,MAAMA,
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;;;AAKA,MAAMA,gBAAAA,GAAmCC;AACzC,MAAMC,gBAAAA,GAAoDC;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.mjs","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;AAKA,MAAMA,
|
|
1
|
+
{"version":3,"file":"hooks.mjs","sources":["../../../../admin/src/future/store/hooks.ts"],"sourcesContent":["import { Dispatch } from '@reduxjs/toolkit';\nimport { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\n\nimport type { RootState } from './uploadProgress';\n\nconst useTypedDispatch: () => Dispatch = useDispatch;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nexport { useTypedSelector, useTypedDispatch };\n"],"names":["useTypedDispatch","useDispatch","useTypedSelector","useSelector"],"mappings":";;AAKA,MAAMA,gBAAAA,GAAmCC;AACzC,MAAMC,gBAAAA,GAAoDC;;;;"}
|
|
@@ -30,20 +30,23 @@ const uploadProgressSlice = toolkit.createSlice({
|
|
|
30
30
|
state.isVisible = true;
|
|
31
31
|
state.isMinimized = false;
|
|
32
32
|
state.progress = 0;
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Create pending files for upload
|
|
34
|
+
const pendingFiles = action.payload.fileNames.map((name, index)=>({
|
|
35
35
|
name,
|
|
36
36
|
index,
|
|
37
37
|
status: 'pending',
|
|
38
|
-
size: action.payload.fileSizes[index]
|
|
38
|
+
size: action.payload.fileSizes?.[index] ?? 0
|
|
39
39
|
}));
|
|
40
|
+
state.files = pendingFiles;
|
|
41
|
+
state.totalFiles = action.payload.totalFiles;
|
|
40
42
|
state.errors = [];
|
|
41
43
|
state.uploadId += 1;
|
|
42
44
|
},
|
|
43
45
|
setFileUploading (state, action) {
|
|
44
|
-
const { index } = action.payload;
|
|
46
|
+
const { index, size } = action.payload;
|
|
45
47
|
if (state.files[index]) {
|
|
46
48
|
state.files[index].status = 'uploading';
|
|
49
|
+
state.files[index].size = size;
|
|
47
50
|
}
|
|
48
51
|
},
|
|
49
52
|
setFileComplete (state, action) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadProgress.js","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n file?: File;\n error?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n progress: number;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n progress: 0,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n if (files.length === 0) return 0;\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n if (totalSize === 0) {\n // Fallback to count-based if sizes are unknown\n const completed = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((completed / files.length) * 100);\n }\n const completedSize = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .reduce((sum, f) => sum + f.size, 0);\n return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{ totalFiles: number; fileNames: string[]; fileSizes: number[] }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = action.payload.totalFiles;\n state.files = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes[index] || 0,\n }));\n state.errors = [];\n state.uploadId += 1;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n ) {\n const { index } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n }\n },\n setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n const { index, file } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n }\n state.progress = computeProgress(state.files);\n },\n setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n const { index, name, message } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n state.progress = computeProgress(state.files);\n },\n updateProgress(state, action: PayloadAction<number>) {\n state.progress = action.payload;\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.progress = 100;\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n },\n});\n\nexport const {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadProgress.js","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n file?: File;\n error?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n progress: number;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n progress: 0,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n if (files.length === 0) return 0;\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n if (totalSize === 0) {\n // Fallback to count-based if sizes are unknown\n const completed = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((completed / files.length) * 100);\n }\n const completedSize = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .reduce((sum, f) => sum + f.size, 0);\n return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{\n totalFiles: number;\n fileNames: string[];\n fileSizes?: number[];\n }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n state.progress = 0;\n\n // Create pending files for upload\n const pendingFiles: FileProgress[] = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[index] ?? 0,\n }));\n\n state.files = pendingFiles;\n state.totalFiles = action.payload.totalFiles;\n state.errors = [];\n state.uploadId += 1;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n ) {\n const { index, size } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n state.files[index].size = size;\n }\n },\n setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n const { index, file } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n }\n state.progress = computeProgress(state.files);\n },\n setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n const { index, name, message } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n state.progress = computeProgress(state.files);\n },\n updateProgress(state, action: PayloadAction<number>) {\n state.progress = action.payload;\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.progress = 100;\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n },\n});\n\nexport const {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","pendingFiles","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}
|
|
@@ -28,20 +28,23 @@ const uploadProgressSlice = createSlice({
|
|
|
28
28
|
state.isVisible = true;
|
|
29
29
|
state.isMinimized = false;
|
|
30
30
|
state.progress = 0;
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// Create pending files for upload
|
|
32
|
+
const pendingFiles = action.payload.fileNames.map((name, index)=>({
|
|
33
33
|
name,
|
|
34
34
|
index,
|
|
35
35
|
status: 'pending',
|
|
36
|
-
size: action.payload.fileSizes[index]
|
|
36
|
+
size: action.payload.fileSizes?.[index] ?? 0
|
|
37
37
|
}));
|
|
38
|
+
state.files = pendingFiles;
|
|
39
|
+
state.totalFiles = action.payload.totalFiles;
|
|
38
40
|
state.errors = [];
|
|
39
41
|
state.uploadId += 1;
|
|
40
42
|
},
|
|
41
43
|
setFileUploading (state, action) {
|
|
42
|
-
const { index } = action.payload;
|
|
44
|
+
const { index, size } = action.payload;
|
|
43
45
|
if (state.files[index]) {
|
|
44
46
|
state.files[index].status = 'uploading';
|
|
47
|
+
state.files[index].size = size;
|
|
45
48
|
}
|
|
46
49
|
},
|
|
47
50
|
setFileComplete (state, action) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadProgress.mjs","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n file?: File;\n error?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n progress: number;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n progress: 0,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n if (files.length === 0) return 0;\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n if (totalSize === 0) {\n // Fallback to count-based if sizes are unknown\n const completed = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((completed / files.length) * 100);\n }\n const completedSize = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .reduce((sum, f) => sum + f.size, 0);\n return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{ totalFiles: number; fileNames: string[]; fileSizes: number[] }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = action.payload.totalFiles;\n state.files = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes[index] || 0,\n }));\n state.errors = [];\n state.uploadId += 1;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n ) {\n const { index } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n }\n },\n setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n const { index, file } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n }\n state.progress = computeProgress(state.files);\n },\n setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n const { index, name, message } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n state.progress = computeProgress(state.files);\n },\n updateProgress(state, action: PayloadAction<number>) {\n state.progress = action.payload;\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.progress = 100;\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n },\n});\n\nexport const {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadProgress.mjs","sources":["../../../../admin/src/future/store/uploadProgress.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n file?: File;\n error?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n progress: number;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n progress: 0,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n};\n\nconst computeProgress = (files: FileProgress[]): number => {\n if (files.length === 0) return 0;\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n if (totalSize === 0) {\n // Fallback to count-based if sizes are unknown\n const completed = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((completed / files.length) * 100);\n }\n const completedSize = files\n .filter((f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled')\n .reduce((sum, f) => sum + f.size, 0);\n return Math.round((completedSize / totalSize) * 100);\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{\n totalFiles: number;\n fileNames: string[];\n fileSizes?: number[];\n }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n state.progress = 0;\n\n // Create pending files for upload\n const pendingFiles: FileProgress[] = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[index] ?? 0,\n }));\n\n state.files = pendingFiles;\n state.totalFiles = action.payload.totalFiles;\n state.errors = [];\n state.uploadId += 1;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; total: number; size: number }>\n ) {\n const { index, size } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n state.files[index].size = size;\n }\n },\n setFileComplete(state, action: PayloadAction<{ index: number; file: File }>) {\n const { index, file } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n }\n state.progress = computeProgress(state.files);\n },\n setFileError(state, action: PayloadAction<{ index: number; name: string; message: string }>) {\n const { index, name, message } = action.payload;\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n state.progress = computeProgress(state.files);\n },\n updateProgress(state, action: PayloadAction<number>) {\n state.progress = action.payload;\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.progress = 0;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.progress = 100;\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n };\n }\n return file;\n });\n state.progress = computeProgress(state.files);\n },\n },\n});\n\nexport const {\n openUploadProgress,\n setFileUploading,\n setFileComplete,\n setFileError,\n updateProgress,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","progress","totalFiles","files","errors","uploadId","computeProgress","length","totalSize","reduce","sum","f","size","completed","filter","status","Math","round","completedSize","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","pendingFiles","payload","fileNames","map","index","fileSizes","setFileUploading","setFileComplete","file","setFileError","message","error","updateProgress","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","actions","uploadProgressReducer","reducer"],"mappings":"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"}
|