@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
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
|
+
var designSystem = require('@strapi/design-system');
|
|
7
|
+
var reactIntl = require('react-intl');
|
|
8
|
+
var styledComponents = require('styled-components');
|
|
9
|
+
var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
|
|
10
|
+
var AssetsGrid = require('../../pages/Assets/components/AssetsGrid.js');
|
|
11
|
+
var AssetsSearchInput = require('../../pages/Assets/components/AssetsSearchInput.js');
|
|
12
|
+
var AssetsView = require('../../pages/Assets/components/AssetsView.js');
|
|
13
|
+
var FilterBadges = require('../../pages/Assets/components/FilterBadges.js');
|
|
14
|
+
var FilterMenu = require('../../pages/Assets/components/FilterMenu.js');
|
|
15
|
+
var SortMenu = require('../../pages/Assets/components/SortMenu.js');
|
|
16
|
+
var ViewToggle = require('../../pages/Assets/components/ViewToggle.js');
|
|
17
|
+
var constants = require('../../pages/Assets/constants.js');
|
|
18
|
+
var useAssetSelection = require('../../pages/Assets/hooks/useAssetSelection.js');
|
|
19
|
+
var useAssetsList = require('../../pages/Assets/hooks/useAssetsList.js');
|
|
20
|
+
var useListQueryParams = require('../../pages/Assets/hooks/useListQueryParams.js');
|
|
21
|
+
var useListSettings = require('../../pages/Assets/hooks/useListSettings.js');
|
|
22
|
+
var selection = require('../../pages/Assets/utils/selection.js');
|
|
23
|
+
var itemLocations = require('../../utils/itemLocations.js');
|
|
24
|
+
var translations = require('../../utils/translations.js');
|
|
25
|
+
var FolderBreadcrumbs = require('./FolderBreadcrumbs.js');
|
|
26
|
+
var pickerSelection = require('./pickerSelection.js');
|
|
27
|
+
var PickerSelectionProvider = require('./PickerSelectionProvider.js');
|
|
28
|
+
var SortableSelection = require('./SortableSelection.js');
|
|
29
|
+
|
|
30
|
+
// Fixed height (design: 720 × 680) so the modal doesn't grow and shrink as the
|
|
31
|
+
// list loads, filters empty it, or tabs switch.
|
|
32
|
+
const StyledModalContent = styledComponents.styled(designSystem.Modal.Content)`
|
|
33
|
+
max-width: 72rem;
|
|
34
|
+
height: min(68rem, 90vh);
|
|
35
|
+
`;
|
|
36
|
+
const TabsRoot = styledComponents.styled(designSystem.Tabs.Root)`
|
|
37
|
+
display: flex;
|
|
38
|
+
flex: 1;
|
|
39
|
+
flex-direction: column;
|
|
40
|
+
min-height: 0;
|
|
41
|
+
`;
|
|
42
|
+
// Full-width divider under the tabs. Inset so it paints beneath the triggers,
|
|
43
|
+
// letting the active tab's own underline sit on top of it.
|
|
44
|
+
const TabsList = styledComponents.styled(designSystem.Tabs.List)`
|
|
45
|
+
box-shadow: inset 0 -1px 0 0 ${({ theme })=>theme.colors.neutral150};
|
|
46
|
+
`;
|
|
47
|
+
// Radix keeps the inactive panel mounted with `hidden`; `display: flex` would
|
|
48
|
+
// override it and the empty panel would take half the height.
|
|
49
|
+
const TabPanel = styledComponents.styled(designSystem.Tabs.Content)`
|
|
50
|
+
display: flex;
|
|
51
|
+
flex: 1;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
min-height: 0;
|
|
54
|
+
|
|
55
|
+
&[hidden] {
|
|
56
|
+
display: none;
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
// The DS body is a scroll area sized `height: 100%`, which does not resolve
|
|
60
|
+
// inside the tab panel's flex column; take the remaining space instead.
|
|
61
|
+
//
|
|
62
|
+
// Its side padding also moves from the scroll area onto the viewport inside
|
|
63
|
+
// it: the viewport clips at its padding edge, so anything reaching past the
|
|
64
|
+
// content edge (the breadcrumbs pull their first crumb's highlight 8px left,
|
|
65
|
+
// card focus rings) stays visible instead of being cut off.
|
|
66
|
+
//
|
|
67
|
+
// No top padding: it would scroll away with the content, leaving the list
|
|
68
|
+
// flush against whatever sits above. The gap belongs to that fixed element.
|
|
69
|
+
const ScrollingBody = styledComponents.styled(designSystem.Modal.Body)`
|
|
70
|
+
flex: 1;
|
|
71
|
+
min-height: 0;
|
|
72
|
+
height: auto;
|
|
73
|
+
padding-inline: 0;
|
|
74
|
+
|
|
75
|
+
&& > [data-radix-scroll-area-viewport] {
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding-inline: ${({ theme })=>theme.spaces[7]};
|
|
78
|
+
padding-block-start: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* The DS body pads every direct child div, meant for the viewport. The
|
|
82
|
+
scrollbar is one too, and 2px of inline padding on each side of a 4px
|
|
83
|
+
track leaves the thumb no width at all. Restore the DS scrollbar's own
|
|
84
|
+
spacing. */
|
|
85
|
+
&& > [data-orientation] {
|
|
86
|
+
padding: 0;
|
|
87
|
+
margin: ${({ theme })=>theme.spaces[1]};
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
// The DS footer is `flex: 1`, which assumes a content-sized modal. With a fixed
|
|
91
|
+
// height it would absorb all the free space.
|
|
92
|
+
const Footer = styledComponents.styled(designSystem.Modal.Footer)`
|
|
93
|
+
flex: 0 0 auto;
|
|
94
|
+
`;
|
|
95
|
+
// Both tabs share these; the Selected tab only drops the section headings.
|
|
96
|
+
const PICKER_LIST_SETTINGS = {
|
|
97
|
+
showItemActions: false,
|
|
98
|
+
// Three tiles per row in the 672px content width.
|
|
99
|
+
gridMinTileWidth: '200px'
|
|
100
|
+
};
|
|
101
|
+
/** In the picker a plain click on an asset picks it (or un-picks it). */ const useToggleAsset = ()=>{
|
|
102
|
+
const { toggle } = useAssetSelection.useAssetSelection();
|
|
103
|
+
return React.useCallback((assetId)=>toggle(selection.assetKey(assetId)), [
|
|
104
|
+
toggle
|
|
105
|
+
]);
|
|
106
|
+
};
|
|
107
|
+
const BrowseTab = ({ list })=>{
|
|
108
|
+
const { currentFolderId, navigateToFolderId, searchQuery, isSearching, clearSearch, listSort, listFilters, assets, subscribers, pagination, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, assetsError, folders, isLoadingFolders } = list;
|
|
109
|
+
const toggleAsset = useToggleAsset();
|
|
110
|
+
// Shares the Media Library page's key: a user who prefers the table there
|
|
111
|
+
// gets it here too.
|
|
112
|
+
const [view, setView] = strapiAdmin.usePersistentState(constants.localStorageKeys.view, constants.viewOptions.GRID);
|
|
113
|
+
const isGridView = view === constants.viewOptions.GRID;
|
|
114
|
+
const itemLocations$1 = React.useMemo(()=>itemLocations.buildItemLocations(assets, folders), [
|
|
115
|
+
assets,
|
|
116
|
+
folders
|
|
117
|
+
]);
|
|
118
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
119
|
+
children: [
|
|
120
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
|
|
121
|
+
paddingLeft: 7,
|
|
122
|
+
paddingRight: 7,
|
|
123
|
+
paddingTop: 6,
|
|
124
|
+
paddingBottom: 6,
|
|
125
|
+
children: [
|
|
126
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
127
|
+
justifyContent: "space-between",
|
|
128
|
+
gap: 2,
|
|
129
|
+
wrap: "wrap",
|
|
130
|
+
children: [
|
|
131
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
132
|
+
gap: 2,
|
|
133
|
+
children: [
|
|
134
|
+
/*#__PURE__*/ jsxRuntime.jsx(FilterMenu.FilterMenu, {
|
|
135
|
+
listFilters: listFilters
|
|
136
|
+
}),
|
|
137
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetsSearchInput.AssetsSearchInput, {
|
|
138
|
+
collapsible: true
|
|
139
|
+
})
|
|
140
|
+
]
|
|
141
|
+
}),
|
|
142
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
143
|
+
gap: 2,
|
|
144
|
+
children: [
|
|
145
|
+
/*#__PURE__*/ jsxRuntime.jsx(SortMenu.SortMenu, {
|
|
146
|
+
sort: listSort,
|
|
147
|
+
showFoldersGroup: !isGridView
|
|
148
|
+
}),
|
|
149
|
+
/*#__PURE__*/ jsxRuntime.jsx(ViewToggle.ViewToggle, {
|
|
150
|
+
view: view,
|
|
151
|
+
onChange: setView,
|
|
152
|
+
iconsOnly: true
|
|
153
|
+
})
|
|
154
|
+
]
|
|
155
|
+
})
|
|
156
|
+
]
|
|
157
|
+
}),
|
|
158
|
+
/*#__PURE__*/ jsxRuntime.jsx(FilterBadges.FilterBadges, {
|
|
159
|
+
listFilters: listFilters
|
|
160
|
+
}),
|
|
161
|
+
currentFolderId !== null && !isSearching && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
162
|
+
paddingTop: 2,
|
|
163
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(FolderBreadcrumbs.FolderBreadcrumbs, {
|
|
164
|
+
currentFolderId: currentFolderId,
|
|
165
|
+
onSelectFolder: navigateToFolderId
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
]
|
|
169
|
+
}),
|
|
170
|
+
/*#__PURE__*/ jsxRuntime.jsxs(ScrollingBody, {
|
|
171
|
+
children: [
|
|
172
|
+
subscribers,
|
|
173
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssetsView.AssetsView, {
|
|
174
|
+
view: view,
|
|
175
|
+
folders: folders,
|
|
176
|
+
isLoadingFolders: isLoadingFolders,
|
|
177
|
+
assets: assets,
|
|
178
|
+
assetsTotal: pagination?.total,
|
|
179
|
+
isLoadingAssets: isLoadingAssets,
|
|
180
|
+
isFetchingMore: isFetchingMore,
|
|
181
|
+
hasNextPage: hasNextPage,
|
|
182
|
+
fetchNextPage: fetchNextPage,
|
|
183
|
+
error: assetsError,
|
|
184
|
+
locations: itemLocations$1,
|
|
185
|
+
searchQuery: searchQuery,
|
|
186
|
+
assetsSort: listSort.assetsSort,
|
|
187
|
+
foldersPosition: listSort.foldersPosition,
|
|
188
|
+
hasActiveFilters: listFilters.filters.length > 0,
|
|
189
|
+
onClearFilters: listFilters.clearFilters,
|
|
190
|
+
onAssetItemClick: toggleAsset,
|
|
191
|
+
// Uploading from the picker is out of scope; the empty state hides its CTA.
|
|
192
|
+
onAddAssets: ()=>{},
|
|
193
|
+
canAddAssets: false,
|
|
194
|
+
onClearSearch: clearSearch
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
})
|
|
198
|
+
]
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
const SelectedTab = ({ onReorderingChange })=>{
|
|
202
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
203
|
+
const { selection } = PickerSelectionProvider.usePickerSelection();
|
|
204
|
+
const toggleAsset = useToggleAsset();
|
|
205
|
+
return /*#__PURE__*/ jsxRuntime.jsx(ScrollingBody, {
|
|
206
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
207
|
+
paddingTop: 6,
|
|
208
|
+
children: selection.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
209
|
+
textColor: "neutral600",
|
|
210
|
+
children: formatMessage({
|
|
211
|
+
id: translations.getTranslationKey('asset-picker.selected.empty'),
|
|
212
|
+
defaultMessage: 'No asset selected yet.'
|
|
213
|
+
})
|
|
214
|
+
}) : /*#__PURE__*/ jsxRuntime.jsx(useListSettings.ListSettingsProvider, {
|
|
215
|
+
...PICKER_LIST_SETTINGS,
|
|
216
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(SortableSelection.SortableSelection, {
|
|
217
|
+
onReorderingChange: onReorderingChange,
|
|
218
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(AssetsGrid.AssetsGrid, {
|
|
219
|
+
assets: selection,
|
|
220
|
+
onAssetItemClick: toggleAsset
|
|
221
|
+
})
|
|
222
|
+
})
|
|
223
|
+
})
|
|
224
|
+
})
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
const PickerContent = ({ title, initialSelection, onClose, onConfirm, onReorderingChange })=>{
|
|
228
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
229
|
+
const { selection } = PickerSelectionProvider.usePickerSelection();
|
|
230
|
+
// Always Browse, even when the field already holds assets: the picker is
|
|
231
|
+
// opened to add some. What it holds is one tab away, and on the field itself.
|
|
232
|
+
const [activeTab, setActiveTab] = React.useState('browse');
|
|
233
|
+
const list = useAssetsListContext();
|
|
234
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
235
|
+
children: [
|
|
236
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Header, {
|
|
237
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Title, {
|
|
238
|
+
children: title
|
|
239
|
+
})
|
|
240
|
+
}),
|
|
241
|
+
/*#__PURE__*/ jsxRuntime.jsxs(TabsRoot, {
|
|
242
|
+
variant: "simple",
|
|
243
|
+
value: activeTab,
|
|
244
|
+
onValueChange: (value)=>setActiveTab(value),
|
|
245
|
+
children: [
|
|
246
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
247
|
+
paddingLeft: 7,
|
|
248
|
+
paddingRight: 7,
|
|
249
|
+
paddingTop: 2,
|
|
250
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(TabsList, {
|
|
251
|
+
"aria-label": formatMessage({
|
|
252
|
+
id: translations.getTranslationKey('asset-picker.tabs.label'),
|
|
253
|
+
defaultMessage: 'Asset picker tabs'
|
|
254
|
+
}),
|
|
255
|
+
children: [
|
|
256
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Tabs.Trigger, {
|
|
257
|
+
value: "browse",
|
|
258
|
+
children: formatMessage({
|
|
259
|
+
id: translations.getTranslationKey('asset-picker.tabs.browse'),
|
|
260
|
+
defaultMessage: 'Browse assets'
|
|
261
|
+
})
|
|
262
|
+
}),
|
|
263
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Tabs.Trigger, {
|
|
264
|
+
value: "selected",
|
|
265
|
+
children: [
|
|
266
|
+
formatMessage({
|
|
267
|
+
id: translations.getTranslationKey('asset-picker.tabs.selected'),
|
|
268
|
+
defaultMessage: 'Selected assets'
|
|
269
|
+
}),
|
|
270
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Badge, {
|
|
271
|
+
marginLeft: 2,
|
|
272
|
+
children: selection.length
|
|
273
|
+
})
|
|
274
|
+
]
|
|
275
|
+
})
|
|
276
|
+
]
|
|
277
|
+
})
|
|
278
|
+
}),
|
|
279
|
+
/*#__PURE__*/ jsxRuntime.jsx(TabPanel, {
|
|
280
|
+
value: "browse",
|
|
281
|
+
tabIndex: -1,
|
|
282
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(BrowseTab, {
|
|
283
|
+
list: list
|
|
284
|
+
})
|
|
285
|
+
}),
|
|
286
|
+
/*#__PURE__*/ jsxRuntime.jsx(TabPanel, {
|
|
287
|
+
value: "selected",
|
|
288
|
+
tabIndex: selection.length > 0 ? -1 : undefined,
|
|
289
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(SelectedTab, {
|
|
290
|
+
onReorderingChange: onReorderingChange
|
|
291
|
+
})
|
|
292
|
+
})
|
|
293
|
+
]
|
|
294
|
+
}),
|
|
295
|
+
/*#__PURE__*/ jsxRuntime.jsxs(Footer, {
|
|
296
|
+
children: [
|
|
297
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
298
|
+
variant: "tertiary",
|
|
299
|
+
onClick: onClose,
|
|
300
|
+
children: formatMessage({
|
|
301
|
+
id: 'app.components.Button.cancel',
|
|
302
|
+
defaultMessage: 'Cancel'
|
|
303
|
+
})
|
|
304
|
+
}),
|
|
305
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
306
|
+
disabled: pickerSelection.isSameSelection(selection, initialSelection),
|
|
307
|
+
onClick: ()=>onConfirm(selection),
|
|
308
|
+
children: formatMessage({
|
|
309
|
+
id: translations.getTranslationKey('asset-picker.confirm'),
|
|
310
|
+
defaultMessage: 'Confirm'
|
|
311
|
+
})
|
|
312
|
+
})
|
|
313
|
+
]
|
|
314
|
+
})
|
|
315
|
+
]
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
/* -------------------------------------------------------------------------------------------------
|
|
319
|
+
* AssetPickerDialog
|
|
320
|
+
* -----------------------------------------------------------------------------------------------*/ // The list is read above the selection provider (which resolves picked keys
|
|
321
|
+
// against the loaded assets) and below it (the Browse tab renders it). One
|
|
322
|
+
// instance, shared, so tab switches keep the pages already loaded.
|
|
323
|
+
const AssetsListContext = /*#__PURE__*/ React.createContext(null);
|
|
324
|
+
const useAssetsListContext = ()=>{
|
|
325
|
+
const context = React.useContext(AssetsListContext);
|
|
326
|
+
if (!context) {
|
|
327
|
+
throw new Error('useAssetsListContext must be used within the asset picker');
|
|
328
|
+
}
|
|
329
|
+
return context;
|
|
330
|
+
};
|
|
331
|
+
const PickerSelectionRoot = ({ children, initialSelection, multiple, allowedTypes })=>{
|
|
332
|
+
const list = useAssetsList.useAssetsList();
|
|
333
|
+
return /*#__PURE__*/ jsxRuntime.jsx(AssetsListContext.Provider, {
|
|
334
|
+
value: list,
|
|
335
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(PickerSelectionProvider.PickerSelectionProvider, {
|
|
336
|
+
initialSelection: initialSelection,
|
|
337
|
+
multiple: multiple,
|
|
338
|
+
allowedTypes: allowedTypes,
|
|
339
|
+
knownFiles: list.assets,
|
|
340
|
+
children: children
|
|
341
|
+
})
|
|
342
|
+
});
|
|
343
|
+
};
|
|
344
|
+
const NO_FILES = [];
|
|
345
|
+
/**
|
|
346
|
+
* Picking only needs read access to the library. Without it the picker says so
|
|
347
|
+
* and mounts nothing that would fetch assets or folders.
|
|
348
|
+
*/ const ReadAccessGate = ({ children, title, onClose })=>{
|
|
349
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
350
|
+
const { canRead, isLoading } = useMediaLibraryPermissions.useMediaLibraryPermissions();
|
|
351
|
+
if (canRead) {
|
|
352
|
+
return children;
|
|
353
|
+
}
|
|
354
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
355
|
+
children: [
|
|
356
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Header, {
|
|
357
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Title, {
|
|
358
|
+
children: title
|
|
359
|
+
})
|
|
360
|
+
}),
|
|
361
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
362
|
+
flex: 1,
|
|
363
|
+
justifyContent: "center",
|
|
364
|
+
alignItems: "center",
|
|
365
|
+
children: isLoading ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
|
|
366
|
+
children: formatMessage({
|
|
367
|
+
id: 'app.loading',
|
|
368
|
+
defaultMessage: 'Loading...'
|
|
369
|
+
})
|
|
370
|
+
}) : /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.NoPermissions, {})
|
|
371
|
+
}),
|
|
372
|
+
/*#__PURE__*/ jsxRuntime.jsx(Footer, {
|
|
373
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
374
|
+
variant: "tertiary",
|
|
375
|
+
onClick: onClose,
|
|
376
|
+
children: formatMessage({
|
|
377
|
+
id: 'app.components.Button.cancel',
|
|
378
|
+
defaultMessage: 'Cancel'
|
|
379
|
+
})
|
|
380
|
+
})
|
|
381
|
+
})
|
|
382
|
+
]
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
/**
|
|
386
|
+
* Content Manager asset picker, built on the current Media Library list. Its
|
|
387
|
+
* folder, search, filter and sort state lives in memory, so browsing never
|
|
388
|
+
* touches the URL of the entry it is opened from.
|
|
389
|
+
*/ const AssetPickerDialog = ({ open, onClose, title, initialSelection = NO_FILES, multiple = false, allowedTypes, onConfirm })=>{
|
|
390
|
+
// A ref, not state: nothing renders from it, only the Escape handler reads it.
|
|
391
|
+
const isReorderingRef = React.useRef(false);
|
|
392
|
+
const setReordering = React.useCallback((reordering)=>{
|
|
393
|
+
isReorderingRef.current = reordering;
|
|
394
|
+
}, []);
|
|
395
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Root, {
|
|
396
|
+
open: open,
|
|
397
|
+
onOpenChange: (isOpen)=>!isOpen && onClose(),
|
|
398
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(StyledModalContent, {
|
|
399
|
+
// Radix handles Escape on the document in the capture phase, before
|
|
400
|
+
// dnd-kit's sensor sees it. During a drag, Escape cancels the drag instead.
|
|
401
|
+
onEscapeKeyDown: (event)=>{
|
|
402
|
+
if (isReorderingRef.current) {
|
|
403
|
+
event.preventDefault();
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(ReadAccessGate, {
|
|
407
|
+
title: title,
|
|
408
|
+
onClose: onClose,
|
|
409
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(useListQueryParams.ListQueryStateProvider, {
|
|
410
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(useListSettings.ListSettingsProvider, {
|
|
411
|
+
...PICKER_LIST_SETTINGS,
|
|
412
|
+
showSectionHeadings: true,
|
|
413
|
+
showGridSelectAll: true,
|
|
414
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(PickerSelectionRoot, {
|
|
415
|
+
initialSelection: initialSelection,
|
|
416
|
+
multiple: multiple,
|
|
417
|
+
allowedTypes: allowedTypes,
|
|
418
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(PickerContent, {
|
|
419
|
+
title: title,
|
|
420
|
+
initialSelection: initialSelection,
|
|
421
|
+
onClose: onClose,
|
|
422
|
+
onConfirm: onConfirm,
|
|
423
|
+
onReorderingChange: setReordering
|
|
424
|
+
})
|
|
425
|
+
})
|
|
426
|
+
})
|
|
427
|
+
})
|
|
428
|
+
})
|
|
429
|
+
})
|
|
430
|
+
});
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
exports.AssetPickerDialog = AssetPickerDialog;
|
|
434
|
+
//# sourceMappingURL=AssetPickerDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetPickerDialog.js","sources":["../../../../admin/src/components/AssetPickerDialog/AssetPickerDialog.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { Page, usePersistentState } from '@strapi/admin/strapi-admin';\nimport { Badge, Box, Button, Flex, Loader, Modal, Tabs, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { AssetsGrid } from '../../pages/Assets/components/AssetsGrid';\nimport { AssetsSearchInput } from '../../pages/Assets/components/AssetsSearchInput';\nimport { AssetsView } from '../../pages/Assets/components/AssetsView';\nimport { FilterBadges } from '../../pages/Assets/components/FilterBadges';\nimport { FilterMenu } from '../../pages/Assets/components/FilterMenu';\nimport { SortMenu } from '../../pages/Assets/components/SortMenu';\nimport { ViewToggle } from '../../pages/Assets/components/ViewToggle';\nimport { localStorageKeys, viewOptions } from '../../pages/Assets/constants';\nimport { useAssetSelection } from '../../pages/Assets/hooks/useAssetSelection';\nimport { useAssetsList } from '../../pages/Assets/hooks/useAssetsList';\nimport { ListQueryStateProvider } from '../../pages/Assets/hooks/useListQueryParams';\nimport { ListSettingsProvider } from '../../pages/Assets/hooks/useListSettings';\nimport { assetKey } from '../../pages/Assets/utils/selection';\nimport { type MediaAllowedTypes } from '../../utils/isAllowedAssetType';\nimport { buildItemLocations } from '../../utils/itemLocations';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { FolderBreadcrumbs } from './FolderBreadcrumbs';\nimport { isSameSelection } from './pickerSelection';\nimport { PickerSelectionProvider, usePickerSelection } from './PickerSelectionProvider';\nimport { SortableSelection } from './SortableSelection';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n// Fixed height (design: 720 × 680) so the modal doesn't grow and shrink as the\n// list loads, filters empty it, or tabs switch.\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 72rem;\n height: min(68rem, 90vh);\n`;\n\nconst TabsRoot = styled(Tabs.Root)`\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n`;\n\n// Full-width divider under the tabs. Inset so it paints beneath the triggers,\n// letting the active tab's own underline sit on top of it.\nconst TabsList = styled(Tabs.List)`\n box-shadow: inset 0 -1px 0 0 ${({ theme }) => theme.colors.neutral150};\n`;\n\n// Radix keeps the inactive panel mounted with `hidden`; `display: flex` would\n// override it and the empty panel would take half the height.\nconst TabPanel = styled(Tabs.Content)`\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n\n &[hidden] {\n display: none;\n }\n`;\n\n// The DS body is a scroll area sized `height: 100%`, which does not resolve\n// inside the tab panel's flex column; take the remaining space instead.\n//\n// Its side padding also moves from the scroll area onto the viewport inside\n// it: the viewport clips at its padding edge, so anything reaching past the\n// content edge (the breadcrumbs pull their first crumb's highlight 8px left,\n// card focus rings) stays visible instead of being cut off.\n//\n// No top padding: it would scroll away with the content, leaving the list\n// flush against whatever sits above. The gap belongs to that fixed element.\nconst ScrollingBody = styled(Modal.Body)`\n flex: 1;\n min-height: 0;\n height: auto;\n padding-inline: 0;\n\n && > [data-radix-scroll-area-viewport] {\n margin: 0;\n padding-inline: ${({ theme }) => theme.spaces[7]};\n padding-block-start: 0;\n }\n\n /* The DS body pads every direct child div, meant for the viewport. The\n scrollbar is one too, and 2px of inline padding on each side of a 4px\n track leaves the thumb no width at all. Restore the DS scrollbar's own\n spacing. */\n && > [data-orientation] {\n padding: 0;\n margin: ${({ theme }) => theme.spaces[1]};\n }\n`;\n\n// The DS footer is `flex: 1`, which assumes a content-sized modal. With a fixed\n// height it would absorb all the free space.\nconst Footer = styled(Modal.Footer)`\n flex: 0 0 auto;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Shared\n * -----------------------------------------------------------------------------------------------*/\n\ntype AssetsList = ReturnType<typeof useAssetsList>;\n\n// Both tabs share these; the Selected tab only drops the section headings.\nconst PICKER_LIST_SETTINGS = {\n showItemActions: false,\n // Three tiles per row in the 672px content width.\n gridMinTileWidth: '200px',\n} as const;\n\n/** In the picker a plain click on an asset picks it (or un-picks it). */\nconst useToggleAsset = () => {\n const { toggle } = useAssetSelection();\n\n return useCallback((assetId: number) => toggle(assetKey(assetId)), [toggle]);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * BrowseTab\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BrowseTabProps {\n list: AssetsList;\n}\n\nconst BrowseTab = ({ list }: BrowseTabProps) => {\n const {\n currentFolderId,\n navigateToFolderId,\n searchQuery,\n isSearching,\n clearSearch,\n listSort,\n listFilters,\n assets,\n subscribers,\n pagination,\n isLoadingAssets,\n isFetchingMore,\n hasNextPage,\n fetchNextPage,\n assetsError,\n folders,\n isLoadingFolders,\n } = list;\n const toggleAsset = useToggleAsset();\n // Shares the Media Library page's key: a user who prefers the table there\n // gets it here too.\n const [view, setView] = usePersistentState(localStorageKeys.view, viewOptions.GRID);\n const isGridView = view === viewOptions.GRID;\n\n const itemLocations = useMemo(() => buildItemLocations(assets, folders), [assets, folders]);\n\n return (\n <>\n <Box paddingLeft={7} paddingRight={7} paddingTop={6} paddingBottom={6}>\n <Flex justifyContent=\"space-between\" gap={2} wrap=\"wrap\">\n <Flex gap={2}>\n <FilterMenu listFilters={listFilters} />\n <AssetsSearchInput collapsible />\n </Flex>\n <Flex gap={2}>\n <SortMenu sort={listSort} showFoldersGroup={!isGridView} />\n <ViewToggle view={view} onChange={setView} iconsOnly />\n </Flex>\n </Flex>\n <FilterBadges listFilters={listFilters} />\n {/* In the fixed header with the toolbar, so the way back up stays in\n reach however far the list is scrolled. Search results are global,\n so a folder trail would be misleading there. */}\n {currentFolderId !== null && !isSearching && (\n <Box paddingTop={2}>\n <FolderBreadcrumbs\n currentFolderId={currentFolderId}\n onSelectFolder={navigateToFolderId}\n />\n </Box>\n )}\n </Box>\n <ScrollingBody>\n {/* Renders nothing — keeps every loaded page's query subscribed. */}\n {subscribers}\n <AssetsView\n view={view}\n folders={folders}\n isLoadingFolders={isLoadingFolders}\n assets={assets}\n assetsTotal={pagination?.total}\n isLoadingAssets={isLoadingAssets}\n isFetchingMore={isFetchingMore}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n error={assetsError}\n locations={itemLocations}\n searchQuery={searchQuery}\n assetsSort={listSort.assetsSort}\n foldersPosition={listSort.foldersPosition}\n hasActiveFilters={listFilters.filters.length > 0}\n onClearFilters={listFilters.clearFilters}\n onAssetItemClick={toggleAsset}\n // Uploading from the picker is out of scope; the empty state hides its CTA.\n onAddAssets={() => {}}\n canAddAssets={false}\n onClearSearch={clearSearch}\n />\n </ScrollingBody>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SelectedTab\n * -----------------------------------------------------------------------------------------------*/\n\n// Always a grid, whatever view Browse uses: the selection is short, and its\n// order (which reordering changes) reads best as tiles.\ninterface SelectedTabProps {\n onReorderingChange: (reordering: boolean) => void;\n}\n\nconst SelectedTab = ({ onReorderingChange }: SelectedTabProps) => {\n const { formatMessage } = useIntl();\n const { selection } = usePickerSelection();\n const toggleAsset = useToggleAsset();\n\n return (\n <ScrollingBody>\n {/* No toolbar above this tab, so the gap under the tabs lives here. */}\n <Box paddingTop={6}>\n {selection.length === 0 ? (\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('asset-picker.selected.empty'),\n defaultMessage: 'No asset selected yet.',\n })}\n </Typography>\n ) : (\n <ListSettingsProvider {...PICKER_LIST_SETTINGS}>\n {/* The order here is the order the field will hold. */}\n <SortableSelection onReorderingChange={onReorderingChange}>\n <AssetsGrid assets={selection} onAssetItemClick={toggleAsset} />\n </SortableSelection>\n </ListSettingsProvider>\n )}\n </Box>\n </ScrollingBody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PickerContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype PickerTab = 'browse' | 'selected';\n\ninterface PickerContentProps {\n title: string;\n initialSelection: File[];\n onClose: () => void;\n onConfirm: (files: File[]) => void;\n onReorderingChange: (reordering: boolean) => void;\n}\n\nconst PickerContent = ({\n title,\n initialSelection,\n onClose,\n onConfirm,\n onReorderingChange,\n}: PickerContentProps) => {\n const { formatMessage } = useIntl();\n const { selection } = usePickerSelection();\n // Always Browse, even when the field already holds assets: the picker is\n // opened to add some. What it holds is one tab away, and on the field itself.\n const [activeTab, setActiveTab] = useState<PickerTab>('browse');\n const list = useAssetsListContext();\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <TabsRoot\n variant=\"simple\"\n value={activeTab}\n onValueChange={(value) => setActiveTab(value as PickerTab)}\n >\n <Box paddingLeft={7} paddingRight={7} paddingTop={2}>\n <TabsList\n aria-label={formatMessage({\n id: getTranslationKey('asset-picker.tabs.label'),\n defaultMessage: 'Asset picker tabs',\n })}\n >\n <Tabs.Trigger value=\"browse\">\n {formatMessage({\n id: getTranslationKey('asset-picker.tabs.browse'),\n defaultMessage: 'Browse assets',\n })}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"selected\">\n {formatMessage({\n id: getTranslationKey('asset-picker.tabs.selected'),\n defaultMessage: 'Selected assets',\n })}\n <Badge marginLeft={2}>{selection.length}</Badge>\n </Tabs.Trigger>\n </TabsList>\n </Box>\n {/* Radix makes a panel a Tab stop, meant for panels with nothing focusable\n inside. These hold controls, so focus goes straight to them. */}\n <TabPanel value=\"browse\" tabIndex={-1}>\n <BrowseTab list={list} />\n </TabPanel>\n <TabPanel value=\"selected\" tabIndex={selection.length > 0 ? -1 : undefined}>\n <SelectedTab onReorderingChange={onReorderingChange} />\n </TabPanel>\n </TabsRoot>\n <Footer>\n <Button variant=\"tertiary\" onClick={onClose}>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button\n disabled={isSameSelection(selection, initialSelection)}\n onClick={() => onConfirm(selection)}\n >\n {formatMessage({\n id: getTranslationKey('asset-picker.confirm'),\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Footer>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPickerDialog\n * -----------------------------------------------------------------------------------------------*/\n\n// The list is read above the selection provider (which resolves picked keys\n// against the loaded assets) and below it (the Browse tab renders it). One\n// instance, shared, so tab switches keep the pages already loaded.\nconst AssetsListContext = createContext<AssetsList | null>(null);\n\nconst useAssetsListContext = () => {\n const context = useContext(AssetsListContext);\n\n if (!context) {\n throw new Error('useAssetsListContext must be used within the asset picker');\n }\n\n return context;\n};\n\ninterface PickerSelectionRootProps {\n children: ReactNode;\n initialSelection: File[];\n multiple: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n}\n\nconst PickerSelectionRoot = ({\n children,\n initialSelection,\n multiple,\n allowedTypes,\n}: PickerSelectionRootProps) => {\n const list = useAssetsList();\n\n return (\n <AssetsListContext.Provider value={list}>\n <PickerSelectionProvider\n initialSelection={initialSelection}\n multiple={multiple}\n allowedTypes={allowedTypes}\n knownFiles={list.assets}\n >\n {children}\n </PickerSelectionProvider>\n </AssetsListContext.Provider>\n );\n};\n\nexport interface AssetPickerDialogProps {\n open: boolean;\n onClose: () => void;\n title: string;\n /** What the field holds now; the picker starts with it selected. */\n initialSelection?: File[];\n multiple?: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n /** The confirmed selection, in order. Always an array, even for a single field. */\n onConfirm: (files: File[]) => void;\n}\n\nconst NO_FILES: File[] = [];\n\ninterface ReadAccessGateProps {\n children: ReactNode;\n title: string;\n onClose: () => void;\n}\n\n/**\n * Picking only needs read access to the library. Without it the picker says so\n * and mounts nothing that would fetch assets or folders.\n */\nconst ReadAccessGate = ({ children, title, onClose }: ReadAccessGateProps) => {\n const { formatMessage } = useIntl();\n const { canRead, isLoading } = useMediaLibraryPermissions();\n\n if (canRead) {\n return children;\n }\n\n return (\n <>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n {isLoading ? (\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n ) : (\n <Page.NoPermissions />\n )}\n </Flex>\n <Footer>\n <Button variant=\"tertiary\" onClick={onClose}>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Footer>\n </>\n );\n};\n\n/**\n * Content Manager asset picker, built on the current Media Library list. Its\n * folder, search, filter and sort state lives in memory, so browsing never\n * touches the URL of the entry it is opened from.\n */\nexport const AssetPickerDialog = ({\n open,\n onClose,\n title,\n initialSelection = NO_FILES,\n multiple = false,\n allowedTypes,\n onConfirm,\n}: AssetPickerDialogProps) => {\n // A ref, not state: nothing renders from it, only the Escape handler reads it.\n const isReorderingRef = useRef(false);\n const setReordering = useCallback((reordering: boolean) => {\n isReorderingRef.current = reordering;\n }, []);\n\n return (\n <Modal.Root open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <StyledModalContent\n // Radix handles Escape on the document in the capture phase, before\n // dnd-kit's sensor sees it. During a drag, Escape cancels the drag instead.\n onEscapeKeyDown={(event) => {\n if (isReorderingRef.current) {\n event.preventDefault();\n }\n }}\n >\n <ReadAccessGate title={title} onClose={onClose}>\n {/* Inside the content so every opening starts from fresh list and selection state. */}\n <ListQueryStateProvider>\n <ListSettingsProvider {...PICKER_LIST_SETTINGS} showSectionHeadings showGridSelectAll>\n <PickerSelectionRoot\n initialSelection={initialSelection}\n multiple={multiple}\n allowedTypes={allowedTypes}\n >\n <PickerContent\n title={title}\n initialSelection={initialSelection}\n onClose={onClose}\n onConfirm={onConfirm}\n onReorderingChange={setReordering}\n />\n </PickerSelectionRoot>\n </ListSettingsProvider>\n </ListQueryStateProvider>\n </ReadAccessGate>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","TabsRoot","Tabs","Root","TabsList","List","theme","colors","neutral150","TabPanel","ScrollingBody","Body","spaces","Footer","PICKER_LIST_SETTINGS","showItemActions","gridMinTileWidth","useToggleAsset","toggle","useAssetSelection","useCallback","assetId","assetKey","BrowseTab","list","currentFolderId","navigateToFolderId","searchQuery","isSearching","clearSearch","listSort","listFilters","assets","subscribers","pagination","isLoadingAssets","isFetchingMore","hasNextPage","fetchNextPage","assetsError","folders","isLoadingFolders","toggleAsset","view","setView","usePersistentState","localStorageKeys","viewOptions","GRID","isGridView","itemLocations","useMemo","buildItemLocations","_jsxs","_Fragment","Box","paddingLeft","paddingRight","paddingTop","paddingBottom","Flex","justifyContent","gap","wrap","_jsx","FilterMenu","AssetsSearchInput","collapsible","SortMenu","sort","showFoldersGroup","ViewToggle","onChange","iconsOnly","FilterBadges","FolderBreadcrumbs","onSelectFolder","AssetsView","assetsTotal","total","error","locations","assetsSort","foldersPosition","hasActiveFilters","filters","length","onClearFilters","clearFilters","onAssetItemClick","onAddAssets","canAddAssets","onClearSearch","SelectedTab","onReorderingChange","formatMessage","useIntl","selection","usePickerSelection","Typography","textColor","id","getTranslationKey","defaultMessage","ListSettingsProvider","SortableSelection","AssetsGrid","PickerContent","title","initialSelection","onClose","onConfirm","activeTab","setActiveTab","useState","useAssetsListContext","Header","Title","variant","value","onValueChange","aria-label","Trigger","Badge","marginLeft","tabIndex","undefined","Button","onClick","disabled","isSameSelection","AssetsListContext","createContext","context","useContext","Error","PickerSelectionRoot","children","multiple","allowedTypes","useAssetsList","Provider","PickerSelectionProvider","knownFiles","NO_FILES","ReadAccessGate","canRead","isLoading","useMediaLibraryPermissions","flex","alignItems","Loader","Page","NoPermissions","AssetPickerDialog","open","isReorderingRef","useRef","setReordering","reordering","current","onOpenChange","isOpen","onEscapeKeyDown","event","preventDefault","ListQueryStateProvider","showSectionHeadings","showGridSelectAll"],"mappings":"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"}
|