@strapi/upload 5.51.1 → 5.52.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/components/AssetCard/VideoPreview.js +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +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/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/future/App.js +3 -3
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs +4 -4
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/BetaNotice.js +72 -0
- package/dist/admin/future/components/BetaNotice.js.map +1 -0
- package/dist/admin/future/components/BetaNotice.mjs +70 -0
- package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
- package/dist/admin/future/components/Drawer.js +18 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +18 -3
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +200 -27
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +453 -170
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +454 -171
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +325 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +323 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +110 -46
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +110 -46
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +95 -67
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +95 -68
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +94 -26
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +96 -28
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +112 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +110 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -56
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -59
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +188 -138
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +191 -141
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +45 -18
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +46 -19
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
- package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterBadges.js +417 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +415 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +453 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +447 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +144 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +142 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +50 -16
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +52 -18
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +125 -148
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +127 -150
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +222 -45
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +223 -46
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
- package/dist/admin/future/services/api.js +187 -28
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +187 -30
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +40 -17
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +40 -17
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +66 -19
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +66 -20
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/services/settings.js +10 -3
- package/dist/admin/future/services/settings.js.map +1 -1
- package/dist/admin/future/services/settings.mjs +10 -3
- package/dist/admin/future/services/settings.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +109 -2
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +105 -3
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
- package/dist/admin/future/utils/getRelationId.js +24 -0
- package/dist/admin/future/utils/getRelationId.js.map +1 -0
- package/dist/admin/future/utils/getRelationId.mjs +22 -0
- package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.js +14 -0
- package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
- package/dist/admin/future/utils/itemLocations.js +40 -0
- package/dist/admin/future/utils/itemLocations.js.map +1 -0
- package/dist/admin/future/utils/itemLocations.mjs +36 -0
- package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
- package/dist/admin/future/utils/itemSource.js +36 -0
- package/dist/admin/future/utils/itemSource.js.map +1 -0
- package/dist/admin/future/utils/itemSource.mjs +32 -0
- package/dist/admin/future/utils/itemSource.mjs.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.js +11 -0
- package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
- package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
- package/dist/admin/hooks/useSelectionState.js +2 -4
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.mjs +2 -4
- package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
- package/dist/admin/index.js +11 -17
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +12 -18
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/shared/constants.js +43 -0
- package/dist/admin/shared/constants.js.map +1 -0
- package/dist/admin/shared/constants.mjs +38 -0
- package/dist/admin/shared/constants.mjs.map +1 -0
- package/dist/admin/src/future/App.d.ts +1 -1
- package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
- package/dist/admin/src/future/components/Drawer.d.ts +5 -1
- package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
- package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
- package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +24 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +21 -1
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
- package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
- package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +26 -0
- package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +20 -0
- package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +27 -3
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
- package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +9 -1
- package/dist/admin/src/future/services/folders.d.ts +9 -1
- package/dist/admin/src/future/services/settings.d.ts +2 -2
- package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
- package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
- package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
- package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
- package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
- package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
- package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
- package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
- package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
- package/dist/admin/src/hooks/useSettings.d.ts +1 -0
- package/dist/admin/src/hooks/useTracking.d.ts +1 -1
- package/dist/admin/src/hooks/useUpload.d.ts +1 -1
- package/dist/admin/translations/en.json.js +73 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +73 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js +33 -9
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlYupSchema.mjs +33 -9
- package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
- package/dist/server/config.js +13 -5
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +13 -5
- 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/controllers/admin-file.js +30 -0
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +30 -0
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +20 -2
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +21 -3
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +1 -2
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +2 -2
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
- package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
- package/dist/server/controllers/validation/admin/settings.js +4 -1
- package/dist/server/controllers/validation/admin/settings.js.map +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
- package/dist/server/routes/admin.js +18 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +18 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js +108 -11
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +108 -11
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/file.js +86 -13
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +87 -14
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +4 -4
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +4 -4
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/shared/constants.js +43 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/constants.mjs +38 -0
- package/dist/server/shared/constants.mjs.map +1 -0
- package/dist/server/src/config.d.ts +2 -0
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/constants.d.ts +2 -1
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +10 -0
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.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/controllers/validation/admin/ai-metadata.d.ts +2 -0
- package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -1
- 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/ai-metadata.d.ts +19 -0
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +12 -2
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +0 -5
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +3 -0
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +35 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/contracts/files.d.ts +25 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/dist/shared/contracts/settings.d.ts +7 -0
- package/package.json +10 -10
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
- package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
|
@@ -1,12 +1,36 @@
|
|
|
1
|
-
import type { File } from '../../../../../../shared/contracts/files';
|
|
1
|
+
import type { File, Pagination } from '../../../../../../shared/contracts/files';
|
|
2
2
|
declare const PAGE_SIZE = 20;
|
|
3
3
|
interface UseInfiniteAssetsOptions {
|
|
4
4
|
folder?: number | null;
|
|
5
5
|
sort?: string;
|
|
6
|
+
search?: string;
|
|
7
|
+
/** Extra `filters[$and]` entries for the files query. */
|
|
8
|
+
filters?: Record<string, unknown>[];
|
|
9
|
+
/** Structural switch: an `is [folder]`-only type badge means no file can match. */
|
|
10
|
+
enabled?: boolean;
|
|
6
11
|
}
|
|
7
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Infinite scroll over `/upload/files`, keeping one accumulated slot per page.
|
|
14
|
+
*
|
|
15
|
+
* The caller MUST render the returned `subscribers` node — that is what keeps
|
|
16
|
+
* every loaded page subscribed, so `{Asset, LIST}` invalidations keep the whole
|
|
17
|
+
* list consistent rather than only the current page.
|
|
18
|
+
*/
|
|
19
|
+
declare const useInfiniteAssets: ({ folder, sort, search, filters, enabled, }?: UseInfiniteAssetsOptions) => {
|
|
8
20
|
assets: File[];
|
|
9
|
-
|
|
21
|
+
subscribers: null;
|
|
22
|
+
pagination: undefined;
|
|
23
|
+
isLoading: boolean;
|
|
24
|
+
isFetchingMore: boolean;
|
|
25
|
+
hasNextPage: boolean;
|
|
26
|
+
fetchNextPage: () => void;
|
|
27
|
+
error: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
assets: File[];
|
|
30
|
+
subscribers: import("react").FunctionComponentElement<{
|
|
31
|
+
children?: import("react").ReactNode | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
pagination: Pagination | undefined;
|
|
10
34
|
isLoading: boolean;
|
|
11
35
|
isFetchingMore: boolean;
|
|
12
36
|
hasNextPage: boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
interface UseInfiniteScrollSentinelArgs {
|
|
2
|
+
/** Whether there is a further page to request. */
|
|
3
|
+
hasNextPage: boolean;
|
|
4
|
+
/** Whether a subsequent page is already in flight. */
|
|
5
|
+
isFetchingMore: boolean;
|
|
6
|
+
/** Called to request the next page. Held in a ref, so it need not be stable. */
|
|
7
|
+
onLoadMore: () => void;
|
|
8
|
+
/**
|
|
9
|
+
* Passed to the `IntersectionObserver`. Read once, when the sentinel node
|
|
10
|
+
* attaches — changing it afterwards does NOT rebuild the observer, so a
|
|
11
|
+
* later `threshold`/`rootMargin` is silently ignored. Pass a stable, ideally
|
|
12
|
+
* module-level, object.
|
|
13
|
+
*/
|
|
14
|
+
options?: IntersectionObserverInit;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Infinite-scroll trigger for the media library list.
|
|
18
|
+
*
|
|
19
|
+
* Returns a callback ref to place on a sentinel element rendered after the last
|
|
20
|
+
* row. Three deliberate choices:
|
|
21
|
+
*
|
|
22
|
+
* 1. **Loading is driven only by fresh observer readings.** A fetch fires from
|
|
23
|
+
* the `IntersectionObserver` callback — never from a state/prop change — so
|
|
24
|
+
* it can't react to a stale `isIntersecting` from before newly loaded rows
|
|
25
|
+
* rendered (which fetched an extra page on every trigger).
|
|
26
|
+
*
|
|
27
|
+
* 2. **Each settled page re-observes the sentinel.** An `IntersectionObserver`
|
|
28
|
+
* only fires on a *transition*. When the sentinel stays on screen (a page
|
|
29
|
+
* that doesn't fill the viewport — tall viewport, short page, grid fitting
|
|
30
|
+
* the whole page) it would never fire again and loading would stall. So when
|
|
31
|
+
* `isFetchingMore` settles back to false we re-observe, forcing a fresh
|
|
32
|
+
* reading against the new layout: still on screen → load the next page;
|
|
33
|
+
* viewport now filled → stop.
|
|
34
|
+
*
|
|
35
|
+
* 3. **A callback ref, not a stable object ref.** The sentinel only mounts once
|
|
36
|
+
* the first page has rendered (the list shows a loader before that). A
|
|
37
|
+
* callback ref (re)binds the observer exactly when the node mounts/unmounts,
|
|
38
|
+
* so the observer can't miss a sentinel that appears after the hook first ran.
|
|
39
|
+
*/
|
|
40
|
+
export declare const useInfiniteScrollSentinel: ({ hasNextPage, isFetchingMore, onLoadMore, options, }: UseInfiniteScrollSentinelArgs) => (node: HTMLElement | null) => void;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter state for the assets list, backed by a single `?filters=` query param
|
|
3
|
+
* so the applied filters are shareable and survive Back/refresh.
|
|
4
|
+
*
|
|
5
|
+
* Serialized grammar — badges separated by `;`, one badge is
|
|
6
|
+
* `<field>:<condition>:<value>`:
|
|
7
|
+
*
|
|
8
|
+
* - `type:is:picture,audio` / `type:not:folder`
|
|
9
|
+
* - `created:within:1week` / `updated:notwithin:3months` / `created:exact:1day`
|
|
10
|
+
* - `created:rangeis:2024-01-01..2024-04-07` / `created:rangenot:...`
|
|
11
|
+
*
|
|
12
|
+
* Relative presets stay relative in the URL on purpose: the badge label
|
|
13
|
+
* ("1 week ago") remains truthful forever and a shared link means "within the
|
|
14
|
+
* last week from whenever it is opened". Resolution to absolute timestamps
|
|
15
|
+
* happens at query-build time (see utils/buildAssetFilters.ts).
|
|
16
|
+
*
|
|
17
|
+
* Several badges for the same field are allowed, even contradictory ones —
|
|
18
|
+
* everything is combined with AND; contradictions simply produce the filtered
|
|
19
|
+
* empty state.
|
|
20
|
+
*/
|
|
21
|
+
export declare const TYPE_VALUES: readonly ["folder", "picture", "audio", "video", "document"];
|
|
22
|
+
export type TypeValue = (typeof TYPE_VALUES)[number];
|
|
23
|
+
export declare const DATE_PRESETS: readonly ["1day", "3days", "1week", "1month", "3months", "6months", "1year"];
|
|
24
|
+
export type DatePreset = (typeof DATE_PRESETS)[number];
|
|
25
|
+
export type TypeCondition = 'is' | 'isNot';
|
|
26
|
+
export type PresetCondition = 'isExactly' | 'withinLast' | 'notWithinLast';
|
|
27
|
+
export type RangeCondition = 'is' | 'isNot';
|
|
28
|
+
export type DateField = 'createdAt' | 'updatedAt';
|
|
29
|
+
export interface TypeFilter {
|
|
30
|
+
kind: 'type';
|
|
31
|
+
condition: TypeCondition;
|
|
32
|
+
values: TypeValue[];
|
|
33
|
+
}
|
|
34
|
+
export interface DatePresetFilter {
|
|
35
|
+
kind: 'date';
|
|
36
|
+
field: DateField;
|
|
37
|
+
mode: 'preset';
|
|
38
|
+
condition: PresetCondition;
|
|
39
|
+
preset: DatePreset;
|
|
40
|
+
}
|
|
41
|
+
export interface DateRangeFilter {
|
|
42
|
+
kind: 'date';
|
|
43
|
+
field: DateField;
|
|
44
|
+
mode: 'range';
|
|
45
|
+
condition: RangeCondition;
|
|
46
|
+
/** Calendar dates, `YYYY-MM-DD`, inclusive on both ends. */
|
|
47
|
+
from: string;
|
|
48
|
+
to: string;
|
|
49
|
+
}
|
|
50
|
+
export type DateFilter = DatePresetFilter | DateRangeFilter;
|
|
51
|
+
export type ListFilter = TypeFilter | DateFilter;
|
|
52
|
+
/**
|
|
53
|
+
* `unknown` on purpose: the query string is user-editable, and qs parses
|
|
54
|
+
* shapes like `?filters[]=a&filters[]=b` into arrays — the guard is what
|
|
55
|
+
* makes the caller's `?filters=` type an assertion rather than a crash.
|
|
56
|
+
*/
|
|
57
|
+
export declare const parseFiltersParam: (raw: unknown) => ListFilter[];
|
|
58
|
+
export declare const serializeFilters: (filters: ListFilter[]) => string;
|
|
59
|
+
export interface ListFilters {
|
|
60
|
+
filters: ListFilter[];
|
|
61
|
+
/** Serialized form — stable fingerprint for list-identity (selection reset). */
|
|
62
|
+
serialized: string;
|
|
63
|
+
addFilter: (filter: ListFilter) => void;
|
|
64
|
+
/** Replaces the badge at `index` (condition or value edited in place). */
|
|
65
|
+
updateFilter: (index: number, filter: ListFilter) => void;
|
|
66
|
+
removeFilter: (index: number) => void;
|
|
67
|
+
clearFilters: () => void;
|
|
68
|
+
}
|
|
69
|
+
export declare const useListFilters: () => ListFilters;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ListFilter } from '../hooks/useListFilters';
|
|
2
|
+
/**
|
|
3
|
+
* Translates the URL filter model into Strapi `filters[$and]` entries for the
|
|
4
|
+
* files and folders queries, and decides the structural visibility of both
|
|
5
|
+
* sections.
|
|
6
|
+
*
|
|
7
|
+
* Relative presets resolve against `now` at build time — the URL stays
|
|
8
|
+
* relative ("within the last week"), only the outgoing query is absolute.
|
|
9
|
+
*
|
|
10
|
+
* Semantics:
|
|
11
|
+
* - Every badge is one `$and` entry (badges combine with AND, per ticket).
|
|
12
|
+
* - Type: `folder` is not a mime — it acts structurally on the folders
|
|
13
|
+
* section. The remaining values map to mime clauses; `document` is the
|
|
14
|
+
* legacy catch-all (mime contains none of image/audio/video — audio
|
|
15
|
+
* included in the exclusion, fixing the legacy quirk).
|
|
16
|
+
* - Dates apply to files and folders alike (folders have both timestamps).
|
|
17
|
+
* - "is exactly <preset>" means the calendar day of `now - delta`.
|
|
18
|
+
* - Ranges are inclusive on both ends (start-of-day .. end-of-day).
|
|
19
|
+
*/
|
|
20
|
+
type QueryClause = Record<string, unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* Parses `YYYY-MM-DD` as a local calendar date — NOT `new Date(value)`, which
|
|
23
|
+
* treats date-only strings as UTC midnight and shifts the day in every
|
|
24
|
+
* timezone west of UTC. Shared by the query builder, the badge labels and the
|
|
25
|
+
* range calendar so all three agree on which day a range endpoint means.
|
|
26
|
+
*/
|
|
27
|
+
export declare const parseCalendarDate: (value: string) => Date;
|
|
28
|
+
export interface BuiltFilters {
|
|
29
|
+
/** Extra `$and` entries for the files query. */
|
|
30
|
+
fileClauses: QueryClause[];
|
|
31
|
+
/** Extra `$and` entries for the folders query (dates only). */
|
|
32
|
+
folderClauses: QueryClause[];
|
|
33
|
+
/**
|
|
34
|
+
* Whether the folders section can show at all. A type badge decides it by
|
|
35
|
+
* evaluating "folder" like any other value: `is` shows folders only when
|
|
36
|
+
* folder is selected; `is not` hides them only when folder is selected.
|
|
37
|
+
*/
|
|
38
|
+
showFolders: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Whether the files list can show at all — false when an `is` type badge
|
|
41
|
+
* selects only "folder" (no file can match).
|
|
42
|
+
*/
|
|
43
|
+
showFiles: boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare const buildAssetFilters: (filters: ListFilter[], now: Date) => BuiltFilters;
|
|
46
|
+
export {};
|
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
* same list, so the selection survives the toggle.
|
|
10
10
|
* - Infinite scroll (load more) does NOT change any segment → selection persists.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* Filter uses a stable default until its header control is wired; that follow-up
|
|
13
|
+
* only passes a real value — no selection logic changes needed.
|
|
14
14
|
*/
|
|
15
15
|
export interface ListQueryKeyInput {
|
|
16
16
|
folderId: number | null;
|
|
17
|
-
/** Empty string until search UI ships. */
|
|
18
17
|
search: string;
|
|
19
|
-
/**
|
|
18
|
+
/** Composite of asset sort and folder position — both change the render order. */
|
|
20
19
|
sort: string | null;
|
|
21
20
|
/** Null until filter UI ships. */
|
|
22
21
|
filter: string | null;
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Dispatch } from '@reduxjs/toolkit';
|
|
2
|
+
import type { CreateFilesStream, File as UploadedFile, UnstableGenerateAIMetadata, UploadFileInfo } from '../../../../shared/contracts/files';
|
|
2
3
|
interface UploadFilesArgs {
|
|
3
4
|
formData: FormData;
|
|
4
5
|
totalFiles: number;
|
|
6
|
+
/**
|
|
7
|
+
* How many files to upload in parallel — the `concurrentUploadRequests`
|
|
8
|
+
* settings value. Defaults to 1 (sequential).
|
|
9
|
+
*/
|
|
10
|
+
concurrency?: number;
|
|
11
|
+
/** Whether AI metadata generation is enabled (EE AI available + `settings.aiMetadata`). */
|
|
12
|
+
generateAiMetadata: boolean;
|
|
5
13
|
}
|
|
6
14
|
interface UploadFromUrlsArgs {
|
|
7
15
|
urls: string[];
|
|
8
16
|
folderId: number | null;
|
|
17
|
+
generateAiMetadata: boolean;
|
|
9
18
|
}
|
|
10
19
|
/**
|
|
11
20
|
* A single file plus the `fileInfo` it was queued with.
|
|
@@ -22,10 +31,33 @@ interface UploadEntry {
|
|
|
22
31
|
* Called from the UploadProgressDialog when the user clicks cancel or close.
|
|
23
32
|
*/
|
|
24
33
|
export declare const abortUpload: (uploadId: number) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Kicks off AI metadata generation for a freshly uploaded file.
|
|
36
|
+
*
|
|
37
|
+
* Deliberately fire-and-forget — the caller must NOT await it:
|
|
38
|
+
* - generation for file N overlaps the upload of file N+1;
|
|
39
|
+
* - a generation failure can never affect the upload result (the upload already
|
|
40
|
+
* succeeded), which is why the promise is fully swallowed here.
|
|
41
|
+
*
|
|
42
|
+
* Every uploaded file is sent, including non-images: the server already classifies
|
|
43
|
+
* them (`ai-metadata.generateForFiles` returns `skipped` for anything whose mime
|
|
44
|
+
* isn't `image/*`) and duplicating that rule here would let the two drift apart.
|
|
45
|
+
* The upshot is that a non-image now reports "Metadata generation skipped" rather
|
|
46
|
+
* than silently showing no metadata state at all.
|
|
47
|
+
*/
|
|
48
|
+
export declare const maybeGenerateMetadata: ({ file, index, uploadId, enabled, dispatch, }: {
|
|
49
|
+
file: UploadedFile;
|
|
50
|
+
index: number;
|
|
51
|
+
uploadId: number;
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
dispatch: Dispatch;
|
|
54
|
+
}) => void;
|
|
25
55
|
declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, import("@reduxjs/toolkit/dist/query/endpointDefinitions").UpdateDefinitions<{}, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", never> & {
|
|
26
56
|
/**
|
|
27
|
-
* Upload files
|
|
28
|
-
*
|
|
57
|
+
* Upload files to `/upload/unstable/upload-file`, one request per file,
|
|
58
|
+
* through a worker pool of `concurrency` parallel requests (default 1 =
|
|
59
|
+
* sequential). Real per-file byte progress comes from
|
|
60
|
+
* `XHR.upload.onprogress`.
|
|
29
61
|
*/
|
|
30
62
|
uploadFiles: import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
|
|
31
63
|
/**
|
|
@@ -39,7 +71,7 @@ declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/t
|
|
|
39
71
|
/**
|
|
40
72
|
* Retry uploading cancelled files.
|
|
41
73
|
* Maps cancelled rows back to their original entries and re-runs only those
|
|
42
|
-
* through the same
|
|
74
|
+
* through the same upload pool with a fresh AbortController.
|
|
43
75
|
*/
|
|
44
76
|
retryCancelledFiles: import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
|
|
45
77
|
/**
|
|
@@ -47,6 +79,22 @@ declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/t
|
|
|
47
79
|
* Sends URLs to the server which fetches and uploads them (SSE flow, unchanged).
|
|
48
80
|
*/
|
|
49
81
|
uploadFromUrls: import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">;
|
|
82
|
+
/**
|
|
83
|
+
* Generate AI metadata (alt text + caption) for the given assets.
|
|
84
|
+
* Synchronous: resolves once every file has been processed and reports the
|
|
85
|
+
* outcome per file, so non-images and individual failures don't fail the
|
|
86
|
+
* whole batch. Existing alt text and captions are never overwritten.
|
|
87
|
+
*
|
|
88
|
+
* Lives here rather than in `assets.ts` because the upload flows dispatch it
|
|
89
|
+
* directly via `initiate()` after each file completes, and `assets.ts` already
|
|
90
|
+
* imports from this module — defining it there would be a circular import.
|
|
91
|
+
* Re-exported from `assets.ts` for the components that consume the hook.
|
|
92
|
+
*/
|
|
93
|
+
generateAiMetadata: import("@reduxjs/toolkit/query").MutationDefinition<{
|
|
94
|
+
fileIds: number[];
|
|
95
|
+
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UnstableGenerateAIMetadata.FileResult[], "adminApi">;
|
|
50
96
|
}, "adminApi", "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", typeof import("@reduxjs/toolkit/query").coreModuleName | typeof import("@reduxjs/toolkit/dist/query/react").reactHooksModuleName>;
|
|
51
|
-
export declare const useUploadFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFileSilentlyMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">>, useRetryCancelledFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFromUrlsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi"
|
|
97
|
+
export declare const useUploadFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFileSilentlyMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">>, useRetryCancelledFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFromUrlsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">>, useGenerateAiMetadataMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
|
|
98
|
+
fileIds: number[];
|
|
99
|
+
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UnstableGenerateAIMetadata.FileResult[], "adminApi">>;
|
|
52
100
|
export { uploadApi };
|
|
@@ -4,6 +4,9 @@ interface GetAssetsParams {
|
|
|
4
4
|
pageSize?: number;
|
|
5
5
|
folder?: number | null;
|
|
6
6
|
sort?: string;
|
|
7
|
+
search?: string;
|
|
8
|
+
/** Extra `filters[$and]` entries (list filters), AND-ed with the folder/search scope. */
|
|
9
|
+
filters?: Record<string, unknown>[];
|
|
7
10
|
}
|
|
8
11
|
interface GetAssetsResponse {
|
|
9
12
|
results: File[];
|
|
@@ -22,4 +25,9 @@ export declare const useGetAssetsQuery: import("@reduxjs/toolkit/dist/query/reac
|
|
|
22
25
|
fileIds: number[];
|
|
23
26
|
folderIds: number[];
|
|
24
27
|
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", unknown, "adminApi">>;
|
|
25
|
-
|
|
28
|
+
/**
|
|
29
|
+
* `generateAiMetadata` is defined in `./api` (the upload flows dispatch it directly
|
|
30
|
+
* after each file completes, and this module imports from there) — re-exported here
|
|
31
|
+
* so asset components keep a single import site for asset-related hooks.
|
|
32
|
+
*/
|
|
33
|
+
export { useGenerateAiMetadataMutation } from './api';
|
|
@@ -11,6 +11,9 @@ interface GetFoldersParams {
|
|
|
11
11
|
parentId?: number | null;
|
|
12
12
|
/** Comma-separated rules, e.g. `updatedAt:DESC,name:ASC`. Defaults to alphabetical. */
|
|
13
13
|
sort?: string;
|
|
14
|
+
search?: string;
|
|
15
|
+
/** Extra `filters[$and]` entries (list filters), AND-ed with the parent/search scope. */
|
|
16
|
+
filters?: Record<string, unknown>[];
|
|
14
17
|
}
|
|
15
18
|
interface BulkMoveParams {
|
|
16
19
|
fileIds?: number[];
|
|
@@ -18,7 +21,12 @@ interface BulkMoveParams {
|
|
|
18
21
|
/** `null` moves the items to the root of the Media Library. */
|
|
19
22
|
destinationFolderId: number | null;
|
|
20
23
|
}
|
|
21
|
-
export declare const useCreateFolderMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<Pick<Folder, "name" | "parent">, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", Folder, "adminApi">>,
|
|
24
|
+
export declare const useCreateFolderMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<Pick<Folder, "name" | "parent">, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", Folder, "adminApi">>, useUpdateFolderMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
|
|
25
|
+
id: number;
|
|
26
|
+
} & {
|
|
27
|
+
name: string;
|
|
28
|
+
parent: number | null;
|
|
29
|
+
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", Folder, "adminApi">>, useGetFoldersQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void | GetFoldersParams, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", Folder[], "adminApi">>, useGetFolderQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<{
|
|
22
30
|
id: number;
|
|
23
31
|
}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", FolderWithCounts, "adminApi">>, useGetAllFoldersQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", Folder[], "adminApi">>, useGetFolderStructureQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", FolderNode[], "adminApi">>, useBulkMoveMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<BulkMoveParams, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", {
|
|
24
32
|
data: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
export {
|
|
1
|
+
declare const useGetUploadSettingsQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", import("../../../../shared/contracts/settings").Settings, "adminApi">>;
|
|
2
|
+
export { useGetUploadSettingsQuery };
|
|
@@ -4,6 +4,14 @@ export interface FileUploadError {
|
|
|
4
4
|
message: string;
|
|
5
5
|
}
|
|
6
6
|
export type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';
|
|
7
|
+
/**
|
|
8
|
+
* AI metadata generation phase for a single row, tracked independently from the
|
|
9
|
+
* upload status: a metadata failure never turns a successful upload into an error.
|
|
10
|
+
* `undefined` means the row has no metadata phase at all, i.e. AI metadata is
|
|
11
|
+
* disabled — non-images do get a phase and come back `skipped` from the server.
|
|
12
|
+
*/
|
|
13
|
+
export type FileMetadataStatus = 'generating' | 'generated' | 'skipped' | 'failed';
|
|
14
|
+
export type FileMetadataResultStatus = Exclude<FileMetadataStatus, 'generating'>;
|
|
7
15
|
export interface FileProgress {
|
|
8
16
|
name: string;
|
|
9
17
|
index: number;
|
|
@@ -12,6 +20,7 @@ export interface FileProgress {
|
|
|
12
20
|
uploadedBytes: number;
|
|
13
21
|
file?: File;
|
|
14
22
|
error?: string;
|
|
23
|
+
metadataStatus?: FileMetadataStatus;
|
|
15
24
|
}
|
|
16
25
|
export interface UploadProgressState {
|
|
17
26
|
isVisible: boolean;
|
|
@@ -35,6 +44,72 @@ export declare const selectAggregateProgress: ((state: RootState) => number) & i
|
|
|
35
44
|
}> & {
|
|
36
45
|
clearCache: () => void;
|
|
37
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Count-based metadata progress across the whole batch: `settled / expected`.
|
|
49
|
+
*
|
|
50
|
+
* Count-based rather than byte-weighted because the generation endpoint answers in one
|
|
51
|
+
* go — there is no intermediate progress to weight.
|
|
52
|
+
*
|
|
53
|
+
* The denominator is every row *expected* to enter the phase, not just those that
|
|
54
|
+
* already have. Generation is fired per file as each upload finishes, so counting only
|
|
55
|
+
* started rows made the denominator grow mid-batch and the percentage jump backwards
|
|
56
|
+
* (1/1 = 100%, then a second row starts and it drops to 1/2 = 50%), which flickered the
|
|
57
|
+
* header subtitle on and off once per file.
|
|
58
|
+
*
|
|
59
|
+
* "Expected" is derived from upload outcome rather than from the AI-metadata flag:
|
|
60
|
+
* - a row still uploading may yet enter the phase, so it counts toward the total;
|
|
61
|
+
* - an errored or cancelled row never will, so it must not — otherwise a batch with
|
|
62
|
+
* one failure could never reach 100%.
|
|
63
|
+
*
|
|
64
|
+
* Returns `null` when nothing has entered the phase and nothing is pending — i.e. AI
|
|
65
|
+
* metadata is off, or the batch is done — so the header can hide the subtitle.
|
|
66
|
+
*/
|
|
67
|
+
export declare const selectMetadataProgress: ((state: RootState) => number | null) & import("reselect").OutputSelectorFields<(args_0: FileProgress[]) => number | null, {
|
|
68
|
+
clearCache: () => void;
|
|
69
|
+
}> & {
|
|
70
|
+
clearCache: () => void;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Whether the metadata phase is still ongoing for the batch as a whole.
|
|
74
|
+
*
|
|
75
|
+
* The header uses this — not `selectMetadataProgress === 100` — to decide when to drop
|
|
76
|
+
* the subtitle. Two distinct reasons the phase can be unfinished:
|
|
77
|
+
* - a row is generating right now;
|
|
78
|
+
* - no row is generating this instant, but rows are still uploading and will enter the
|
|
79
|
+
* phase when they finish.
|
|
80
|
+
*
|
|
81
|
+
* The second clause is what keeps the subtitle stable. Generation for file N typically
|
|
82
|
+
* finishes before file N+1 finishes uploading, so a naive "is anything generating?"
|
|
83
|
+
* check goes false between every pair of files and blinks the subtitle out and back in.
|
|
84
|
+
*/
|
|
85
|
+
export declare const selectIsGeneratingMetadata: ((state: RootState) => boolean) & import("reselect").OutputSelectorFields<(args_0: FileProgress[]) => boolean, {
|
|
86
|
+
clearCache: () => void;
|
|
87
|
+
}> & {
|
|
88
|
+
clearCache: () => void;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* How many rows reached each terminal metadata outcome, for the header's completion
|
|
92
|
+
* message. `null` while the phase is unfinished — or was never entered at all — so the
|
|
93
|
+
* caller has a single check for "there is no settled outcome to report yet".
|
|
94
|
+
*
|
|
95
|
+
* Counts are reported separately rather than collapsed into one total because they are
|
|
96
|
+
* not interchangeable: only `generated` rows actually had metadata written, so only that
|
|
97
|
+
* count can be claimed as a success. A batch of non-images settles entirely on `skipped`,
|
|
98
|
+
* where "generated on 0 files" would be worse than saying nothing.
|
|
99
|
+
*/
|
|
100
|
+
export declare const selectMetadataOutcome: ((state: RootState) => {
|
|
101
|
+
generated: number;
|
|
102
|
+
skipped: number;
|
|
103
|
+
failed: number;
|
|
104
|
+
} | null) & import("reselect").OutputSelectorFields<(args_0: FileProgress[]) => {
|
|
105
|
+
generated: number;
|
|
106
|
+
skipped: number;
|
|
107
|
+
failed: number;
|
|
108
|
+
} | null, {
|
|
109
|
+
clearCache: () => void;
|
|
110
|
+
}> & {
|
|
111
|
+
clearCache: () => void;
|
|
112
|
+
};
|
|
38
113
|
export declare const openUploadProgress: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
39
114
|
totalFiles: number;
|
|
40
115
|
fileNames: string[];
|
|
@@ -53,7 +128,14 @@ export declare const openUploadProgress: import("@reduxjs/toolkit").ActionCreato
|
|
|
53
128
|
index: number;
|
|
54
129
|
name: string;
|
|
55
130
|
message: string;
|
|
56
|
-
}, "uploadProgress/setFileError">,
|
|
131
|
+
}, "uploadProgress/setFileError">, setFileMetadataGenerating: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
132
|
+
index: number;
|
|
133
|
+
uploadId: number;
|
|
134
|
+
}, "uploadProgress/setFileMetadataGenerating">, setFileMetadataResult: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
135
|
+
index: number;
|
|
136
|
+
uploadId: number;
|
|
137
|
+
status: FileMetadataResultStatus;
|
|
138
|
+
}, "uploadProgress/setFileMetadataResult">, addUploadErrors: import("@reduxjs/toolkit").ActionCreatorWithPayload<FileUploadError[], "uploadProgress/addUploadErrors">, closeUploadProgress: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/closeUploadProgress">, toggleMinimize: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/toggleMinimize">, cancelUpload: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/cancelUpload">, setUploadFailed: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
57
139
|
message: string;
|
|
58
140
|
}, "uploadProgress/setUploadFailed">, retryCancelledFiles: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/retryCancelledFiles">;
|
|
59
141
|
export declare const uploadProgressReducer: import("redux").Reducer<UploadProgressState>;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { type ItemLocations } from './itemLocations';
|
|
1
2
|
import type { DragItemData } from '../types/dnd';
|
|
2
3
|
/**
|
|
3
4
|
* Reconstruct the drag set from a bulk-actions selection so the dialog can feed
|
|
4
5
|
* the exact same `DragItemData[]` into `computeValidDropTargets` / the canonical
|
|
5
6
|
* `canDropItemOnFolder` predicate that pointer drag uses.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
8
|
+
* Each item's location comes from the loaded row, not from the folder currently
|
|
9
|
+
* open: search results are global, so a selected item can live anywhere.
|
|
9
10
|
* Names are irrelevant to drop validation, so they are left empty.
|
|
10
11
|
*/
|
|
11
|
-
export declare const buildDragSetFromSelection: (selectedIds: ReadonlySet<number>, selectedFolderIds: ReadonlySet<number>,
|
|
12
|
+
export declare const buildDragSetFromSelection: (selectedIds: ReadonlySet<number>, selectedFolderIds: ReadonlySet<number>, locations: ItemLocations, fallbackFolderId: number | null) => DragItemData[];
|
|
@@ -2,7 +2,13 @@ import type { IntlShape } from 'react-intl';
|
|
|
2
2
|
interface FormatMoveSuccessArgs {
|
|
3
3
|
formatMessage: IntlShape['formatMessage'];
|
|
4
4
|
count: number;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Leaf name of the folder the items came from, or `null` when the move spans
|
|
7
|
+
* several source folders and no single one can be named — a global-search
|
|
8
|
+
* selection can hold items from anywhere. The wording then omits the source
|
|
9
|
+
* rather than naming one folder and implying the rest came from it too.
|
|
10
|
+
*/
|
|
11
|
+
source: string | null;
|
|
6
12
|
destination: string;
|
|
7
13
|
}
|
|
8
14
|
/**
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalise a to-one relation down to its id.
|
|
3
|
+
*
|
|
4
|
+
* The contracts type `File['folder']` and `Folder['parent']` as ids, but the
|
|
5
|
+
* admin populates both (`populate: { folder: true }` on `/upload/files`,
|
|
6
|
+
* `populate: { parent: true }` on `/upload/folders`), so the wire value is an
|
|
7
|
+
* object. Only the id is ever read — move validation compares locations by id.
|
|
8
|
+
*/
|
|
9
|
+
export declare const getRelationId: (relation: number | string | {
|
|
10
|
+
id?: number;
|
|
11
|
+
} | null | undefined) => number | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SyntheticEvent } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* True when the event really originated inside `currentTarget`'s DOM subtree.
|
|
4
|
+
*
|
|
5
|
+
* Portaled content (Radix menus, modals, select popovers) bubbles through the
|
|
6
|
+
* React tree, so a row's handlers see events coming from dialogs rendered by
|
|
7
|
+
* its own children. Guarding on DOM containment keeps those out — without
|
|
8
|
+
* calling `stopPropagation`, which would also kill the native event before it
|
|
9
|
+
* reaches `document`, where Radix listens in order to dismiss its layers.
|
|
10
|
+
*/
|
|
11
|
+
export declare const isEventFromWithin: (event: SyntheticEvent) => boolean;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { File } from '../../../../shared/contracts/files';
|
|
2
|
+
import type { Folder } from '../../../../shared/contracts/folders';
|
|
3
|
+
/**
|
|
4
|
+
* Where each loaded item actually lives, keyed by id.
|
|
5
|
+
*
|
|
6
|
+
* Search results are global, so the folder currently open (`?folder=`) says
|
|
7
|
+
* nothing about a selected item's location. The loaded lists do: the server
|
|
8
|
+
* populates `folder` on `/upload/files` and `parent` on `/upload/folders`.
|
|
9
|
+
*
|
|
10
|
+
* `undefined` means "not in the loaded list" and is distinct from `null`
|
|
11
|
+
* ("lives at the root") — the two lead to different move validation.
|
|
12
|
+
*/
|
|
13
|
+
export interface ItemLocations {
|
|
14
|
+
fileFolderId: (id: number) => number | null | undefined;
|
|
15
|
+
folderParentId: (id: number) => number | null | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Every id misses — used where no list is loaded (e.g. an isolated provider). */
|
|
18
|
+
export declare const emptyItemLocations: ItemLocations;
|
|
19
|
+
/**
|
|
20
|
+
* Build the lookup once per list. Callers memoize on the rows so the identity
|
|
21
|
+
* stays stable: `BulkMoveDialog` memoizes its destination walk on the items
|
|
22
|
+
* derived from it.
|
|
23
|
+
*/
|
|
24
|
+
export declare const buildItemLocations: (assets: File[], folders: Folder[]) => ItemLocations;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve an item's location, falling back to the folder currently open when it
|
|
27
|
+
* is not in the loaded list. The fallback is unreachable in practice — selection
|
|
28
|
+
* clears whenever the list identity changes and infinite scroll only appends —
|
|
29
|
+
* but a stale parent beats silently dropping the item from the move.
|
|
30
|
+
*/
|
|
31
|
+
export declare const locateItem: (locations: ItemLocations, kind: "file" | "folder", id: number, fallbackFolderId: number | null) => number | null;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DragItemData } from '../types/dnd';
|
|
2
|
+
/**
|
|
3
|
+
* Where an item currently lives, regardless of its kind — folders carry their
|
|
4
|
+
* location on `parentId`, files on `folderId`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const sourceFolderIdOf: (item: DragItemData) => number | null;
|
|
7
|
+
/**
|
|
8
|
+
* The one folder every item in a move came from, or `null` when there isn't one.
|
|
9
|
+
*
|
|
10
|
+
* A selection made under a global search can hold items from anywhere, so a move
|
|
11
|
+
* has a nameable source only when the whole set agrees on it. `null` also covers
|
|
12
|
+
* the empty set. Callers pass the result straight to `formatMoveSuccessMessage`,
|
|
13
|
+
* which drops the source from the wording rather than crediting one item's
|
|
14
|
+
* folder to all of them.
|
|
15
|
+
*
|
|
16
|
+
* Note `null` is overloaded on purpose at the *label* level: an item at the
|
|
17
|
+
* Media Library root also has a `null` location, and both cases end up reading
|
|
18
|
+
* as "no folder to name". Use `hasUniformSource` when the difference matters.
|
|
19
|
+
*/
|
|
20
|
+
export declare const uniformSourceFolderId: (items: DragItemData[]) => number | null;
|
|
21
|
+
/** Whether every item in the set came from the same folder. False for an empty set. */
|
|
22
|
+
export declare const hasUniformSource: (items: DragItemData[]) => boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `_q` must be encoded on both hops: `useQueryParams.setQuery` and the fetch
|
|
3
|
+
* client both stringify with `{ encode: false }`, so an unencoded `&` would
|
|
4
|
+
* truncate the query. `qs.parse` decodes `+` as a space, so `+` needs escaping
|
|
5
|
+
* beyond what `encodeURIComponent` does.
|
|
6
|
+
*/
|
|
7
|
+
export declare const encodeSearchQuery: (value: string) => string;
|