@strapi/upload 5.51.0 → 5.51.2
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/components/Drawer.js +3 -1
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +3 -1
- 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/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 +344 -150
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +343 -149
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -19
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -20
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +218 -37
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +219 -38
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +370 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +368 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.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/Dnd/AssetsDndProvider.js +129 -37
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +131 -39
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
- 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 +408 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +195 -40
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +198 -43
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js +154 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +152 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
- 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 +75 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +71 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.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 +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- 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/hooks/useListSort.js +124 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.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 +29 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
- package/dist/admin/future/services/api.js +163 -28
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +163 -30
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +62 -18
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +62 -19
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +31 -19
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +31 -19
- 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 +33 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
- package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
- package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
- package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.js +31 -0
- package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
- package/dist/admin/future/utils/getFolderLabel.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/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/hooks/useMediaLibraryPermissions.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -0
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
- 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 +6 -0
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
- package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +23 -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 +46 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
- package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -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 +29 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +13 -2
- package/dist/admin/src/future/services/folders.d.ts +7 -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/types/dnd.d.ts +5 -0
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
- package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
- package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
- package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -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 +85 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +85 -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/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/folders.d.ts +1 -1
- package/dist/shared/contracts/settings.d.ts +7 -0
- package/package.json +8 -8
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sort state for the assets list, backed by URL query params so the current
|
|
3
|
+
* ordering is shareable and survives Back/refresh:
|
|
4
|
+
*
|
|
5
|
+
* - `?sort=<rule>` — a single whitelisted rule. Omitted → default (most
|
|
6
|
+
* recent updates).
|
|
7
|
+
* - `?folders=mixed` — folders interleaved with files. Omitted → folders on top.
|
|
8
|
+
*
|
|
9
|
+
* The date rules and the direction rules are mutually exclusive: exactly one
|
|
10
|
+
* rule is active at a time (one checkmark total, like the design mock). Picking
|
|
11
|
+
* an option in one group clears the other; clearing the active option falls
|
|
12
|
+
* back to the default — an unsorted list is not a state the UI offers.
|
|
13
|
+
*/
|
|
14
|
+
export declare const SORT_BY_RULES: {
|
|
15
|
+
readonly oldestUploads: "createdAt:ASC";
|
|
16
|
+
readonly mostRecentUpdates: "updatedAt:DESC";
|
|
17
|
+
};
|
|
18
|
+
export declare const SORT_DIRECTION_RULES: {
|
|
19
|
+
readonly nameAsc: "name:ASC";
|
|
20
|
+
readonly nameDesc: "name:DESC";
|
|
21
|
+
readonly sizeAsc: "size:ASC";
|
|
22
|
+
readonly sizeDesc: "size:DESC";
|
|
23
|
+
};
|
|
24
|
+
export type SortByKey = keyof typeof SORT_BY_RULES;
|
|
25
|
+
export type SortDirectionKey = keyof typeof SORT_DIRECTION_RULES;
|
|
26
|
+
export type FoldersPosition = 'top' | 'mixed';
|
|
27
|
+
export interface ListSort {
|
|
28
|
+
sortBy: SortByKey | null;
|
|
29
|
+
direction: SortDirectionKey | null;
|
|
30
|
+
foldersPosition: FoldersPosition;
|
|
31
|
+
/**
|
|
32
|
+
* The active rule for the files query, e.g. `updatedAt:DESC` — always a
|
|
33
|
+
* single rule since the sort groups are mutually exclusive.
|
|
34
|
+
*/
|
|
35
|
+
assetsSort: string;
|
|
36
|
+
/**
|
|
37
|
+
* Rule applicable to the folders query. In the default state (no sort in the
|
|
38
|
+
* URL) folders keep their alphabetical order so the band matches the sidebar
|
|
39
|
+
* tree; an explicit user sort applies, except size rules (folders have no
|
|
40
|
+
* `size` column), which fall back to alphabetical.
|
|
41
|
+
*/
|
|
42
|
+
foldersSort: string;
|
|
43
|
+
setSortBy: (key: SortByKey | null) => void;
|
|
44
|
+
setDirection: (key: SortDirectionKey | null) => void;
|
|
45
|
+
setFoldersPosition: (position: FoldersPosition) => void;
|
|
46
|
+
}
|
|
47
|
+
export declare const useListSort: () => ListSort;
|
|
@@ -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 {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fingerprint for "which asset list the user is looking at".
|
|
3
|
+
*
|
|
4
|
+
* Selection clears when this key changes (see ClearSelectionOnChange in AssetsPage).
|
|
5
|
+
*
|
|
6
|
+
* Hybrid rule
|
|
7
|
+
* - Folder, search, sort, filter changes → new key → selection clears.
|
|
8
|
+
* - Switching table/grid view does NOT change the key — both views render the
|
|
9
|
+
* same list, so the selection survives the toggle.
|
|
10
|
+
* - Infinite scroll (load more) does NOT change any segment → selection persists.
|
|
11
|
+
*
|
|
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
|
+
*/
|
|
15
|
+
export interface ListQueryKeyInput {
|
|
16
|
+
folderId: number | null;
|
|
17
|
+
search: string;
|
|
18
|
+
/** Composite of asset sort and folder position — both change the render order. */
|
|
19
|
+
sort: string | null;
|
|
20
|
+
/** Null until filter UI ships. */
|
|
21
|
+
filter: string | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Builds a stable fingerprint for the current asset list query.
|
|
25
|
+
*
|
|
26
|
+
* Selection clears when this key changes. Infinite scroll does not change any
|
|
27
|
+
* segment, so selection persists across load-more.
|
|
28
|
+
*/
|
|
29
|
+
export declare const getListQueryKey: ({ folderId, search, sort, filter }: ListQueryKeyInput) => string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { File } from '../../../../../../shared/contracts/files';
|
|
2
|
+
import type { Folder } from '../../../../../../shared/contracts/folders';
|
|
3
|
+
export type MixedItem = {
|
|
4
|
+
kind: 'folder';
|
|
5
|
+
folder: Folder;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'asset';
|
|
8
|
+
asset: File;
|
|
9
|
+
};
|
|
10
|
+
type SortableRecord = {
|
|
11
|
+
name?: string | null;
|
|
12
|
+
createdAt?: string | null;
|
|
13
|
+
updatedAt?: string | null;
|
|
14
|
+
size?: number | null;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Builds a comparator from comma-separated sort rules (`updatedAt:DESC,name:ASC`).
|
|
18
|
+
* Rules apply in order; the first non-equal field decides. Client-side
|
|
19
|
+
* approximation of the server ordering — good enough to slot folders between
|
|
20
|
+
* files that were sorted server-side by the same rules.
|
|
21
|
+
*/
|
|
22
|
+
export declare const buildComparator: (sort: string) => (a: SortableRecord, b: SortableRecord) => number;
|
|
23
|
+
interface MergeMixedListParams {
|
|
24
|
+
folders: Folder[];
|
|
25
|
+
assets: File[];
|
|
26
|
+
/** Combined sort rules used for the assets query. */
|
|
27
|
+
sort: string;
|
|
28
|
+
/**
|
|
29
|
+
* More asset pages exist. A folder may only be placed once we know no
|
|
30
|
+
* not-yet-loaded asset sorts before it — i.e. it compares ≤ the last loaded
|
|
31
|
+
* asset. Later pages release the remaining folders progressively.
|
|
32
|
+
*/
|
|
33
|
+
hasNextPage: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Interleaves the complete folder list into the (possibly partially loaded)
|
|
37
|
+
* asset stream according to the active sort. Ties order folders first.
|
|
38
|
+
*/
|
|
39
|
+
export declare const mergeMixedList: ({ folders, assets, sort, hasNextPage, }: MergeMixedListParams) => MixedItem[];
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure, view-agnostic selection logic for the future Media Library multi-select.
|
|
3
|
+
*
|
|
4
|
+
* Selection covers both assets and folders. Since their numeric ids live in
|
|
5
|
+
* different tables (and can collide), items are tracked as namespaced keys
|
|
6
|
+
* (`asset:1` / `folder:1`). Views build their rendered order as a key array so
|
|
7
|
+
* range / select-all work across the folder and asset sections seamlessly.
|
|
8
|
+
*/
|
|
9
|
+
export type SelectableKind = 'asset' | 'folder';
|
|
10
|
+
export type ItemKey = `${SelectableKind}:${number}`;
|
|
11
|
+
export declare const assetKey: (id: number) => ItemKey;
|
|
12
|
+
export declare const folderKey: (id: number) => ItemKey;
|
|
13
|
+
/** Extracts the numeric ids of one kind from a set of item keys. */
|
|
14
|
+
export declare const getIdsOfKind: (keys: Set<ItemKey>, kind: SelectableKind) => Set<number>;
|
|
15
|
+
export interface SelectionState {
|
|
16
|
+
/** Currently selected item keys (assets and folders). */
|
|
17
|
+
selectedKeys: Set<ItemKey>;
|
|
18
|
+
/** Anchor used as the start of a Shift+click range. */
|
|
19
|
+
anchorKey: ItemKey | null;
|
|
20
|
+
}
|
|
21
|
+
export declare const createEmptySelection: () => SelectionState;
|
|
22
|
+
/**
|
|
23
|
+
* Additive toggle — adds the key if absent, removes it otherwise, without
|
|
24
|
+
* touching the rest of the selection. Used by the item checkbox and Cmd/Ctrl+click.
|
|
25
|
+
* The toggled key becomes the new anchor.
|
|
26
|
+
*/
|
|
27
|
+
export declare const toggleSelection: (state: SelectionState, key: ItemKey) => SelectionState;
|
|
28
|
+
/**
|
|
29
|
+
* Shift+click — selects the contiguous range between the current anchor and the
|
|
30
|
+
* target in render order, replacing the current selection. The anchor stays put.
|
|
31
|
+
*
|
|
32
|
+
* Falls back to a single selection when there is no usable anchor (e.g. first
|
|
33
|
+
* click was a Shift+click, or the anchor is no longer in the list).
|
|
34
|
+
*/
|
|
35
|
+
export declare const selectRange: (state: SelectionState, orderedKeys: ItemKey[], targetKey: ItemKey) => SelectionState;
|
|
36
|
+
/**
|
|
37
|
+
* Select-all — selects every key in the provided ordered array. Used by the header
|
|
38
|
+
* checkbox when not everything is already selected.
|
|
39
|
+
*/
|
|
40
|
+
export declare const selectAll: (orderedKeys: ItemKey[]) => SelectionState;
|
|
41
|
+
export declare const clearSelection: () => SelectionState;
|
|
42
|
+
export interface SelectAllState {
|
|
43
|
+
allSelected: boolean;
|
|
44
|
+
isIndeterminate: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Derives the header checkbox state: everything selected, some (indeterminate),
|
|
48
|
+
* or none. Only considers the currently-rendered items (orderedKeys).
|
|
49
|
+
*/
|
|
50
|
+
export declare const getSelectAllState: (selectedKeys: Set<ItemKey>, orderedKeys: ItemKey[]) => SelectAllState;
|
|
@@ -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[];
|
|
@@ -18,5 +21,13 @@ interface ReplaceAssetArgs {
|
|
|
18
21
|
file: globalThis.File;
|
|
19
22
|
fileInfo?: Partial<UploadFileInfo>;
|
|
20
23
|
}
|
|
21
|
-
export declare const useGetAssetsQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void | GetAssetsParams, 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", GetAssetsResponse, "adminApi">>, useGetAssetQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<number, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useUpdateAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UpdateAssetArgs, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useReplaceAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ReplaceAssetArgs, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useDeleteAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<number, 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"
|
|
22
|
-
|
|
24
|
+
export declare const useGetAssetsQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void | GetAssetsParams, 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", GetAssetsResponse, "adminApi">>, useGetAssetQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<number, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useUpdateAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UpdateAssetArgs, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useReplaceAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ReplaceAssetArgs, 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", AssetWithPopulatedCreatedBy, "adminApi">>, useDeleteAssetMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<number, 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">>, useBulkDeleteItemsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
|
|
25
|
+
fileIds: number[];
|
|
26
|
+
folderIds: number[];
|
|
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">>;
|
|
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';
|
|
@@ -9,11 +9,17 @@ export type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {
|
|
|
9
9
|
};
|
|
10
10
|
interface GetFoldersParams {
|
|
11
11
|
parentId?: number | null;
|
|
12
|
+
/** Comma-separated rules, e.g. `updatedAt:DESC,name:ASC`. Defaults to alphabetical. */
|
|
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>[];
|
|
12
17
|
}
|
|
13
18
|
interface BulkMoveParams {
|
|
14
19
|
fileIds?: number[];
|
|
15
20
|
folderIds?: number[];
|
|
16
|
-
|
|
21
|
+
/** `null` moves the items to the root of the Media Library. */
|
|
22
|
+
destinationFolderId: number | null;
|
|
17
23
|
}
|
|
18
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">>, 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<{
|
|
19
25
|
id: number;
|
|
@@ -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>;
|
|
@@ -16,6 +16,11 @@ export interface FolderTargetData {
|
|
|
16
16
|
id: number;
|
|
17
17
|
name: string;
|
|
18
18
|
}
|
|
19
|
+
export interface FolderTreeTargetData {
|
|
20
|
+
kind: 'folder-tree-target';
|
|
21
|
+
id: number | null;
|
|
22
|
+
name: string;
|
|
23
|
+
}
|
|
19
24
|
export interface BulkMovePayload {
|
|
20
25
|
fileIds: number[];
|
|
21
26
|
folderIds: number[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DragItemData } from '../types/dnd';
|
|
2
|
+
/**
|
|
3
|
+
* Reconstruct the drag set from a bulk-actions selection so the dialog can feed
|
|
4
|
+
* the exact same `DragItemData[]` into `computeValidDropTargets` / the canonical
|
|
5
|
+
* `canDropItemOnFolder` predicate that pointer drag uses.
|
|
6
|
+
*
|
|
7
|
+
* Selection is page-scoped to the current folder, so every selected item shares
|
|
8
|
+
* `currentFolderId` as its location (files → `folderId`, folders → `parentId`).
|
|
9
|
+
* Names are irrelevant to drop validation, so they are left empty.
|
|
10
|
+
*/
|
|
11
|
+
export declare const buildDragSetFromSelection: (selectedIds: ReadonlySet<number>, selectedFolderIds: ReadonlySet<number>, currentFolderId: number | null) => DragItemData[];
|
|
@@ -2,7 +2,7 @@ import type { FolderNode } from '../../../../shared/contracts/folders';
|
|
|
2
2
|
import type { DragItemData } from '../types/dnd';
|
|
3
3
|
export interface CanDropItemOnFolderParams {
|
|
4
4
|
items: DragItemData[];
|
|
5
|
-
targetFolderId: number;
|
|
5
|
+
targetFolderId: number | null;
|
|
6
6
|
folderStructure: FolderNode[];
|
|
7
7
|
}
|
|
8
8
|
export declare const isFolderDescendantOf: (folderStructure: FolderNode[], ancestorId: number, candidateId: number) => boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FolderNode } from '../../../../shared/contracts/folders';
|
|
2
|
+
export interface FlatFolderOption {
|
|
3
|
+
id: number;
|
|
4
|
+
/** Full ancestry label, e.g. "About / Images". */
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Flattens the nested folder structure (`/upload/folder-structure`) into a
|
|
9
|
+
* depth-first list of `{ id, label }` options where the label carries the full
|
|
10
|
+
* ancestry path. Used by destination selects so folders sharing a name stay
|
|
11
|
+
* distinguishable ("About / Images" vs "Tech / Images"), with children listed
|
|
12
|
+
* right under their parent.
|
|
13
|
+
*
|
|
14
|
+
* `excludeSubtreeIds` prunes a folder *and everything below it* in the same
|
|
15
|
+
* single pass — used to drop the selected folders (and their descendants) from
|
|
16
|
+
* bulk-move destinations without re-walking the tree per option.
|
|
17
|
+
*/
|
|
18
|
+
export declare const flattenFolderStructure: (nodes: FolderNode[], excludeSubtreeIds?: ReadonlySet<number>, parentLabel?: string) => FlatFolderOption[];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IntlShape } from 'react-intl';
|
|
2
|
+
interface FormatMoveSuccessArgs {
|
|
3
|
+
formatMessage: IntlShape['formatMessage'];
|
|
4
|
+
count: number;
|
|
5
|
+
source: string;
|
|
6
|
+
destination: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Single source of truth for the bulk-move success wording. Both the DnD drop
|
|
10
|
+
* and the BulkMoveDialog format the toast (and DnD live-region announcement)
|
|
11
|
+
* through here so the two paths stay identical for the same move.
|
|
12
|
+
*/
|
|
13
|
+
export declare const formatMoveSuccessMessage: ({ formatMessage, count, source, destination, }: FormatMoveSuccessArgs) => string;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FolderNode } from '../../../../shared/contracts/folders';
|
|
2
|
+
/**
|
|
3
|
+
* Leaf display name for a folder id. `null` (root) → the Media Library label.
|
|
4
|
+
* Used by both the DnD success toast and the dialog success toast so the two
|
|
5
|
+
* paths name folders identically. Ancestry paths belong only in the dialog's
|
|
6
|
+
* select options (see `flattenFolderStructure`).
|
|
7
|
+
*
|
|
8
|
+
* `id === null` returns `rootLabel`; an unknown id falls back to `rootLabel`
|
|
9
|
+
* too (defensive — mirrors the dialog's previous `?? rootLabel`).
|
|
10
|
+
*/
|
|
11
|
+
export declare const getFolderLabel: (folderStructure: FolderNode[], id: number | null, rootLabel: string) => string;
|
|
@@ -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;
|