@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
|
@@ -8,27 +8,40 @@ var designSystem = require('@strapi/design-system');
|
|
|
8
8
|
var icons = require('@strapi/icons');
|
|
9
9
|
var reactIntl = require('react-intl');
|
|
10
10
|
var styledComponents = require('styled-components');
|
|
11
|
+
var BetaNotice = require('../../components/BetaNotice.js');
|
|
12
|
+
var useAIMetadataEnabled = require('../../hooks/useAIMetadataEnabled.js');
|
|
13
|
+
var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
|
|
11
14
|
var api = require('../../services/api.js');
|
|
12
15
|
var folders = require('../../services/folders.js');
|
|
16
|
+
var settings = require('../../services/settings.js');
|
|
17
|
+
var itemLocations = require('../../utils/itemLocations.js');
|
|
13
18
|
var translations = require('../../utils/translations.js');
|
|
14
19
|
var AssetDetailsDrawer = require('./components/AssetDetails/AssetDetailsDrawer.js');
|
|
15
20
|
var AssetsGrid = require('./components/AssetsGrid.js');
|
|
21
|
+
var AssetsSearchInput = require('./components/AssetsSearchInput.js');
|
|
16
22
|
var AssetsTable = require('./components/AssetsTable.js');
|
|
17
23
|
var BulkActionsBar = require('./components/BulkActionsBar.js');
|
|
18
|
-
var CreateFolderDialog = require('./components/CreateFolderDialog.js');
|
|
19
24
|
var AssetsDndProvider = require('./components/Dnd/AssetsDndProvider.js');
|
|
20
25
|
var UploadDropZone = require('./components/DropZone/UploadDropZone.js');
|
|
21
26
|
var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext.js');
|
|
22
27
|
var EmptyState = require('./components/EmptyState.js');
|
|
28
|
+
var FilterBadges = require('./components/FilterBadges.js');
|
|
29
|
+
var FilterMenu = require('./components/FilterMenu.js');
|
|
30
|
+
var FolderFormDialog = require('./components/FolderFormDialog.js');
|
|
23
31
|
var FolderTree = require('./components/FolderTree/FolderTree.js');
|
|
24
32
|
var ImportFromUrlDialog = require('./components/ImportFromUrlDialog.js');
|
|
25
33
|
var SortMenu = require('./components/SortMenu.js');
|
|
26
34
|
var constants = require('./constants.js');
|
|
35
|
+
var useAssetSearch = require('./hooks/useAssetSearch.js');
|
|
27
36
|
var useAssetSelection = require('./hooks/useAssetSelection.js');
|
|
37
|
+
var useBusyAssets = require('./hooks/useBusyAssets.js');
|
|
28
38
|
var useFolderInfo = require('./hooks/useFolderInfo.js');
|
|
29
39
|
var useFolderNavigation = require('./hooks/useFolderNavigation.js');
|
|
30
40
|
var useInfiniteAssets = require('./hooks/useInfiniteAssets.js');
|
|
41
|
+
var useInfiniteScrollSentinel = require('./hooks/useInfiniteScrollSentinel.js');
|
|
42
|
+
var useListFilters = require('./hooks/useListFilters.js');
|
|
31
43
|
var useListSort = require('./hooks/useListSort.js');
|
|
44
|
+
var buildAssetFilters = require('./utils/buildAssetFilters.js');
|
|
32
45
|
var listQueryKey = require('./utils/listQueryKey.js');
|
|
33
46
|
var mergeMixedList = require('./utils/mergeMixedList.js');
|
|
34
47
|
|
|
@@ -52,46 +65,72 @@ function _interopNamespace(e) {
|
|
|
52
65
|
|
|
53
66
|
var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
|
|
54
67
|
|
|
68
|
+
// The negative bottom margin shrinks the trigger area by a pixel so the 1px
|
|
69
|
+
// sentinel sitting exactly at the fold (when a page's rows happen to fill the
|
|
70
|
+
// viewport) reads as "not visible" and doesn't pull an extra page. It still
|
|
71
|
+
// triggers as soon as the sentinel scrolls a hair into view. Tune the bottom
|
|
72
|
+
// value if the list over- or under-fetches near the fold.
|
|
55
73
|
const INTERSECTION_OPTIONS = {
|
|
56
|
-
threshold: 0
|
|
74
|
+
threshold: 0,
|
|
75
|
+
rootMargin: '0px 0px -1px 0px'
|
|
57
76
|
};
|
|
58
|
-
|
|
77
|
+
// Module-level so the header sentinel's observer isn't rebuilt every render.
|
|
78
|
+
const HEADER_SENTINEL_OPTIONS = {
|
|
79
|
+
threshold: 0
|
|
80
|
+
};
|
|
81
|
+
const ITEM_COUNT_MESSAGE = {
|
|
82
|
+
id: translations.getTranslationKey('header.content.item-count'),
|
|
83
|
+
defaultMessage: '{count, plural, =1 {# item} other {# items}}'
|
|
84
|
+
};
|
|
85
|
+
const SEARCH_RESULTS_COUNT_MESSAGES = {
|
|
86
|
+
both: {
|
|
87
|
+
id: translations.getTranslationKey('header.search-results.count'),
|
|
88
|
+
defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 asset} other {# assets}}'
|
|
89
|
+
},
|
|
90
|
+
folders: {
|
|
91
|
+
id: translations.getTranslationKey('header.search-results.count.folders'),
|
|
92
|
+
defaultMessage: '{numberFolders, plural, one {1 folder} other {# folders}}'
|
|
93
|
+
},
|
|
94
|
+
assets: {
|
|
95
|
+
id: translations.getTranslationKey('header.search-results.count.assets'),
|
|
96
|
+
defaultMessage: '{numberAssets, plural, =0 {0 assets} one {1 asset} other {# assets}}'
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
|
|
100
|
+
if (numberFolders === 0) {
|
|
101
|
+
return SEARCH_RESULTS_COUNT_MESSAGES.assets;
|
|
102
|
+
}
|
|
103
|
+
if (numberAssets === 0) {
|
|
104
|
+
return SEARCH_RESULTS_COUNT_MESSAGES.folders;
|
|
105
|
+
}
|
|
106
|
+
return SEARCH_RESULTS_COUNT_MESSAGES.both;
|
|
107
|
+
};
|
|
108
|
+
const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
|
|
59
109
|
const { formatMessage } = reactIntl.useIntl();
|
|
60
|
-
const { assets, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error } = useInfiniteAssets.useInfiniteAssets({
|
|
61
|
-
folder: folderId,
|
|
62
|
-
sort: assetsSort
|
|
63
|
-
});
|
|
64
|
-
const { data: folders$1 = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
|
|
65
|
-
parentId: folderId,
|
|
66
|
-
sort: foldersSort
|
|
67
|
-
});
|
|
68
110
|
const isGridView = view === constants.viewOptions.GRID;
|
|
69
111
|
const isLoading = isLoadingAssets || isLoadingFolders;
|
|
70
112
|
// "Folders: Mixed with files" — interleave the complete folder list into the
|
|
71
113
|
// loaded asset stream client-side, following the active sort. Table view
|
|
72
114
|
// only: the grid always keeps folders in their own band on top.
|
|
73
115
|
const mixedItems = React.useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList.mergeMixedList({
|
|
74
|
-
folders
|
|
116
|
+
folders,
|
|
75
117
|
assets,
|
|
76
118
|
sort: assetsSort,
|
|
77
119
|
hasNextPage
|
|
78
120
|
}) : null, [
|
|
79
121
|
foldersPosition,
|
|
80
122
|
isGridView,
|
|
81
|
-
folders
|
|
123
|
+
folders,
|
|
82
124
|
assets,
|
|
83
125
|
assetsSort,
|
|
84
126
|
hasNextPage
|
|
85
127
|
]);
|
|
86
|
-
const loadMoreRef =
|
|
87
|
-
if (isVisible && hasNextPage && !isFetchingMore) {
|
|
88
|
-
fetchNextPage();
|
|
89
|
-
}
|
|
90
|
-
}, [
|
|
128
|
+
const loadMoreRef = useInfiniteScrollSentinel.useInfiniteScrollSentinel({
|
|
91
129
|
hasNextPage,
|
|
92
130
|
isFetchingMore,
|
|
93
|
-
fetchNextPage
|
|
94
|
-
|
|
131
|
+
onLoadMore: fetchNextPage,
|
|
132
|
+
options: INTERSECTION_OPTIONS
|
|
133
|
+
});
|
|
95
134
|
if (isLoading) {
|
|
96
135
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
97
136
|
justifyContent: "center",
|
|
@@ -116,20 +155,27 @@ const AssetsView = ({ view, folderId, assetsSort, foldersSort, foldersPosition,
|
|
|
116
155
|
})
|
|
117
156
|
});
|
|
118
157
|
}
|
|
119
|
-
if (folders
|
|
120
|
-
|
|
121
|
-
|
|
158
|
+
if (folders.length === 0 && assets.length === 0) {
|
|
159
|
+
// While searching, the search empty state wins (it names the query); a
|
|
160
|
+
// filter-only dead end gets the filtered variant with its Clear action.
|
|
161
|
+
return hasActiveFilters && !searchQuery ? /*#__PURE__*/ jsxRuntime.jsx(EmptyState.FilteredEmptyState, {
|
|
162
|
+
onClearFilters: onClearFilters
|
|
163
|
+
}) : /*#__PURE__*/ jsxRuntime.jsx(EmptyState.EmptyState, {
|
|
164
|
+
onAddAssets: onAddAssets,
|
|
165
|
+
canAddAssets: canAddAssets,
|
|
166
|
+
searchQuery: searchQuery,
|
|
167
|
+
onClearSearch: onClearSearch
|
|
122
168
|
});
|
|
123
169
|
}
|
|
124
170
|
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
125
171
|
children: [
|
|
126
172
|
isGridView ? /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
|
|
127
|
-
folders: folders
|
|
173
|
+
folders: folders,
|
|
128
174
|
assets: assets,
|
|
129
175
|
onAssetItemClick: onAssetItemClick
|
|
130
176
|
}) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
|
|
131
177
|
assets: assets,
|
|
132
|
-
folders: folders
|
|
178
|
+
folders: folders,
|
|
133
179
|
mixedItems: mixedItems,
|
|
134
180
|
onAssetItemClick: onAssetItemClick
|
|
135
181
|
}),
|
|
@@ -148,6 +194,10 @@ const AssetsView = ({ view, folderId, assetsSort, foldersSort, foldersPosition,
|
|
|
148
194
|
defaultMessage: 'Loading more assets...'
|
|
149
195
|
})
|
|
150
196
|
})
|
|
197
|
+
}),
|
|
198
|
+
/*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {
|
|
199
|
+
assets: assets,
|
|
200
|
+
locations: locations
|
|
151
201
|
})
|
|
152
202
|
]
|
|
153
203
|
});
|
|
@@ -207,18 +257,128 @@ const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
|
|
|
207
257
|
height: 1.6rem;
|
|
208
258
|
}
|
|
209
259
|
`;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
260
|
+
// A single sticky header — same layout scrolled or not, so the toolbar
|
|
261
|
+
// alignment can't reflow the way the shared sticky header did. Once the list
|
|
262
|
+
// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it
|
|
263
|
+
// off the rows), like the sticky headers elsewhere in the admin. Horizontal
|
|
264
|
+
// padding stays responsive (passed as props); only the vertical rhythm + shadow
|
|
265
|
+
// change here so they can animate.
|
|
266
|
+
const StickyHeader = styledComponents.styled(designSystem.Box)`
|
|
267
|
+
position: sticky;
|
|
268
|
+
top: 0;
|
|
269
|
+
z-index: 2;
|
|
270
|
+
/* Transparent at rest (the grey page shows through); an opaque background +
|
|
271
|
+
shadow appear only once it sticks and content scrolls under it. */
|
|
272
|
+
background: transparent;
|
|
273
|
+
/* Horizontal padding matches the list's default spacing (Layouts.Content /
|
|
274
|
+
RESPONSIVE_DEFAULT_SPACING: 4 / 6 / 10) so the header lines up with the rows. */
|
|
275
|
+
padding: ${({ theme })=>`${theme.spaces[6]} ${theme.spaces[4]}`};
|
|
276
|
+
transition:
|
|
277
|
+
padding 0.2s ease,
|
|
278
|
+
background 0.2s ease,
|
|
279
|
+
box-shadow 0.2s ease;
|
|
213
280
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
281
|
+
${({ theme })=>theme.breakpoints.medium} {
|
|
282
|
+
padding-left: ${({ theme })=>theme.spaces[6]};
|
|
283
|
+
padding-right: ${({ theme })=>theme.spaces[6]};
|
|
284
|
+
}
|
|
285
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
286
|
+
padding-left: ${({ theme })=>theme.spaces[10]};
|
|
287
|
+
padding-right: ${({ theme })=>theme.spaces[10]};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Compacting is scoped to medium and up, where the header actually sticks. On
|
|
291
|
+
mobile it scrolls away with the list, so shrinking it mid-scroll animated a
|
|
292
|
+
header the user could no longer see — the transition read as a glitch on the
|
|
293
|
+
way back up rather than as the header settling. */
|
|
294
|
+
${({ $compact, theme })=>$compact && styledComponents.css`
|
|
295
|
+
${theme.breakpoints.medium} {
|
|
296
|
+
padding-top: ${theme.spaces[3]};
|
|
297
|
+
padding-bottom: ${theme.spaces[3]};
|
|
298
|
+
padding-left: ${theme.spaces[4]};
|
|
299
|
+
padding-right: ${theme.spaces[4]};
|
|
300
|
+
background: ${theme.colors.neutral0};
|
|
301
|
+
box-shadow: ${theme.shadows.tableShadow};
|
|
302
|
+
}
|
|
303
|
+
${theme.breakpoints.large} {
|
|
304
|
+
padding-left: ${theme.spaces[6]};
|
|
305
|
+
padding-right: ${theme.spaces[6]};
|
|
306
|
+
}
|
|
307
|
+
`}
|
|
308
|
+
`;
|
|
309
|
+
// New button aligns with the title, not the toolbar.
|
|
310
|
+
const TitleRow = styledComponents.styled(designSystem.Flex)`
|
|
311
|
+
justify-content: space-between;
|
|
312
|
+
align-items: flex-start;
|
|
313
|
+
gap: ${({ theme })=>theme.spaces[4]};
|
|
314
|
+
|
|
315
|
+
h1 {
|
|
316
|
+
font-size: 1.8rem;
|
|
317
|
+
}
|
|
318
|
+
`;
|
|
319
|
+
// Two groups in source order (Filter, Search / Sort, Toggle). Mobile: stacked —
|
|
320
|
+
// Filter+Search on row 1, Sort+Toggle on row 2. Desktop (large+): one row,
|
|
321
|
+
// Filter+Search on the left, Sort+Toggle pushed right.
|
|
322
|
+
const Toolbar = styledComponents.styled(designSystem.Flex)`
|
|
323
|
+
margin-top: ${({ theme })=>theme.spaces[5]};
|
|
324
|
+
flex-direction: column;
|
|
325
|
+
align-items: stretch;
|
|
326
|
+
gap: ${({ theme })=>theme.spaces[3]};
|
|
327
|
+
transition: margin-top 0.2s ease;
|
|
328
|
+
|
|
329
|
+
/* Tightening the gap to the title belongs to the compact header, so it is
|
|
330
|
+
scoped to the breakpoints that compact. On mobile the header never sticks,
|
|
331
|
+
and this was the last thing still shifting as the page scrolled. */
|
|
332
|
+
${({ $compact, theme })=>$compact && styledComponents.css`
|
|
333
|
+
${theme.breakpoints.medium} {
|
|
334
|
+
margin-top: ${theme.spaces[2]};
|
|
335
|
+
}
|
|
336
|
+
`}
|
|
337
|
+
|
|
338
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
339
|
+
flex-direction: row;
|
|
340
|
+
align-items: center;
|
|
341
|
+
justify-content: space-between;
|
|
342
|
+
}
|
|
343
|
+
`;
|
|
344
|
+
const ToolbarGroup = styledComponents.styled(designSystem.Flex)`
|
|
345
|
+
align-items: center;
|
|
346
|
+
gap: ${({ theme })=>theme.spaces[3]};
|
|
347
|
+
`;
|
|
348
|
+
// Filter + Search. On mobile the group fills the row (search grows into it);
|
|
349
|
+
// on desktop it keeps its intrinsic size and sits at the left edge.
|
|
350
|
+
const FilterSearchGroup = styledComponents.styled(ToolbarGroup)``;
|
|
351
|
+
// Sort + Toggle. Mobile: spread across the row (Sort left, Toggle right).
|
|
352
|
+
// Desktop: sit together at the right edge (space-between on the toolbar leaves
|
|
353
|
+
// the empty space between the search and here).
|
|
354
|
+
const SortToggleGroup = styledComponents.styled(ToolbarGroup)`
|
|
355
|
+
justify-content: space-between;
|
|
356
|
+
|
|
357
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
358
|
+
justify-content: flex-end;
|
|
359
|
+
flex: 0 0 auto;
|
|
360
|
+
}
|
|
361
|
+
`;
|
|
362
|
+
// Fills the row on mobile; intrinsic width on desktop.
|
|
363
|
+
const SearchSlot = styledComponents.styled(designSystem.Box)`
|
|
364
|
+
flex: 1;
|
|
365
|
+
|
|
366
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
367
|
+
flex: 0 1 auto;
|
|
368
|
+
}
|
|
369
|
+
`;
|
|
370
|
+
// Toggle labels are hidden below desktop — icons only (buttons keep aria-label).
|
|
371
|
+
const ToggleLabel = styledComponents.styled.span`
|
|
372
|
+
display: none;
|
|
373
|
+
|
|
374
|
+
${({ theme })=>theme.breakpoints.large} {
|
|
375
|
+
display: inline;
|
|
217
376
|
}
|
|
218
377
|
`;
|
|
219
378
|
const AssetsPage = ()=>{
|
|
220
379
|
const { formatMessage } = reactIntl.useIntl();
|
|
221
380
|
const { openDetails } = AssetDetailsDrawer.useAssetDetailsParam();
|
|
381
|
+
const { canCreate, canUpdate } = useMediaLibraryPermissions.useMediaLibraryPermissions();
|
|
222
382
|
const { currentFolderId, navigateToFolderId, navigateToRoot } = useFolderNavigation.useFolderNavigation();
|
|
223
383
|
// Deleted or missing folders (404) need a fetch — handled here, not in
|
|
224
384
|
// `useFolderNavigation` (which only strips malformed ?folder= values).
|
|
@@ -236,16 +396,71 @@ const AssetsPage = ()=>{
|
|
|
236
396
|
navigateToRoot
|
|
237
397
|
]);
|
|
238
398
|
const { title, itemCount } = useFolderInfo.useFolderInfo(currentFolderId);
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
399
|
+
const { searchQuery, isSearching, clearSearch } = useAssetSearch.useAssetSearch();
|
|
400
|
+
const listSort = useListSort.useListSort();
|
|
401
|
+
const listFilters = useListFilters.useListFilters();
|
|
402
|
+
// Resolve relative presets against "now" only when the filters change —
|
|
403
|
+
// keeps the query args (and RTK cache keys) stable between renders.
|
|
404
|
+
const builtFilters = React.useMemo(()=>buildAssetFilters.buildAssetFilters(listFilters.filters, new Date()), // eslint-disable-next-line react-hooks/exhaustive-deps -- serialized is the value identity of filters
|
|
405
|
+
[
|
|
406
|
+
listFilters.serialized
|
|
407
|
+
]);
|
|
408
|
+
const { assets, subscribers: assetPageSubscribers, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets.useInfiniteAssets({
|
|
409
|
+
// The real folder is passed even while searching: the service drops the folder
|
|
410
|
+
// filter when `search` is set, so results are still global. List filters
|
|
411
|
+
// compose with both modes.
|
|
412
|
+
folder: currentFolderId,
|
|
413
|
+
search: searchQuery || undefined,
|
|
414
|
+
sort: listSort.assetsSort,
|
|
415
|
+
filters: builtFilters.fileClauses,
|
|
416
|
+
enabled: builtFilters.showFiles
|
|
417
|
+
});
|
|
418
|
+
const { data: fetchedFolders = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
|
|
419
|
+
parentId: currentFolderId,
|
|
420
|
+
search: searchQuery || undefined,
|
|
421
|
+
sort: listSort.foldersSort,
|
|
422
|
+
filters: builtFilters.folderClauses
|
|
242
423
|
}, {
|
|
424
|
+
skip: !builtFilters.showFolders
|
|
425
|
+
});
|
|
426
|
+
// A type badge can exclude folders structurally (e.g. "Type is Picture").
|
|
427
|
+
const folders$1 = React.useMemo(()=>builtFilters.showFolders ? fetchedFolders : [], [
|
|
428
|
+
builtFilters.showFolders,
|
|
429
|
+
fetchedFolders
|
|
430
|
+
]);
|
|
431
|
+
// Both move affordances (drag and the bulk bar) resolve each item's parent
|
|
432
|
+
// from the rows on screen — while searching, results are global and the
|
|
433
|
+
// folder currently open says nothing about where an item lives.
|
|
434
|
+
const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders$1), [
|
|
435
|
+
assets,
|
|
436
|
+
folders$1
|
|
437
|
+
]);
|
|
438
|
+
const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
|
|
243
439
|
count: itemCount
|
|
244
440
|
});
|
|
245
|
-
const
|
|
246
|
-
id: '
|
|
247
|
-
defaultMessage: '
|
|
441
|
+
const searchResultsTitle = formatMessage({
|
|
442
|
+
id: translations.getTranslationKey('header.search-results'),
|
|
443
|
+
defaultMessage: 'Search results for "{query}"'
|
|
444
|
+
}, {
|
|
445
|
+
query: searchQuery
|
|
446
|
+
});
|
|
447
|
+
const numberFolders = folders$1.length;
|
|
448
|
+
const numberAssets = pagination?.total ?? 0;
|
|
449
|
+
const searchResultsCountLabel = formatMessage(getSearchResultsCountMessage(numberFolders, numberAssets), {
|
|
450
|
+
numberFolders,
|
|
451
|
+
numberAssets
|
|
248
452
|
});
|
|
453
|
+
let pageHeaderTitle;
|
|
454
|
+
if (isSearching) {
|
|
455
|
+
pageHeaderTitle = `${searchResultsTitle} (${searchResultsCountLabel})`;
|
|
456
|
+
} else if (title) {
|
|
457
|
+
pageHeaderTitle = `${title} (${itemCountLabel})`;
|
|
458
|
+
} else {
|
|
459
|
+
pageHeaderTitle = formatMessage({
|
|
460
|
+
id: 'app.loading',
|
|
461
|
+
defaultMessage: 'Loading...'
|
|
462
|
+
});
|
|
463
|
+
}
|
|
249
464
|
const [isCreateFolderDialogOpen, setIsCreateFolderDialogOpen] = React.useState(false);
|
|
250
465
|
// View state
|
|
251
466
|
const [view, setView] = strapiAdmin.usePersistentState(constants.localStorageKeys.view, constants.viewOptions.GRID);
|
|
@@ -255,9 +470,24 @@ const AssetsPage = ()=>{
|
|
|
255
470
|
// Refs
|
|
256
471
|
const fileInputRef = React.useRef(null);
|
|
257
472
|
const uploadDropZoneRef = React.useRef(null);
|
|
473
|
+
// Shrink the sticky header once the list scrolls beneath it. A zero-height
|
|
474
|
+
// sentinel sits at the very top of the scroll content; when it leaves the
|
|
475
|
+
// viewport we're scrolled → compact.
|
|
476
|
+
const [isHeaderCompact, setIsHeaderCompact] = React.useState(false);
|
|
477
|
+
const onHeaderSentinelVisibility = React.useCallback((isVisible)=>setIsHeaderCompact(!isVisible), []);
|
|
478
|
+
const headerSentinelRef = strapiAdmin.useElementOnScreen(onHeaderSentinelVisibility, HEADER_SENTINEL_OPTIONS);
|
|
258
479
|
// Upload handlers
|
|
259
480
|
const [uploadFiles] = api.useUploadFilesMutation();
|
|
260
481
|
const [uploadFromUrls] = api.useUploadFromUrlsMutation();
|
|
482
|
+
// `concurrentUploadRequests` echoes the app config. Missing settings (still
|
|
483
|
+
// loading, no permission) fall back to sequential — never faster than the
|
|
484
|
+
// server asked for.
|
|
485
|
+
const { data: settings$1 } = settings.useGetUploadSettingsQuery();
|
|
486
|
+
const concurrency = settings$1?.data?.concurrentUploadRequests ?? 1;
|
|
487
|
+
// Drives the post-upload AI metadata phase shown per row in the progress
|
|
488
|
+
// dialog. No mime argument: the files are not known until they are picked,
|
|
489
|
+
// and the server filters the batch on the same allowlist anyway.
|
|
490
|
+
const isAiMetadataEnabled = useAIMetadataEnabled.useAIMetadataEnabled();
|
|
261
491
|
const uploadFilesToFolder = async (files, folderId)=>{
|
|
262
492
|
if (files.length === 0) return;
|
|
263
493
|
const formData = new FormData();
|
|
@@ -275,9 +505,11 @@ const AssetsPage = ()=>{
|
|
|
275
505
|
try {
|
|
276
506
|
await uploadFiles({
|
|
277
507
|
formData,
|
|
278
|
-
totalFiles: files.length
|
|
508
|
+
totalFiles: files.length,
|
|
509
|
+
concurrency,
|
|
510
|
+
generateAiMetadata: Boolean(isAiMetadataEnabled)
|
|
279
511
|
}).unwrap();
|
|
280
|
-
} catch
|
|
512
|
+
} catch {
|
|
281
513
|
// Error is already dispatched to store from the API queryFn
|
|
282
514
|
}
|
|
283
515
|
};
|
|
@@ -292,188 +524,239 @@ const AssetsPage = ()=>{
|
|
|
292
524
|
e.target.value = '';
|
|
293
525
|
};
|
|
294
526
|
const handleDrop = async (files)=>{
|
|
527
|
+
// Defence in depth: the provider is `disabled` without `assets.create`
|
|
528
|
+
// (so onDrop won't fire), but guard here too in case it's ever wired live.
|
|
529
|
+
if (!canCreate) return;
|
|
295
530
|
await uploadFilesToFolder(files, currentFolderId);
|
|
296
531
|
};
|
|
297
532
|
const handleUrlUpload = async (urls)=>{
|
|
298
533
|
try {
|
|
299
534
|
await uploadFromUrls({
|
|
300
535
|
urls,
|
|
301
|
-
folderId: currentFolderId
|
|
536
|
+
folderId: currentFolderId,
|
|
537
|
+
generateAiMetadata: Boolean(isAiMetadataEnabled)
|
|
302
538
|
}).unwrap();
|
|
303
|
-
} catch
|
|
539
|
+
} catch {
|
|
304
540
|
// Error is already dispatched to store from the API queryFn
|
|
305
541
|
}
|
|
306
542
|
};
|
|
307
|
-
const listSort = useListSort.useListSort();
|
|
308
543
|
// The view is deliberately absent: table and grid render the same list, so
|
|
309
544
|
// toggling views keeps the selection.
|
|
310
545
|
const listQueryKey$1 = listQueryKey.getListQueryKey({
|
|
311
546
|
folderId: currentFolderId,
|
|
312
|
-
search:
|
|
547
|
+
search: searchQuery,
|
|
313
548
|
// Folder position changes the render order too — selection must reset.
|
|
314
549
|
sort: `${listSort.assetsSort};folders=${listSort.foldersPosition}`,
|
|
315
|
-
filter: null
|
|
550
|
+
filter: listFilters.serialized || null
|
|
316
551
|
});
|
|
317
552
|
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
318
553
|
children: [
|
|
319
554
|
/*#__PURE__*/ jsxRuntime.jsx(UploadDropZoneContext.UploadDropZoneProvider, {
|
|
320
555
|
onDrop: handleDrop,
|
|
556
|
+
disabled: !canCreate,
|
|
321
557
|
children: /*#__PURE__*/ jsxRuntime.jsx(useAssetSelection.AssetSelectionProvider, {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
background: "neutral0",
|
|
558
|
+
disabled: !canUpdate,
|
|
559
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(useBusyAssets.BusyAssetsProvider, {
|
|
560
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(AssetsDndProvider.AssetsDndProvider, {
|
|
561
|
+
locations: itemLocations$1,
|
|
562
|
+
children: [
|
|
563
|
+
/*#__PURE__*/ jsxRuntime.jsx(ClearSelectionOnChange, {
|
|
564
|
+
listQueryKey: listQueryKey$1
|
|
565
|
+
}),
|
|
566
|
+
/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Root, {
|
|
332
567
|
sideNav: /*#__PURE__*/ jsxRuntime.jsx(FolderTree.FolderTree, {
|
|
333
568
|
currentFolderId: currentFolderId,
|
|
569
|
+
showActiveFolder: !isSearching,
|
|
334
570
|
onSelectFolder: navigateToFolderId
|
|
335
571
|
}),
|
|
336
|
-
children:
|
|
337
|
-
/*#__PURE__*/ jsxRuntime.
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
label: formatMessage({
|
|
353
|
-
id: translations.getTranslationKey('new'),
|
|
354
|
-
defaultMessage: 'New'
|
|
355
|
-
}),
|
|
356
|
-
children: [
|
|
357
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
358
|
-
onSelect: ()=>setIsCreateFolderDialogOpen(true),
|
|
359
|
-
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
|
|
360
|
-
children: formatMessage({
|
|
361
|
-
id: translations.getTranslationKey('folder.create.title'),
|
|
362
|
-
defaultMessage: 'New folder'
|
|
363
|
-
})
|
|
364
|
-
}),
|
|
365
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
366
|
-
onSelect: handleFileSelect,
|
|
367
|
-
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
|
|
368
|
-
children: formatMessage({
|
|
369
|
-
id: translations.getTranslationKey('import-files'),
|
|
370
|
-
defaultMessage: 'Import files'
|
|
371
|
-
})
|
|
372
|
-
}),
|
|
373
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
374
|
-
onSelect: ()=>setIsUrlDialogOpen(true),
|
|
375
|
-
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
|
|
376
|
-
children: formatMessage({
|
|
377
|
-
id: translations.getTranslationKey('import-from-url'),
|
|
378
|
-
defaultMessage: 'Import from URL'
|
|
379
|
-
})
|
|
380
|
-
})
|
|
381
|
-
]
|
|
572
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Main, {
|
|
573
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
|
|
574
|
+
ref: uploadDropZoneRef,
|
|
575
|
+
children: [
|
|
576
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
|
|
577
|
+
children: /*#__PURE__*/ jsxRuntime.jsx("input", {
|
|
578
|
+
type: "file",
|
|
579
|
+
ref: fileInputRef,
|
|
580
|
+
onChange: handleFileChange,
|
|
581
|
+
multiple: true
|
|
582
|
+
})
|
|
583
|
+
}),
|
|
584
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
585
|
+
ref: headerSentinelRef,
|
|
586
|
+
height: 0,
|
|
587
|
+
"aria-hidden": true
|
|
382
588
|
}),
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
alignItems: "center",
|
|
386
|
-
gap: 4,
|
|
387
|
-
width: "100%",
|
|
589
|
+
/*#__PURE__*/ jsxRuntime.jsxs(StickyHeader, {
|
|
590
|
+
$compact: isHeaderCompact,
|
|
388
591
|
children: [
|
|
389
|
-
/*#__PURE__*/ jsxRuntime.
|
|
390
|
-
gap: 4,
|
|
391
|
-
alignItems: "center",
|
|
392
|
-
children: "TODO: Filters and search"
|
|
393
|
-
}),
|
|
394
|
-
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
395
|
-
gap: 4,
|
|
396
|
-
alignItems: "stretch",
|
|
592
|
+
/*#__PURE__*/ jsxRuntime.jsxs(TitleRow, {
|
|
397
593
|
children: [
|
|
398
|
-
/*#__PURE__*/ jsxRuntime.jsx(
|
|
399
|
-
|
|
400
|
-
|
|
594
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
595
|
+
variant: "alpha",
|
|
596
|
+
tag: "h1",
|
|
597
|
+
children: pageHeaderTitle
|
|
401
598
|
}),
|
|
402
|
-
/*#__PURE__*/ jsxRuntime.jsxs(
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
id: translations.getTranslationKey('
|
|
408
|
-
defaultMessage: '
|
|
599
|
+
canCreate && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.SimpleMenu, {
|
|
600
|
+
popoverPlacement: "bottom-end",
|
|
601
|
+
variant: "default",
|
|
602
|
+
endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {}),
|
|
603
|
+
label: formatMessage({
|
|
604
|
+
id: translations.getTranslationKey('new'),
|
|
605
|
+
defaultMessage: 'New'
|
|
409
606
|
}),
|
|
410
607
|
children: [
|
|
411
|
-
/*#__PURE__*/ jsxRuntime.
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
608
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
609
|
+
onSelect: ()=>setIsCreateFolderDialogOpen(true),
|
|
610
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Folder, {}),
|
|
611
|
+
children: formatMessage({
|
|
612
|
+
id: translations.getTranslationKey('folder.create.title'),
|
|
613
|
+
defaultMessage: 'New folder'
|
|
614
|
+
})
|
|
615
|
+
}),
|
|
616
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
617
|
+
onSelect: handleFileSelect,
|
|
618
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Files, {}),
|
|
619
|
+
children: formatMessage({
|
|
620
|
+
id: translations.getTranslationKey('import-files'),
|
|
621
|
+
defaultMessage: 'Import files'
|
|
622
|
+
})
|
|
623
|
+
}),
|
|
624
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
625
|
+
onSelect: ()=>setIsUrlDialogOpen(true),
|
|
626
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Link, {}),
|
|
627
|
+
children: formatMessage({
|
|
628
|
+
id: translations.getTranslationKey('import-from-url'),
|
|
629
|
+
defaultMessage: 'Import from URL'
|
|
630
|
+
})
|
|
631
|
+
})
|
|
632
|
+
]
|
|
633
|
+
})
|
|
634
|
+
]
|
|
635
|
+
}),
|
|
636
|
+
/*#__PURE__*/ jsxRuntime.jsxs(Toolbar, {
|
|
637
|
+
$compact: isHeaderCompact,
|
|
638
|
+
children: [
|
|
639
|
+
/*#__PURE__*/ jsxRuntime.jsxs(FilterSearchGroup, {
|
|
640
|
+
children: [
|
|
641
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
642
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(FilterMenu.FilterMenu, {
|
|
643
|
+
listFilters: listFilters
|
|
644
|
+
})
|
|
645
|
+
}),
|
|
646
|
+
/*#__PURE__*/ jsxRuntime.jsx(SearchSlot, {
|
|
647
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(AssetsSearchInput.AssetsSearchInput, {})
|
|
648
|
+
})
|
|
649
|
+
]
|
|
650
|
+
}),
|
|
651
|
+
/*#__PURE__*/ jsxRuntime.jsxs(SortToggleGroup, {
|
|
652
|
+
children: [
|
|
653
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
654
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(SortMenu.SortMenu, {
|
|
655
|
+
sort: listSort,
|
|
656
|
+
showFoldersGroup: !isGridView
|
|
657
|
+
})
|
|
424
658
|
}),
|
|
425
|
-
/*#__PURE__*/ jsxRuntime.jsxs(
|
|
426
|
-
|
|
659
|
+
/*#__PURE__*/ jsxRuntime.jsxs(StyledToggleGroup, {
|
|
660
|
+
type: "single",
|
|
661
|
+
value: isGridView ? 'grid' : 'table',
|
|
662
|
+
onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
|
|
427
663
|
"aria-label": formatMessage({
|
|
428
|
-
id: translations.getTranslationKey('view.
|
|
429
|
-
defaultMessage: '
|
|
664
|
+
id: translations.getTranslationKey('view.switch.label'),
|
|
665
|
+
defaultMessage: 'View options'
|
|
430
666
|
}),
|
|
431
667
|
children: [
|
|
432
|
-
/*#__PURE__*/ jsxRuntime.
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
668
|
+
/*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
|
|
669
|
+
value: "table",
|
|
670
|
+
"aria-label": formatMessage({
|
|
671
|
+
id: translations.getTranslationKey('view.table'),
|
|
672
|
+
defaultMessage: 'Table view'
|
|
673
|
+
}),
|
|
674
|
+
children: [
|
|
675
|
+
/*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
|
|
676
|
+
/*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
|
|
677
|
+
children: formatMessage({
|
|
678
|
+
id: translations.getTranslationKey('view.table'),
|
|
679
|
+
defaultMessage: 'Table view'
|
|
680
|
+
})
|
|
681
|
+
})
|
|
682
|
+
]
|
|
683
|
+
}),
|
|
684
|
+
/*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
|
|
685
|
+
value: "grid",
|
|
686
|
+
"aria-label": formatMessage({
|
|
687
|
+
id: translations.getTranslationKey('view.grid'),
|
|
688
|
+
defaultMessage: 'Grid view'
|
|
689
|
+
}),
|
|
690
|
+
children: [
|
|
691
|
+
/*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
|
|
692
|
+
/*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
|
|
693
|
+
children: formatMessage({
|
|
694
|
+
id: translations.getTranslationKey('view.grid'),
|
|
695
|
+
defaultMessage: 'Grid view'
|
|
696
|
+
})
|
|
697
|
+
})
|
|
698
|
+
]
|
|
436
699
|
})
|
|
437
700
|
]
|
|
438
701
|
})
|
|
439
702
|
]
|
|
440
703
|
})
|
|
441
704
|
]
|
|
705
|
+
}),
|
|
706
|
+
/*#__PURE__*/ jsxRuntime.jsx(FilterBadges.FilterBadges, {
|
|
707
|
+
listFilters: listFilters,
|
|
708
|
+
compact: isHeaderCompact
|
|
709
|
+
})
|
|
710
|
+
]
|
|
711
|
+
}),
|
|
712
|
+
/*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Content, {
|
|
713
|
+
children: [
|
|
714
|
+
/*#__PURE__*/ jsxRuntime.jsx(BetaNotice.BetaNotice, {}),
|
|
715
|
+
assetPageSubscribers,
|
|
716
|
+
/*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
|
|
717
|
+
children: [
|
|
718
|
+
/*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
|
|
719
|
+
uploadDropZoneRef: uploadDropZoneRef,
|
|
720
|
+
folderName: title
|
|
721
|
+
}),
|
|
722
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
|
|
723
|
+
view: view,
|
|
724
|
+
folders: folders$1,
|
|
725
|
+
isLoadingFolders: isLoadingFolders,
|
|
726
|
+
assets: assets,
|
|
727
|
+
isLoadingAssets: isLoadingAssets,
|
|
728
|
+
isFetchingMore: isFetchingMore,
|
|
729
|
+
hasNextPage: hasNextPage,
|
|
730
|
+
fetchNextPage: fetchNextPage,
|
|
731
|
+
error: assetsError,
|
|
732
|
+
locations: itemLocations$1,
|
|
733
|
+
searchQuery: searchQuery,
|
|
734
|
+
assetsSort: listSort.assetsSort,
|
|
735
|
+
foldersPosition: listSort.foldersPosition,
|
|
736
|
+
hasActiveFilters: listFilters.filters.length > 0,
|
|
737
|
+
onClearFilters: listFilters.clearFilters,
|
|
738
|
+
onAssetItemClick: openDetails,
|
|
739
|
+
onAddAssets: handleFileSelect,
|
|
740
|
+
canAddAssets: canCreate,
|
|
741
|
+
onClearSearch: clearSearch
|
|
742
|
+
})
|
|
743
|
+
]
|
|
442
744
|
})
|
|
443
745
|
]
|
|
444
746
|
})
|
|
445
|
-
|
|
446
|
-
}),
|
|
447
|
-
/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
|
|
448
|
-
children: /*#__PURE__*/ jsxRuntime.jsxs(UploadDropZone.DropZoneWithOverlay, {
|
|
449
|
-
children: [
|
|
450
|
-
/*#__PURE__*/ jsxRuntime.jsx(UploadDropZone.DropFilesMessage, {
|
|
451
|
-
uploadDropZoneRef: uploadDropZoneRef,
|
|
452
|
-
folderName: title
|
|
453
|
-
}),
|
|
454
|
-
/*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
|
|
455
|
-
view: view,
|
|
456
|
-
folderId: currentFolderId,
|
|
457
|
-
assetsSort: listSort.assetsSort,
|
|
458
|
-
foldersSort: listSort.foldersSort,
|
|
459
|
-
foldersPosition: listSort.foldersPosition,
|
|
460
|
-
onAssetItemClick: openDetails,
|
|
461
|
-
onAddAssets: handleFileSelect
|
|
462
|
-
})
|
|
463
|
-
]
|
|
464
|
-
})
|
|
747
|
+
]
|
|
465
748
|
})
|
|
466
|
-
|
|
749
|
+
})
|
|
467
750
|
})
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
]
|
|
751
|
+
]
|
|
752
|
+
})
|
|
471
753
|
})
|
|
472
754
|
})
|
|
473
755
|
}),
|
|
474
|
-
/*#__PURE__*/ jsxRuntime.jsx(
|
|
756
|
+
/*#__PURE__*/ jsxRuntime.jsx(FolderFormDialog.FolderFormDialog, {
|
|
475
757
|
open: isCreateFolderDialogOpen,
|
|
476
|
-
|
|
758
|
+
mode: "create",
|
|
759
|
+
parentFolderName: title,
|
|
477
760
|
parentFolderId: currentFolderId,
|
|
478
761
|
onClose: ()=>setIsCreateFolderDialogOpen(false)
|
|
479
762
|
}),
|