@strapi/upload 5.59.0 → 5.61.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/AssetPickerDialog/AssetPickerDialog.js +434 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js +29 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs +27 -0
- package/dist/admin/components/AssetPickerDialog/MediaLibraryPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
- package/dist/admin/components/Drawer.js +12 -7
- package/dist/admin/components/Drawer.js.map +1 -1
- package/dist/admin/components/Drawer.mjs +12 -7
- package/dist/admin/components/Drawer.mjs.map +1 -1
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js +188 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.js.map +1 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs +186 -0
- package/dist/admin/components/EditorFileDropZone/EditorFileDropZone.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +9 -4
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +9 -4
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
- package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +163 -111
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +162 -114
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js +46 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs +43 -0
- package/dist/admin/components/MediaLibraryInput/openAssetDetails.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
- package/dist/admin/components/UploadProgressDialog.js +2 -1
- package/dist/admin/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/components/UploadProgressDialog.mjs +2 -1
- package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/index.js +10 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +10 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +14 -303
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +13 -282
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +2 -2
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +181 -65
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +184 -69
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetPreview.mjs +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
- package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
- package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
- package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +2 -6
- package/dist/admin/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/services/api.js +92 -7
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +91 -9
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
- package/dist/admin/src/components/AssetPickerDialog/MediaLibraryPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
- package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
- package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
- package/dist/admin/src/components/Drawer.d.ts +8 -0
- package/dist/admin/src/components/EditorFileDropZone/EditorFileDropZone.d.ts +21 -0
- package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +7 -1
- package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
- package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
- package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
- package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
- package/dist/admin/src/components/MediaLibraryInput/openAssetDetails.d.ts +10 -0
- package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
- package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +41 -5
- package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
- package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
- package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
- package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
- package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
- package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
- package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
- package/dist/admin/src/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +2 -6
- package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
- package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
- package/dist/admin/src/services/api.d.ts +24 -1
- package/dist/admin/src/store/uploadProgress.d.ts +14 -1
- package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
- package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
- package/dist/admin/store/uploadProgress.js +30 -3
- package/dist/admin/store/uploadProgress.js.map +1 -1
- package/dist/admin/store/uploadProgress.mjs +29 -4
- package/dist/admin/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +24 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +24 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/findFolderPath.js +26 -0
- package/dist/admin/utils/findFolderPath.js.map +1 -0
- package/dist/admin/utils/findFolderPath.mjs +24 -0
- package/dist/admin/utils/findFolderPath.mjs.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.js +33 -0
- package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
- package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
- package/dist/server/audit-logs.js +264 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +255 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +4 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +4 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js +23 -1
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +23 -1
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +5 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +5 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/services/folder.js +48 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +48 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +14 -7
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +14 -7
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js +100 -16
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +102 -18
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +142 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -4
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +11 -11
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +4 -4
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +63 -12
- package/dist/server/src/types.d.ts.map +1 -1
- package/package.json +11 -16
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
- package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { useRBAC } from '@strapi/admin/strapi-admin';
|
|
2
2
|
import { PERMISSIONS } from '../constants.mjs';
|
|
3
3
|
|
|
4
|
-
// Hoisted to module scope (matching the legacy hook): a fresh
|
|
4
|
+
// Hoisted to module scope (matching the legacy hook): a fresh array each render
|
|
5
5
|
// would hand `useRBAC` a new identity every time, re-running its memos for no
|
|
6
6
|
// gain (it guards refetch with a deep `isEqual`, so this is wasted work, not a loop).
|
|
7
|
-
|
|
7
|
+
// `settings` stays out: `useRBAC` names each result after the last segment of the
|
|
8
|
+
// action, so `plugin::upload.settings.read` would also come back as `canRead`.
|
|
9
|
+
const RBAC_PERMISSIONS = [
|
|
10
|
+
...PERMISSIONS.read,
|
|
11
|
+
...PERMISSIONS.create,
|
|
12
|
+
...PERMISSIONS.update,
|
|
13
|
+
...PERMISSIONS.download,
|
|
14
|
+
...PERMISSIONS.copyLink
|
|
15
|
+
];
|
|
8
16
|
/**
|
|
9
17
|
* RBAC gate for the future Media Library UI. Mirrors the legacy hook of the
|
|
10
18
|
* same name: the server already enforces every action route-side (assets and
|
|
@@ -13,6 +21,8 @@ const { main: _main, ...RBAC_PERMISSIONS } = PERMISSIONS;
|
|
|
13
21
|
* hook is what keeps the UI honest so users don't discover a missing
|
|
14
22
|
* permission through a 403.
|
|
15
23
|
*
|
|
24
|
+
* - `canRead` — browse the library (the Content Manager asset picker needs
|
|
25
|
+
* nothing more)
|
|
16
26
|
* - `canCreate` — upload (files, from URL) and New folder
|
|
17
27
|
* - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete
|
|
18
28
|
* (single + bulk), AI metadata — the `assets.update` action covers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMediaLibraryPermissions.mjs","sources":["../../../admin/src/hooks/useMediaLibraryPermissions.ts"],"sourcesContent":["import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\n// Hoisted to module scope (matching the legacy hook): a fresh
|
|
1
|
+
{"version":3,"file":"useMediaLibraryPermissions.mjs","sources":["../../../admin/src/hooks/useMediaLibraryPermissions.ts"],"sourcesContent":["import { useRBAC } from '@strapi/admin/strapi-admin';\n\nimport { PERMISSIONS } from '../constants';\n\n// Hoisted to module scope (matching the legacy hook): a fresh array each render\n// would hand `useRBAC` a new identity every time, re-running its memos for no\n// gain (it guards refetch with a deep `isEqual`, so this is wasted work, not a loop).\n// `settings` stays out: `useRBAC` names each result after the last segment of the\n// action, so `plugin::upload.settings.read` would also come back as `canRead`.\nconst RBAC_PERMISSIONS = [\n ...PERMISSIONS.read,\n ...PERMISSIONS.create,\n ...PERMISSIONS.update,\n ...PERMISSIONS.download,\n ...PERMISSIONS.copyLink,\n];\n\n/**\n * RBAC gate for the future Media Library UI. Mirrors the legacy hook of the\n * same name: the server already enforces every action route-side (assets and\n * folder operations share the asset permissions — folder create requires\n * `assets.create`, folder rename/move/delete require `assets.update`); this\n * hook is what keeps the UI honest so users don't discover a missing\n * permission through a 403.\n *\n * - `canRead` — browse the library (the Content Manager asset picker needs\n * nothing more)\n * - `canCreate` — upload (files, from URL) and New folder\n * - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete\n * (single + bulk), AI metadata — the `assets.update` action covers\n * \"Update (crop, details, replace) + delete\" by definition\n * - `canDownload` / `canCopyLink` — the matching drawer actions\n */\nexport const useMediaLibraryPermissions = () => {\n const { allowedActions, isLoading } = useRBAC(RBAC_PERMISSIONS);\n\n return {\n isLoading,\n // `plugin::upload.read` gates every Media Library endpoint, `GET /upload/settings`\n // included. Entry forms render a media field for roles that lack it, so callers\n // need to know before they ask the server and collect a 403.\n canRead: Boolean(allowedActions.canRead),\n canCreate: Boolean(allowedActions.canCreate),\n canUpdate: Boolean(allowedActions.canUpdate),\n canDownload: Boolean(allowedActions.canDownload),\n canCopyLink: Boolean(allowedActions.canCopyLink),\n };\n};\n"],"names":["RBAC_PERMISSIONS","PERMISSIONS","read","create","update","download","copyLink","useMediaLibraryPermissions","allowedActions","isLoading","useRBAC","canRead","Boolean","canCreate","canUpdate","canDownload","canCopyLink"],"mappings":";;;AAIA;AACA;AACA;AACA;AACA;AACA,MAAMA,gBAAAA,GAAmB;AACpBC,IAAAA,GAAAA,WAAAA,CAAYC,IAAI;AAChBD,IAAAA,GAAAA,WAAAA,CAAYE,MAAM;AAClBF,IAAAA,GAAAA,WAAAA,CAAYG,MAAM;AAClBH,IAAAA,GAAAA,WAAAA,CAAYI,QAAQ;AACpBJ,IAAAA,GAAAA,WAAAA,CAAYK;AAChB,CAAA;AAED;;;;;;;;;;;;;;;UAgBaC,0BAAAA,GAA6B,IAAA;AACxC,IAAA,MAAM,EAAEC,cAAc,EAAEC,SAAS,EAAE,GAAGC,OAAAA,CAAQV,gBAAAA,CAAAA;IAE9C,OAAO;AACLS,QAAAA,SAAAA;;;;QAIAE,OAAAA,EAASC,OAAAA,CAAQJ,eAAeG,OAAO,CAAA;QACvCE,SAAAA,EAAWD,OAAAA,CAAQJ,eAAeK,SAAS,CAAA;QAC3CC,SAAAA,EAAWF,OAAAA,CAAQJ,eAAeM,SAAS,CAAA;QAC3CC,WAAAA,EAAaH,OAAAA,CAAQJ,eAAeO,WAAW,CAAA;QAC/CC,WAAAA,EAAaJ,OAAAA,CAAQJ,eAAeQ,WAAW;AACjD,KAAA;AACF;;;;"}
|
package/dist/admin/index.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var icons = require('@strapi/icons');
|
|
4
4
|
var _package = require('./package.json.js');
|
|
5
|
+
var MediaLibraryPickerDialog = require('./components/AssetPickerDialog/MediaLibraryPickerDialog.js');
|
|
6
|
+
var EditorFileDropZone = require('./components/EditorFileDropZone/EditorFileDropZone.js');
|
|
5
7
|
var MediaLibraryInput$1 = require('./components/MediaLibraryInput/MediaLibraryInput.js');
|
|
6
8
|
var UploadProgressDialog = require('./components/UploadProgressDialog.js');
|
|
7
9
|
var constants = require('./constants.js');
|
|
@@ -81,6 +83,12 @@ const admin = {
|
|
|
81
83
|
{
|
|
82
84
|
name: 'future-global::upload-progress',
|
|
83
85
|
Component: UploadProgressDialog.UploadProgressDialog
|
|
86
|
+
},
|
|
87
|
+
// Lets the Blocks editor take files dropped onto it. Not registered on the
|
|
88
|
+
// legacy Media Library, which has no upload progress dialog to report to.
|
|
89
|
+
{
|
|
90
|
+
name: 'media-library-file-drop-zone',
|
|
91
|
+
Component: EditorFileDropZone.EditorFileDropZone
|
|
84
92
|
}
|
|
85
93
|
]);
|
|
86
94
|
}
|
|
@@ -106,10 +114,11 @@ const admin = {
|
|
|
106
114
|
type: 'media',
|
|
107
115
|
Component: isLegacyMediaLibrary ? MediaLibraryInput.MediaLibraryInput : MediaLibraryInput$1.MediaLibraryInput
|
|
108
116
|
});
|
|
117
|
+
// The picker the Wysiwyg and Blocks editors insert images with.
|
|
109
118
|
app.addComponents([
|
|
110
119
|
{
|
|
111
120
|
name: 'media-library',
|
|
112
|
-
Component: MediaLibraryDialog.MediaLibraryDialog
|
|
121
|
+
Component: isLegacyMediaLibrary ? MediaLibraryDialog.MediaLibraryDialog : MediaLibraryPickerDialog.MediaLibraryPickerDialog
|
|
113
122
|
}
|
|
114
123
|
]);
|
|
115
124
|
app.registerPlugin({
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Images } from '@strapi/icons';
|
|
2
2
|
import pluginPkg from './package.json.mjs';
|
|
3
|
+
import { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog.mjs';
|
|
4
|
+
import { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone.mjs';
|
|
3
5
|
import { MediaLibraryInput as MediaLibraryInput$1 } from './components/MediaLibraryInput/MediaLibraryInput.mjs';
|
|
4
6
|
import { UploadProgressDialog } from './components/UploadProgressDialog.mjs';
|
|
5
7
|
import { PERMISSIONS } from './constants.mjs';
|
|
@@ -77,6 +79,12 @@ const admin = {
|
|
|
77
79
|
{
|
|
78
80
|
name: 'future-global::upload-progress',
|
|
79
81
|
Component: UploadProgressDialog
|
|
82
|
+
},
|
|
83
|
+
// Lets the Blocks editor take files dropped onto it. Not registered on the
|
|
84
|
+
// legacy Media Library, which has no upload progress dialog to report to.
|
|
85
|
+
{
|
|
86
|
+
name: 'media-library-file-drop-zone',
|
|
87
|
+
Component: EditorFileDropZone
|
|
80
88
|
}
|
|
81
89
|
]);
|
|
82
90
|
}
|
|
@@ -102,10 +110,11 @@ const admin = {
|
|
|
102
110
|
type: 'media',
|
|
103
111
|
Component: isLegacyMediaLibrary ? MediaLibraryInput : MediaLibraryInput$1
|
|
104
112
|
});
|
|
113
|
+
// The picker the Wysiwyg and Blocks editors insert images with.
|
|
105
114
|
app.addComponents([
|
|
106
115
|
{
|
|
107
116
|
name: 'media-library',
|
|
108
|
-
Component: MediaLibraryDialog
|
|
117
|
+
Component: isLegacyMediaLibrary ? MediaLibraryDialog : MediaLibraryPickerDialog
|
|
109
118
|
}
|
|
110
119
|
]);
|
|
111
120
|
app.registerPlugin({
|
package/dist/admin/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryPickerDialog } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport { EditorFileDropZone } from './components/EditorFileDropZone/EditorFileDropZone';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { UploadProgressDialog } from './components/UploadProgressDialog';\nimport { PERMISSIONS } from './constants';\nimport { MediaLibraryDialog } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput as LegacyMediaLibraryInput } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport { prefixPluginTranslations } from './legacy/utils/prefixPluginTranslations';\nimport { pluginId } from './pluginId';\nimport { uploadProgressReducer } from './store/uploadProgress';\nimport { getTranslationKey } from './utils/translations';\n\nimport type { MediaLibraryPickerDialogProps } from './components/AssetPickerDialog/MediaLibraryPickerDialog';\nimport type { EditorFileDropZoneProps } from './components/EditorFileDropZone/EditorFileDropZone';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { MediaLibraryDialogProps } from './legacy/components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps as LegacyMediaLibraryInputProps } from './legacy/components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n /**\n * Whichever Media Library is selected owns `plugins/upload` outright: the other is\n * not registered at all, so there is exactly one Media Library entry in the menu.\n *\n * The new one is the default; `useLegacyMediaLibrary` opts back out.\n */\n const isLegacyMediaLibrary = window.strapi.featureFlags.isEnabled('useLegacyMediaLibrary');\n\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: isLegacyMediaLibrary\n ? () => {\n return import('./legacy/pages/App/App').then((mod) => ({ default: mod.Upload }));\n }\n : () => {\n return import('./App').then((mod) => ({\n default: mod.MediaLibrary,\n }));\n },\n position: 4,\n });\n\n if (!isLegacyMediaLibrary) {\n app.addReducers({ uploadProgress: uploadProgressReducer });\n\n app.addComponents([\n {\n name: 'future-global::upload-progress',\n Component: UploadProgressDialog,\n },\n // Lets the Blocks editor take files dropped onto it. Not registered on the\n // legacy Media Library, which has no upload progress dialog to report to.\n {\n name: 'media-library-file-drop-zone',\n Component: EditorFileDropZone as React.FC<Partial<EditorFileDropZoneProps>>,\n },\n ]);\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n },\n Component() {\n return import('./pages/SettingsPage/SettingsPage').then((mod) => ({\n default: mod.ProtectedSettingsPage,\n }));\n },\n permissions: PERMISSIONS.settings,\n });\n\n /**\n * The media field follows the same switch as the menu link above: the\n * current input on the current Media Library, the legacy one when\n * `useLegacyMediaLibrary` opts back out.\n */\n app.addFields({\n type: 'media',\n Component: isLegacyMediaLibrary\n ? (LegacyMediaLibraryInput as React.FC<Partial<LegacyMediaLibraryInputProps>>)\n : (MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>),\n });\n // The picker the Wysiwyg and Blocks editors insert images with.\n app.addComponents([\n {\n name: 'media-library',\n Component: isLegacyMediaLibrary\n ? (MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>)\n : (MediaLibraryPickerDialog as React.FC<Partial<MediaLibraryPickerDialogProps>>),\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","isLegacyMediaLibrary","window","featureFlags","isEnabled","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","MediaLibrary","position","addReducers","uploadProgress","uploadProgressReducer","addComponents","UploadProgressDialog","EditorFileDropZone","addSettingsLink","getTranslationKey","ProtectedSettingsPage","settings","addFields","type","LegacyMediaLibraryInput","MediaLibraryInput","MediaLibraryDialog","MediaLibraryPickerDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var ToggleGroup = require('@radix-ui/react-toggle-group');
|
|
6
5
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
7
6
|
var designSystem = require('@strapi/design-system');
|
|
8
7
|
var icons = require('@strapi/icons');
|
|
@@ -12,73 +11,32 @@ var useAIMetadataEnabled = require('../../hooks/useAIMetadataEnabled.js');
|
|
|
12
11
|
var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
|
|
13
12
|
var useTracking = require('../../hooks/useTracking.js');
|
|
14
13
|
var api = require('../../services/api.js');
|
|
15
|
-
var folders = require('../../services/folders.js');
|
|
16
14
|
var settings = require('../../services/settings.js');
|
|
17
15
|
var itemLocations = require('../../utils/itemLocations.js');
|
|
18
16
|
var translations = require('../../utils/translations.js');
|
|
19
17
|
var typeFromMime = require('../../utils/typeFromMime.js');
|
|
20
18
|
var AssetDetailsDrawer = require('./components/AssetDetails/AssetDetailsDrawer.js');
|
|
21
|
-
var AssetsGrid = require('./components/AssetsGrid.js');
|
|
22
19
|
var AssetsSearchInput = require('./components/AssetsSearchInput.js');
|
|
23
|
-
var
|
|
24
|
-
var BulkActionsBar = require('./components/BulkActionsBar.js');
|
|
20
|
+
var AssetsView = require('./components/AssetsView.js');
|
|
25
21
|
var AssetsDndProvider = require('./components/Dnd/AssetsDndProvider.js');
|
|
26
22
|
var UploadDropZone = require('./components/DropZone/UploadDropZone.js');
|
|
27
23
|
var UploadDropZoneContext = require('./components/DropZone/UploadDropZoneContext.js');
|
|
28
|
-
var EmptyState = require('./components/EmptyState.js');
|
|
29
24
|
var FilterBadges = require('./components/FilterBadges.js');
|
|
30
25
|
var FilterMenu = require('./components/FilterMenu.js');
|
|
31
26
|
var FolderFormDialog = require('./components/FolderFormDialog.js');
|
|
32
27
|
var FolderTree = require('./components/FolderTree/FolderTree.js');
|
|
33
28
|
var ImportFromUrlDialog = require('./components/ImportFromUrlDialog.js');
|
|
34
|
-
var ItemContextMenu = require('./components/ItemContextMenu.js');
|
|
35
29
|
var MainAreaContextMenu = require('./components/MainAreaContextMenu.js');
|
|
36
30
|
var SortMenu = require('./components/SortMenu.js');
|
|
31
|
+
var ViewToggle = require('./components/ViewToggle.js');
|
|
37
32
|
var constants = require('./constants.js');
|
|
38
|
-
var useAssetSearch = require('./hooks/useAssetSearch.js');
|
|
39
33
|
var useAssetSelection = require('./hooks/useAssetSelection.js');
|
|
34
|
+
var useAssetsList = require('./hooks/useAssetsList.js');
|
|
40
35
|
var useBusyAssets = require('./hooks/useBusyAssets.js');
|
|
41
36
|
var useFolderInfo = require('./hooks/useFolderInfo.js');
|
|
42
|
-
var useFolderNavigation = require('./hooks/useFolderNavigation.js');
|
|
43
|
-
var useInfiniteAssets = require('./hooks/useInfiniteAssets.js');
|
|
44
|
-
var useInfiniteScrollSentinel = require('./hooks/useInfiniteScrollSentinel.js');
|
|
45
|
-
var useListFilters = require('./hooks/useListFilters.js');
|
|
46
37
|
var useListScrollRestoration = require('./hooks/useListScrollRestoration.js');
|
|
47
|
-
var useListSort = require('./hooks/useListSort.js');
|
|
48
|
-
var buildAssetFilters = require('./utils/buildAssetFilters.js');
|
|
49
38
|
var listQueryKey = require('./utils/listQueryKey.js');
|
|
50
|
-
var mergeMixedList = require('./utils/mergeMixedList.js');
|
|
51
|
-
var renderedKeys = require('./utils/renderedKeys.js');
|
|
52
39
|
|
|
53
|
-
function _interopNamespace(e) {
|
|
54
|
-
if (e && e.__esModule) return e;
|
|
55
|
-
var n = Object.create(null);
|
|
56
|
-
if (e) {
|
|
57
|
-
Object.keys(e).forEach(function (k) {
|
|
58
|
-
if (k !== 'default') {
|
|
59
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
60
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
61
|
-
enumerable: true,
|
|
62
|
-
get: function () { return e[k]; }
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
n.default = e;
|
|
68
|
-
return Object.freeze(n);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
|
|
72
|
-
|
|
73
|
-
// The negative bottom margin shrinks the trigger area by a pixel so the 1px
|
|
74
|
-
// sentinel sitting exactly at the fold (when a page's rows happen to fill the
|
|
75
|
-
// viewport) reads as "not visible" and doesn't pull an extra page. It still
|
|
76
|
-
// triggers as soon as the sentinel scrolls a hair into view. Tune the bottom
|
|
77
|
-
// value if the list over- or under-fetches near the fold.
|
|
78
|
-
const INTERSECTION_OPTIONS = {
|
|
79
|
-
threshold: 0,
|
|
80
|
-
rootMargin: '0px 0px -1px 0px'
|
|
81
|
-
};
|
|
82
40
|
// Module-level so the header sentinel's observer isn't rebuilt every render.
|
|
83
41
|
const HEADER_SENTINEL_OPTIONS = {
|
|
84
42
|
threshold: 0
|
|
@@ -110,116 +68,6 @@ const getSearchResultsCountMessage = (numberFolders, numberAssets)=>{
|
|
|
110
68
|
}
|
|
111
69
|
return SEARCH_RESULTS_COUNT_MESSAGES.both;
|
|
112
70
|
};
|
|
113
|
-
const AssetsView = ({ view, folders, isLoadingFolders, assets, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch })=>{
|
|
114
|
-
const { formatMessage } = reactIntl.useIntl();
|
|
115
|
-
const isGridView = view === constants.viewOptions.GRID;
|
|
116
|
-
const isLoading = isLoadingAssets || isLoadingFolders;
|
|
117
|
-
// "Folders: Mixed with files" — interleave the complete folder list into the
|
|
118
|
-
// loaded asset stream client-side, following the active sort. Table view
|
|
119
|
-
// only: the grid always keeps folders in their own band on top.
|
|
120
|
-
const mixedItems = React.useMemo(()=>foldersPosition === 'mixed' && !isGridView ? mergeMixedList.mergeMixedList({
|
|
121
|
-
folders,
|
|
122
|
-
assets,
|
|
123
|
-
sort: assetsSort,
|
|
124
|
-
hasNextPage
|
|
125
|
-
}) : null, [
|
|
126
|
-
foldersPosition,
|
|
127
|
-
isGridView,
|
|
128
|
-
folders,
|
|
129
|
-
assets,
|
|
130
|
-
assetsSort,
|
|
131
|
-
hasNextPage
|
|
132
|
-
]);
|
|
133
|
-
// Derived once here so the table, the grid and the bulk bar all agree on what
|
|
134
|
-
// is on screen — in mixed mode that is not simply every folder.
|
|
135
|
-
const renderedKeys$1 = renderedKeys.buildRenderedKeys({
|
|
136
|
-
folders,
|
|
137
|
-
assets,
|
|
138
|
-
mixedItems
|
|
139
|
-
});
|
|
140
|
-
const loadMoreRef = useInfiniteScrollSentinel.useInfiniteScrollSentinel({
|
|
141
|
-
hasNextPage,
|
|
142
|
-
isFetchingMore,
|
|
143
|
-
onLoadMore: fetchNextPage,
|
|
144
|
-
options: INTERSECTION_OPTIONS
|
|
145
|
-
});
|
|
146
|
-
if (isLoading) {
|
|
147
|
-
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
148
|
-
justifyContent: "center",
|
|
149
|
-
padding: 8,
|
|
150
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
|
|
151
|
-
children: formatMessage({
|
|
152
|
-
id: 'app.loading',
|
|
153
|
-
defaultMessage: 'Loading...'
|
|
154
|
-
})
|
|
155
|
-
})
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
if (error) {
|
|
159
|
-
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
160
|
-
padding: 8,
|
|
161
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
162
|
-
textColor: "danger600",
|
|
163
|
-
children: formatMessage({
|
|
164
|
-
id: translations.getTranslationKey('list.assets.error'),
|
|
165
|
-
defaultMessage: 'An error occurred while fetching assets.'
|
|
166
|
-
})
|
|
167
|
-
})
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
if (folders.length === 0 && assets.length === 0) {
|
|
171
|
-
// While searching, the search empty state wins (it names the query); a
|
|
172
|
-
// filter-only dead end gets the filtered variant with its Clear action.
|
|
173
|
-
return hasActiveFilters && !searchQuery ? /*#__PURE__*/ jsxRuntime.jsx(EmptyState.FilteredEmptyState, {
|
|
174
|
-
onClearFilters: onClearFilters
|
|
175
|
-
}) : /*#__PURE__*/ jsxRuntime.jsx(EmptyState.EmptyState, {
|
|
176
|
-
onAddAssets: onAddAssets,
|
|
177
|
-
canAddAssets: canAddAssets,
|
|
178
|
-
searchQuery: searchQuery,
|
|
179
|
-
onClearSearch: onClearSearch
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
183
|
-
children: [
|
|
184
|
-
/*#__PURE__*/ jsxRuntime.jsx(ItemContextMenu.ItemContextMenuProvider, {
|
|
185
|
-
locations: locations,
|
|
186
|
-
children: isGridView ? /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
|
|
187
|
-
folders: folders,
|
|
188
|
-
assets: assets,
|
|
189
|
-
renderedKeys: renderedKeys$1,
|
|
190
|
-
onAssetItemClick: onAssetItemClick
|
|
191
|
-
}) : /*#__PURE__*/ jsxRuntime.jsx(AssetsTable.AssetsTable, {
|
|
192
|
-
assets: assets,
|
|
193
|
-
folders: folders,
|
|
194
|
-
mixedItems: mixedItems,
|
|
195
|
-
renderedKeys: renderedKeys$1,
|
|
196
|
-
onAssetItemClick: onAssetItemClick
|
|
197
|
-
})
|
|
198
|
-
}),
|
|
199
|
-
/*#__PURE__*/ jsxRuntime.jsx("div", {
|
|
200
|
-
ref: loadMoreRef,
|
|
201
|
-
style: {
|
|
202
|
-
height: 1
|
|
203
|
-
}
|
|
204
|
-
}),
|
|
205
|
-
isFetchingMore && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
206
|
-
justifyContent: "center",
|
|
207
|
-
padding: 4,
|
|
208
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
|
|
209
|
-
children: formatMessage({
|
|
210
|
-
id: translations.getTranslationKey('list.assets.loading-more'),
|
|
211
|
-
defaultMessage: 'Loading more assets...'
|
|
212
|
-
})
|
|
213
|
-
})
|
|
214
|
-
}),
|
|
215
|
-
/*#__PURE__*/ jsxRuntime.jsx(BulkActionsBar.BulkActionsBar, {
|
|
216
|
-
assets: assets,
|
|
217
|
-
renderedKeys: renderedKeys$1,
|
|
218
|
-
locations: locations
|
|
219
|
-
})
|
|
220
|
-
]
|
|
221
|
-
});
|
|
222
|
-
};
|
|
223
71
|
const ClearSelectionOnChange = ({ listQueryKey })=>{
|
|
224
72
|
const { clear } = useAssetSelection.useAssetSelection();
|
|
225
73
|
React.useEffect(()=>{
|
|
@@ -232,50 +80,7 @@ const ClearSelectionOnChange = ({ listQueryKey })=>{
|
|
|
232
80
|
};
|
|
233
81
|
/* -------------------------------------------------------------------------------------------------
|
|
234
82
|
* AssetsPage
|
|
235
|
-
* -----------------------------------------------------------------------------------------------*/
|
|
236
|
-
* Mirrors the design-system Toggle look (grey track, white active segment
|
|
237
|
-
* card) — reproduced locally because the DS component is a labels-only
|
|
238
|
-
* boolean input (no icons) and paints its left segment in danger red. Here
|
|
239
|
-
* both segments use the primary blue when active.
|
|
240
|
-
*/ const StyledToggleGroup = styledComponents.styled(ToggleGroup__namespace.Root)`
|
|
241
|
-
display: flex;
|
|
242
|
-
padding: ${({ theme })=>theme.spaces[1]};
|
|
243
|
-
background: ${({ theme })=>theme.colors.neutral100};
|
|
244
|
-
border: 1px solid ${({ theme })=>theme.colors.neutral200};
|
|
245
|
-
border-radius: ${({ theme })=>theme.borderRadius};
|
|
246
|
-
`;
|
|
247
|
-
const StyledToggleItem = styledComponents.styled(ToggleGroup__namespace.Item)`
|
|
248
|
-
display: flex;
|
|
249
|
-
flex: 1 1 50%;
|
|
250
|
-
align-items: center;
|
|
251
|
-
justify-content: center;
|
|
252
|
-
gap: ${({ theme })=>theme.spaces[2]};
|
|
253
|
-
padding: 0.6rem ${({ theme })=>theme.spaces[3]};
|
|
254
|
-
border: 1px solid transparent;
|
|
255
|
-
border-radius: ${({ theme })=>theme.borderRadius};
|
|
256
|
-
background: transparent;
|
|
257
|
-
color: ${({ theme })=>theme.colors.neutral600};
|
|
258
|
-
cursor: pointer;
|
|
259
|
-
font-size: ${({ theme })=>theme.fontSizes[1]};
|
|
260
|
-
font-weight: ${({ theme })=>theme.fontWeights.semiBold};
|
|
261
|
-
white-space: nowrap;
|
|
262
|
-
|
|
263
|
-
&:hover {
|
|
264
|
-
color: ${({ theme })=>theme.colors.neutral700};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
&[data-state='on'] {
|
|
268
|
-
background: ${({ theme })=>theme.colors.neutral0};
|
|
269
|
-
border-color: ${({ theme })=>theme.colors.neutral200};
|
|
270
|
-
color: ${({ theme })=>theme.colors.primary600};
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
svg {
|
|
274
|
-
width: 1.6rem;
|
|
275
|
-
height: 1.6rem;
|
|
276
|
-
}
|
|
277
|
-
`;
|
|
278
|
-
// A single sticky header — same layout scrolled or not, so the toolbar
|
|
83
|
+
* -----------------------------------------------------------------------------------------------*/ // A single sticky header — same layout scrolled or not, so the toolbar
|
|
279
84
|
// alignment can't reflow the way the shared sticky header did. Once the list
|
|
280
85
|
// scrolls under it, it shrinks (reduced vertical padding + a shadow to lift it
|
|
281
86
|
// off the rows), like the sticky headers elsewhere in the admin. Horizontal
|
|
@@ -385,73 +190,18 @@ const SearchSlot = styledComponents.styled(designSystem.Box)`
|
|
|
385
190
|
flex: 0 1 auto;
|
|
386
191
|
}
|
|
387
192
|
`;
|
|
388
|
-
// Toggle labels are hidden below desktop — icons only (buttons keep aria-label).
|
|
389
|
-
const ToggleLabel = styledComponents.styled.span`
|
|
390
|
-
display: none;
|
|
391
|
-
|
|
392
|
-
${({ theme })=>theme.breakpoints.large} {
|
|
393
|
-
display: inline;
|
|
394
|
-
}
|
|
395
|
-
`;
|
|
396
193
|
const AssetsPage = ()=>{
|
|
397
194
|
const { formatMessage } = reactIntl.useIntl();
|
|
398
195
|
const { openDetails } = AssetDetailsDrawer.useAssetDetailsParam();
|
|
399
196
|
const { canCreate, canUpdate } = useMediaLibraryPermissions.useMediaLibraryPermissions();
|
|
400
|
-
const { currentFolderId, navigateToFolderId,
|
|
401
|
-
// Deleted or missing folders (404) need a fetch — handled here, not in
|
|
402
|
-
// `useFolderNavigation` (which only strips malformed ?folder= values).
|
|
403
|
-
const { error: currentFolderError } = folders.useGetFolderQuery({
|
|
404
|
-
id: currentFolderId
|
|
405
|
-
}, {
|
|
406
|
-
skip: currentFolderId === null
|
|
407
|
-
});
|
|
408
|
-
React.useEffect(()=>{
|
|
409
|
-
if (currentFolderError?.name === 'NotFoundError') {
|
|
410
|
-
navigateToRoot();
|
|
411
|
-
}
|
|
412
|
-
}, [
|
|
413
|
-
currentFolderError,
|
|
414
|
-
navigateToRoot
|
|
415
|
-
]);
|
|
197
|
+
const { currentFolderId, navigateToFolderId, searchQuery, isSearching, clearSearch, listSort, listFilters, assets, subscribers: assetPageSubscribers, pagination, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, assetsError, folders, isLoadingFolders } = useAssetsList.useAssetsList();
|
|
416
198
|
const { title, itemCount } = useFolderInfo.useFolderInfo(currentFolderId);
|
|
417
|
-
const { searchQuery, isSearching, clearSearch } = useAssetSearch.useAssetSearch();
|
|
418
|
-
const listSort = useListSort.useListSort();
|
|
419
|
-
const listFilters = useListFilters.useListFilters();
|
|
420
|
-
// Resolve relative presets against "now" only when the filters change —
|
|
421
|
-
// keeps the query args (and RTK cache keys) stable between renders.
|
|
422
|
-
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
|
|
423
|
-
[
|
|
424
|
-
listFilters.serialized
|
|
425
|
-
]);
|
|
426
|
-
const { assets, subscribers: assetPageSubscribers, pagination, isLoading: isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error: assetsError } = useInfiniteAssets.useInfiniteAssets({
|
|
427
|
-
// The real folder is passed even while searching: the service drops the folder
|
|
428
|
-
// filter when `search` is set, so results are still global. List filters
|
|
429
|
-
// compose with both modes.
|
|
430
|
-
folder: currentFolderId,
|
|
431
|
-
search: searchQuery || undefined,
|
|
432
|
-
sort: listSort.assetsSort,
|
|
433
|
-
filters: builtFilters.fileClauses,
|
|
434
|
-
enabled: builtFilters.showFiles
|
|
435
|
-
});
|
|
436
|
-
const { data: fetchedFolders = [], isLoading: isLoadingFolders } = folders.useGetFoldersQuery({
|
|
437
|
-
parentId: currentFolderId,
|
|
438
|
-
search: searchQuery || undefined,
|
|
439
|
-
sort: listSort.foldersSort,
|
|
440
|
-
filters: builtFilters.folderClauses
|
|
441
|
-
}, {
|
|
442
|
-
skip: !builtFilters.showFolders
|
|
443
|
-
});
|
|
444
|
-
// A type badge can exclude folders structurally (e.g. "Type is Picture").
|
|
445
|
-
const folders$1 = React.useMemo(()=>builtFilters.showFolders ? fetchedFolders : [], [
|
|
446
|
-
builtFilters.showFolders,
|
|
447
|
-
fetchedFolders
|
|
448
|
-
]);
|
|
449
199
|
// Both move affordances (drag and the bulk bar) resolve each item's parent
|
|
450
200
|
// from the rows on screen — while searching, results are global and the
|
|
451
201
|
// folder currently open says nothing about where an item lives.
|
|
452
|
-
const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders
|
|
202
|
+
const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders), [
|
|
453
203
|
assets,
|
|
454
|
-
folders
|
|
204
|
+
folders
|
|
455
205
|
]);
|
|
456
206
|
const itemCountLabel = formatMessage(ITEM_COUNT_MESSAGE, {
|
|
457
207
|
count: itemCount
|
|
@@ -462,7 +212,7 @@ const AssetsPage = ()=>{
|
|
|
462
212
|
}, {
|
|
463
213
|
query: searchQuery
|
|
464
214
|
});
|
|
465
|
-
const numberFolders = folders
|
|
215
|
+
const numberFolders = folders.length;
|
|
466
216
|
const numberAssets = pagination?.total ?? 0;
|
|
467
217
|
const searchResultsCountLabel = formatMessage(getSearchResultsCountMessage(numberFolders, numberAssets), {
|
|
468
218
|
numberFolders,
|
|
@@ -723,48 +473,9 @@ const AssetsPage = ()=>{
|
|
|
723
473
|
showFoldersGroup: !isGridView
|
|
724
474
|
})
|
|
725
475
|
}),
|
|
726
|
-
/*#__PURE__*/ jsxRuntime.
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
onValueChange: (value)=>value && setView(value === 'grid' ? constants.viewOptions.GRID : constants.viewOptions.TABLE),
|
|
730
|
-
"aria-label": formatMessage({
|
|
731
|
-
id: translations.getTranslationKey('view.switch.label'),
|
|
732
|
-
defaultMessage: 'View options'
|
|
733
|
-
}),
|
|
734
|
-
children: [
|
|
735
|
-
/*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
|
|
736
|
-
value: "table",
|
|
737
|
-
"aria-label": formatMessage({
|
|
738
|
-
id: translations.getTranslationKey('view.table'),
|
|
739
|
-
defaultMessage: 'Table view'
|
|
740
|
-
}),
|
|
741
|
-
children: [
|
|
742
|
-
/*#__PURE__*/ jsxRuntime.jsx(icons.List, {}),
|
|
743
|
-
/*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
|
|
744
|
-
children: formatMessage({
|
|
745
|
-
id: translations.getTranslationKey('view.table'),
|
|
746
|
-
defaultMessage: 'Table view'
|
|
747
|
-
})
|
|
748
|
-
})
|
|
749
|
-
]
|
|
750
|
-
}),
|
|
751
|
-
/*#__PURE__*/ jsxRuntime.jsxs(StyledToggleItem, {
|
|
752
|
-
value: "grid",
|
|
753
|
-
"aria-label": formatMessage({
|
|
754
|
-
id: translations.getTranslationKey('view.grid'),
|
|
755
|
-
defaultMessage: 'Grid view'
|
|
756
|
-
}),
|
|
757
|
-
children: [
|
|
758
|
-
/*#__PURE__*/ jsxRuntime.jsx(icons.GridFour, {}),
|
|
759
|
-
/*#__PURE__*/ jsxRuntime.jsx(ToggleLabel, {
|
|
760
|
-
children: formatMessage({
|
|
761
|
-
id: translations.getTranslationKey('view.grid'),
|
|
762
|
-
defaultMessage: 'Grid view'
|
|
763
|
-
})
|
|
764
|
-
})
|
|
765
|
-
]
|
|
766
|
-
})
|
|
767
|
-
]
|
|
476
|
+
/*#__PURE__*/ jsxRuntime.jsx(ViewToggle.ViewToggle, {
|
|
477
|
+
view: view,
|
|
478
|
+
onChange: setView
|
|
768
479
|
})
|
|
769
480
|
]
|
|
770
481
|
})
|
|
@@ -785,9 +496,9 @@ const AssetsPage = ()=>{
|
|
|
785
496
|
uploadDropZoneRef: uploadDropZoneRef,
|
|
786
497
|
folderName: title
|
|
787
498
|
}),
|
|
788
|
-
/*#__PURE__*/ jsxRuntime.jsx(AssetsView, {
|
|
499
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetsView.AssetsView, {
|
|
789
500
|
view: view,
|
|
790
|
-
folders: folders
|
|
501
|
+
folders: folders,
|
|
791
502
|
isLoadingFolders: isLoadingFolders,
|
|
792
503
|
assets: assets,
|
|
793
504
|
isLoadingAssets: isLoadingAssets,
|
|
@@ -831,7 +542,7 @@ const AssetsPage = ()=>{
|
|
|
831
542
|
onClose: ()=>setIsUrlDialogOpen(false),
|
|
832
543
|
onUpload: handleUrlUpload
|
|
833
544
|
}),
|
|
834
|
-
/*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.
|
|
545
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetDetailsDrawer.AssetDetailsDrawerFromUrl, {})
|
|
835
546
|
]
|
|
836
547
|
});
|
|
837
548
|
};
|