@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsSearchInput.js","sources":["../../../../../admin/src/pages/Assets/components/AssetsSearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ChangeEvent, type FormEvent } from 'react';\n\nimport { useDebounce, useIsMobile, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Box, Searchbar, SearchForm } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSearch } from '../hooks/useAssetSearch';\n\nconst DEBOUNCE_MS = 300;\n\n// The DS Searchbar nests two bordered boxes: its own shell (neutral150) wrapping\n// the field (neutral200). Side by side they read as a single 2px, two-tone\n// border, which sits oddly next to the 1px neutral200 on the Filter button in the\n// same toolbar. Dropping the shell's border leaves the field's own — same width\n// and colour as the button — and costs nothing, since the focus ring lives on the\n// field too.\nconst StyledSearchForm = styled(SearchForm)`\n > div {\n border: none;\n }\n`;\n\n/**\n * Keyword search over the whole Media Library. Owns the typing state and the\n * debounce; `useAssetSearch` owns the `?_q=` URL param.\n */\nexport const AssetsSearchInput = () => {\n const { formatMessage } = useIntl();\n const { searchQuery, setSearchQuery } = useAssetSearch();\n const { trackUsage } = useTracking();\n const isMobile = useIsMobile();\n\n const [value, setValue] = useState(searchQuery);\n const debouncedValue = useDebounce(value, DEBOUNCE_MS);\n\n // Tracks the last value the URL and the input agreed on. Without it the two\n // effects below would ping-pong: each would see the other's write as a change\n // worth reacting to.\n const lastCommittedRef = useRef(searchQuery);\n\n // Read directly rather than through `useFolderNavigation`, which strips\n // malformed `?folder=` values as a side effect.\n const [{ query }] = useQueryParams<{ folder?: string }>();\n const folderParam = query?.folder ?? '';\n const lastFolderRef = useRef(folderParam);\n\n // Commit settled input to the URL.\n useEffect(() => {\n if (debouncedValue === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = debouncedValue;\n // Only a real query counts as a search — clearing the box (empty value) is\n // a reset, not a `didSearch`.\n if (debouncedValue) {\n trackUsage('didSearchMediaLibraryElements', { location: MEDIA_LIBRARY_LOCATION });\n }\n setSearchQuery(debouncedValue);\n }, [debouncedValue, setSearchQuery, trackUsage]);\n\n // Re-sync on external changes — back/forward, or \"Clear search\" in the empty\n // state.\n useEffect(() => {\n if (searchQuery === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [searchQuery]);\n\n // A folder navigation clears `_q`, but a term typed and never committed lives\n // only in the debounce — without this it lands afterwards and reactivates the\n // global search. `_q` alone can't see it: it was never non-empty.\n useEffect(() => {\n if (folderParam === lastFolderRef.current) {\n return;\n }\n\n lastFolderRef.current = folderParam;\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [folderParam, searchQuery]);\n\n const searchForm = (\n <StyledSearchForm onSubmit={(event: FormEvent<HTMLFormElement>) => event.preventDefault()}>\n <Searchbar\n name=\"search-assets\"\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setValue(event.target.value)}\n onClear={() => setValue('')}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n placeholder={formatMessage({\n id: getTranslationKey('header.search.placeholder'),\n defaultMessage: 'Search',\n })}\n size=\"S\"\n >\n {formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n </Searchbar>\n </StyledSearchForm>\n );\n\n // Mobile: fills the toolbar row (own line). Desktop: keeps its intrinsic size,\n // with empty space between it and the right-aligned Sort/Toggle group.\n if (isMobile) {\n return <Box width=\"100%\">{searchForm}</Box>;\n }\n\n return searchForm;\n};\n"],"names":["DEBOUNCE_MS","StyledSearchForm","styled","SearchForm","AssetsSearchInput","formatMessage","useIntl","searchQuery","setSearchQuery","useAssetSearch","trackUsage","useTracking","isMobile","useIsMobile","value","setValue","useState","debouncedValue","useDebounce","lastCommittedRef","useRef","query","useQueryParams","folderParam","folder","lastFolderRef","useEffect","current","location","MEDIA_LIBRARY_LOCATION","searchForm","_jsx","onSubmit","event","preventDefault","Searchbar","name","onChange","target","onClear","clearLabel","id","defaultMessage","placeholder","getTranslationKey","size","Box","width"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsSearchInput.js","sources":["../../../../../admin/src/pages/Assets/components/AssetsSearchInput.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type FormEvent,\n} from 'react';\n\nimport { useDebounce, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search as SearchIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSearch } from '../hooks/useAssetSearch';\nimport { useListQueryParams } from '../hooks/useListQueryParams';\n\nconst DEBOUNCE_MS = 300;\n\n// The DS Searchbar nests two bordered boxes: its own shell (neutral150) wrapping\n// the field (neutral200). Side by side they read as a single 2px, two-tone\n// border, which sits oddly next to the 1px neutral200 on the Filter button in the\n// same toolbar. Dropping the shell's border leaves the field's own — same width\n// and colour as the button — and costs nothing, since the focus ring lives on the\n// field too.\nconst StyledSearchForm = styled(SearchForm)`\n > div {\n border: none;\n }\n`;\n\ninterface AssetsSearchInputProps {\n /**\n * Starts as an icon button that opens the field, which folds back once it\n * loses focus empty, like the admin's own `SearchInput` in list views. Used\n * where the toolbar is narrow (the Content Manager asset picker). Mobile\n * always shows the field.\n */\n collapsible?: boolean;\n}\n\n/**\n * Keyword search over the whole Media Library. Owns the typing state and the\n * debounce; `useAssetSearch` owns the `?_q=` URL param.\n */\nexport const AssetsSearchInput = ({ collapsible = false }: AssetsSearchInputProps) => {\n const { formatMessage } = useIntl();\n const { searchQuery, setSearchQuery } = useAssetSearch();\n const { trackUsage } = useTracking();\n const isMobile = useIsMobile();\n\n const [value, setValue] = useState(searchQuery);\n const debouncedValue = useDebounce(value, DEBOUNCE_MS);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [isExpanded, setIsExpanded] = useState(false);\n // A term keeps the field open: folding it would hide an active search.\n const isCollapsed = collapsible && !isMobile && !isExpanded && value === '';\n\n // Only after the button opened it: a field shown on mount must not take focus.\n useEffect(() => {\n if (isExpanded) {\n inputRef.current?.focus();\n }\n }, [isExpanded]);\n\n // Emptied from elsewhere (a folder opened, the empty state's \"Clear search\")\n // after the field was left with a term in it: the blur already happened, so\n // fold it here. Not while it has focus: that is the user clearing it to type.\n useEffect(() => {\n if (value === '' && document.activeElement !== inputRef.current) {\n setIsExpanded(false);\n }\n }, [value]);\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n if (event.currentTarget.value === '') {\n setIsExpanded(false);\n }\n };\n\n // Tracks the last value the URL and the input agreed on. Without it the two\n // effects below would ping-pong: each would see the other's write as a change\n // worth reacting to.\n const lastCommittedRef = useRef(searchQuery);\n\n // Read directly rather than through `useFolderNavigation`, which strips\n // malformed `?folder=` values as a side effect.\n const [{ query }] = useListQueryParams<{ folder?: string }>();\n const folderParam = query?.folder ?? '';\n const lastFolderRef = useRef(folderParam);\n\n // Commit settled input to the URL.\n useEffect(() => {\n if (debouncedValue === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = debouncedValue;\n // Only a real query counts as a search — clearing the box (empty value) is\n // a reset, not a `didSearch`.\n if (debouncedValue) {\n trackUsage('didSearchMediaLibraryElements', { location: MEDIA_LIBRARY_LOCATION });\n }\n setSearchQuery(debouncedValue);\n }, [debouncedValue, setSearchQuery, trackUsage]);\n\n // Re-sync on external changes — back/forward, or \"Clear search\" in the empty\n // state.\n useEffect(() => {\n if (searchQuery === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [searchQuery]);\n\n // A folder navigation clears `_q`, but a term typed and never committed lives\n // only in the debounce — without this it lands afterwards and reactivates the\n // global search. `_q` alone can't see it: it was never non-empty.\n useEffect(() => {\n if (folderParam === lastFolderRef.current) {\n return;\n }\n\n lastFolderRef.current = folderParam;\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [folderParam, searchQuery]);\n\n const searchForm = (\n <StyledSearchForm onSubmit={(event: FormEvent<HTMLFormElement>) => event.preventDefault()}>\n <Searchbar\n ref={inputRef}\n name=\"search-assets\"\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setValue(event.target.value)}\n onClear={() => setValue('')}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n placeholder={formatMessage({\n id: getTranslationKey('header.search.placeholder'),\n defaultMessage: 'Search',\n })}\n size=\"S\"\n onBlur={collapsible ? handleBlur : undefined}\n >\n {formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n </Searchbar>\n </StyledSearchForm>\n );\n\n if (isCollapsed) {\n return (\n <IconButton\n label={formatMessage({ id: 'global.search', defaultMessage: 'Search' })}\n onClick={() => setIsExpanded(true)}\n >\n <SearchIcon />\n </IconButton>\n );\n }\n\n // Mobile: fills the toolbar row (own line). Desktop: keeps its intrinsic size,\n // with empty space between it and the right-aligned Sort/Toggle group.\n if (isMobile) {\n return <Box width=\"100%\">{searchForm}</Box>;\n }\n\n return searchForm;\n};\n"],"names":["DEBOUNCE_MS","StyledSearchForm","styled","SearchForm","AssetsSearchInput","collapsible","formatMessage","useIntl","searchQuery","setSearchQuery","useAssetSearch","trackUsage","useTracking","isMobile","useIsMobile","value","setValue","useState","debouncedValue","useDebounce","inputRef","useRef","isExpanded","setIsExpanded","isCollapsed","useEffect","current","focus","document","activeElement","handleBlur","event","currentTarget","lastCommittedRef","query","useListQueryParams","folderParam","folder","lastFolderRef","location","MEDIA_LIBRARY_LOCATION","searchForm","_jsx","onSubmit","preventDefault","Searchbar","ref","name","onChange","target","onClear","clearLabel","id","defaultMessage","placeholder","getTranslationKey","size","onBlur","undefined","IconButton","label","onClick","SearchIcon","Box","width"],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useRef, useEffect } from 'react';
|
|
3
|
-
import { useIsMobile, useDebounce
|
|
4
|
-
import { Searchbar,
|
|
3
|
+
import { useIsMobile, useDebounce } from '@strapi/admin/strapi-admin';
|
|
4
|
+
import { SearchForm, Searchbar, IconButton, Box } from '@strapi/design-system';
|
|
5
|
+
import { Search } from '@strapi/icons';
|
|
5
6
|
import { useIntl } from 'react-intl';
|
|
6
7
|
import { styled } from 'styled-components';
|
|
7
8
|
import { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking.mjs';
|
|
8
9
|
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
9
10
|
import { useAssetSearch } from '../hooks/useAssetSearch.mjs';
|
|
11
|
+
import { useListQueryParams } from '../hooks/useListQueryParams.mjs';
|
|
10
12
|
|
|
11
13
|
const DEBOUNCE_MS = 300;
|
|
12
14
|
// The DS Searchbar nests two bordered boxes: its own shell (neutral150) wrapping
|
|
@@ -23,20 +25,47 @@ const StyledSearchForm = styled(SearchForm)`
|
|
|
23
25
|
/**
|
|
24
26
|
* Keyword search over the whole Media Library. Owns the typing state and the
|
|
25
27
|
* debounce; `useAssetSearch` owns the `?_q=` URL param.
|
|
26
|
-
*/ const AssetsSearchInput = ()=>{
|
|
28
|
+
*/ const AssetsSearchInput = ({ collapsible = false })=>{
|
|
27
29
|
const { formatMessage } = useIntl();
|
|
28
30
|
const { searchQuery, setSearchQuery } = useAssetSearch();
|
|
29
31
|
const { trackUsage } = useTracking();
|
|
30
32
|
const isMobile = useIsMobile();
|
|
31
33
|
const [value, setValue] = useState(searchQuery);
|
|
32
34
|
const debouncedValue = useDebounce(value, DEBOUNCE_MS);
|
|
35
|
+
const inputRef = useRef(null);
|
|
36
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
37
|
+
// A term keeps the field open: folding it would hide an active search.
|
|
38
|
+
const isCollapsed = collapsible && !isMobile && !isExpanded && value === '';
|
|
39
|
+
// Only after the button opened it: a field shown on mount must not take focus.
|
|
40
|
+
useEffect(()=>{
|
|
41
|
+
if (isExpanded) {
|
|
42
|
+
inputRef.current?.focus();
|
|
43
|
+
}
|
|
44
|
+
}, [
|
|
45
|
+
isExpanded
|
|
46
|
+
]);
|
|
47
|
+
// Emptied from elsewhere (a folder opened, the empty state's "Clear search")
|
|
48
|
+
// after the field was left with a term in it: the blur already happened, so
|
|
49
|
+
// fold it here. Not while it has focus: that is the user clearing it to type.
|
|
50
|
+
useEffect(()=>{
|
|
51
|
+
if (value === '' && document.activeElement !== inputRef.current) {
|
|
52
|
+
setIsExpanded(false);
|
|
53
|
+
}
|
|
54
|
+
}, [
|
|
55
|
+
value
|
|
56
|
+
]);
|
|
57
|
+
const handleBlur = (event)=>{
|
|
58
|
+
if (event.currentTarget.value === '') {
|
|
59
|
+
setIsExpanded(false);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
33
62
|
// Tracks the last value the URL and the input agreed on. Without it the two
|
|
34
63
|
// effects below would ping-pong: each would see the other's write as a change
|
|
35
64
|
// worth reacting to.
|
|
36
65
|
const lastCommittedRef = useRef(searchQuery);
|
|
37
66
|
// Read directly rather than through `useFolderNavigation`, which strips
|
|
38
67
|
// malformed `?folder=` values as a side effect.
|
|
39
|
-
const [{ query }] =
|
|
68
|
+
const [{ query }] = useListQueryParams();
|
|
40
69
|
const folderParam = query?.folder ?? '';
|
|
41
70
|
const lastFolderRef = useRef(folderParam);
|
|
42
71
|
// Commit settled input to the URL.
|
|
@@ -86,6 +115,7 @@ const StyledSearchForm = styled(SearchForm)`
|
|
|
86
115
|
const searchForm = /*#__PURE__*/ jsx(StyledSearchForm, {
|
|
87
116
|
onSubmit: (event)=>event.preventDefault(),
|
|
88
117
|
children: /*#__PURE__*/ jsx(Searchbar, {
|
|
118
|
+
ref: inputRef,
|
|
89
119
|
name: "search-assets",
|
|
90
120
|
value: value,
|
|
91
121
|
onChange: (event)=>setValue(event.target.value),
|
|
@@ -99,12 +129,23 @@ const StyledSearchForm = styled(SearchForm)`
|
|
|
99
129
|
defaultMessage: 'Search'
|
|
100
130
|
}),
|
|
101
131
|
size: "S",
|
|
132
|
+
onBlur: collapsible ? handleBlur : undefined,
|
|
102
133
|
children: formatMessage({
|
|
103
134
|
id: getTranslationKey('search.label'),
|
|
104
135
|
defaultMessage: 'Search for an asset'
|
|
105
136
|
})
|
|
106
137
|
})
|
|
107
138
|
});
|
|
139
|
+
if (isCollapsed) {
|
|
140
|
+
return /*#__PURE__*/ jsx(IconButton, {
|
|
141
|
+
label: formatMessage({
|
|
142
|
+
id: 'global.search',
|
|
143
|
+
defaultMessage: 'Search'
|
|
144
|
+
}),
|
|
145
|
+
onClick: ()=>setIsExpanded(true),
|
|
146
|
+
children: /*#__PURE__*/ jsx(Search, {})
|
|
147
|
+
});
|
|
148
|
+
}
|
|
108
149
|
// Mobile: fills the toolbar row (own line). Desktop: keeps its intrinsic size,
|
|
109
150
|
// with empty space between it and the right-aligned Sort/Toggle group.
|
|
110
151
|
if (isMobile) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsSearchInput.mjs","sources":["../../../../../admin/src/pages/Assets/components/AssetsSearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ChangeEvent, type FormEvent } from 'react';\n\nimport { useDebounce, useIsMobile, useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Box, Searchbar, SearchForm } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSearch } from '../hooks/useAssetSearch';\n\nconst DEBOUNCE_MS = 300;\n\n// The DS Searchbar nests two bordered boxes: its own shell (neutral150) wrapping\n// the field (neutral200). Side by side they read as a single 2px, two-tone\n// border, which sits oddly next to the 1px neutral200 on the Filter button in the\n// same toolbar. Dropping the shell's border leaves the field's own — same width\n// and colour as the button — and costs nothing, since the focus ring lives on the\n// field too.\nconst StyledSearchForm = styled(SearchForm)`\n > div {\n border: none;\n }\n`;\n\n/**\n * Keyword search over the whole Media Library. Owns the typing state and the\n * debounce; `useAssetSearch` owns the `?_q=` URL param.\n */\nexport const AssetsSearchInput = () => {\n const { formatMessage } = useIntl();\n const { searchQuery, setSearchQuery } = useAssetSearch();\n const { trackUsage } = useTracking();\n const isMobile = useIsMobile();\n\n const [value, setValue] = useState(searchQuery);\n const debouncedValue = useDebounce(value, DEBOUNCE_MS);\n\n // Tracks the last value the URL and the input agreed on. Without it the two\n // effects below would ping-pong: each would see the other's write as a change\n // worth reacting to.\n const lastCommittedRef = useRef(searchQuery);\n\n // Read directly rather than through `useFolderNavigation`, which strips\n // malformed `?folder=` values as a side effect.\n const [{ query }] = useQueryParams<{ folder?: string }>();\n const folderParam = query?.folder ?? '';\n const lastFolderRef = useRef(folderParam);\n\n // Commit settled input to the URL.\n useEffect(() => {\n if (debouncedValue === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = debouncedValue;\n // Only a real query counts as a search — clearing the box (empty value) is\n // a reset, not a `didSearch`.\n if (debouncedValue) {\n trackUsage('didSearchMediaLibraryElements', { location: MEDIA_LIBRARY_LOCATION });\n }\n setSearchQuery(debouncedValue);\n }, [debouncedValue, setSearchQuery, trackUsage]);\n\n // Re-sync on external changes — back/forward, or \"Clear search\" in the empty\n // state.\n useEffect(() => {\n if (searchQuery === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [searchQuery]);\n\n // A folder navigation clears `_q`, but a term typed and never committed lives\n // only in the debounce — without this it lands afterwards and reactivates the\n // global search. `_q` alone can't see it: it was never non-empty.\n useEffect(() => {\n if (folderParam === lastFolderRef.current) {\n return;\n }\n\n lastFolderRef.current = folderParam;\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [folderParam, searchQuery]);\n\n const searchForm = (\n <StyledSearchForm onSubmit={(event: FormEvent<HTMLFormElement>) => event.preventDefault()}>\n <Searchbar\n name=\"search-assets\"\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setValue(event.target.value)}\n onClear={() => setValue('')}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n placeholder={formatMessage({\n id: getTranslationKey('header.search.placeholder'),\n defaultMessage: 'Search',\n })}\n size=\"S\"\n >\n {formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n </Searchbar>\n </StyledSearchForm>\n );\n\n // Mobile: fills the toolbar row (own line). Desktop: keeps its intrinsic size,\n // with empty space between it and the right-aligned Sort/Toggle group.\n if (isMobile) {\n return <Box width=\"100%\">{searchForm}</Box>;\n }\n\n return searchForm;\n};\n"],"names":["DEBOUNCE_MS","StyledSearchForm","styled","SearchForm","AssetsSearchInput","formatMessage","useIntl","searchQuery","setSearchQuery","useAssetSearch","trackUsage","useTracking","isMobile","useIsMobile","value","setValue","useState","debouncedValue","useDebounce","lastCommittedRef","useRef","query","useQueryParams","folderParam","folder","lastFolderRef","useEffect","current","location","MEDIA_LIBRARY_LOCATION","searchForm","_jsx","onSubmit","event","preventDefault","Searchbar","name","onChange","target","onClear","clearLabel","id","defaultMessage","placeholder","getTranslationKey","size","Box","width"],"mappings":";;;;;;;;;;AAWA,MAAMA,WAAAA,GAAc,GAAA;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,gBAAAA,GAAmBC,MAAAA,CAAOC,UAAAA,CAAW;;;;AAI3C,CAAC;AAED;;;UAIaC,iBAAAA,GAAoB,IAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,WAAW,EAAEC,cAAc,EAAE,GAAGC,cAAAA,EAAAA;IACxC,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAMC,QAAAA,GAAWC,WAAAA,EAAAA;AAEjB,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,QAAAA,CAAST,WAAAA,CAAAA;IACnC,MAAMU,cAAAA,GAAiBC,YAAYJ,KAAAA,EAAOd,WAAAA,CAAAA;;;;AAK1C,IAAA,MAAMmB,mBAAmBC,MAAAA,CAAOb,WAAAA,CAAAA;;;AAIhC,IAAA,MAAM,CAAC,EAAEc,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IACpB,MAAMC,WAAAA,GAAcF,OAAOG,MAAAA,IAAU,EAAA;AACrC,IAAA,MAAMC,gBAAgBL,MAAAA,CAAOG,WAAAA,CAAAA;;IAG7BG,SAAAA,CAAU,IAAA;QACR,IAAIT,cAAAA,KAAmBE,gBAAAA,CAAiBQ,OAAO,EAAE;AAC/C,YAAA;AACF,QAAA;AAEAR,QAAAA,gBAAAA,CAAiBQ,OAAO,GAAGV,cAAAA;;;AAG3B,QAAA,IAAIA,cAAAA,EAAgB;AAClBP,YAAAA,UAAAA,CAAW,+BAAA,EAAiC;gBAAEkB,QAAAA,EAAUC;AAAuB,aAAA,CAAA;AACjF,QAAA;QACArB,cAAAA,CAAeS,cAAAA,CAAAA;IACjB,CAAA,EAAG;AAACA,QAAAA,cAAAA;AAAgBT,QAAAA,cAAAA;AAAgBE,QAAAA;AAAW,KAAA,CAAA;;;IAI/CgB,SAAAA,CAAU,IAAA;QACR,IAAInB,WAAAA,KAAgBY,gBAAAA,CAAiBQ,OAAO,EAAE;AAC5C,YAAA;AACF,QAAA;AAEAR,QAAAA,gBAAAA,CAAiBQ,OAAO,GAAGpB,WAAAA;QAC3BQ,QAAAA,CAASR,WAAAA,CAAAA;IACX,CAAA,EAAG;AAACA,QAAAA;AAAY,KAAA,CAAA;;;;IAKhBmB,SAAAA,CAAU,IAAA;QACR,IAAIH,WAAAA,KAAgBE,aAAAA,CAAcE,OAAO,EAAE;AACzC,YAAA;AACF,QAAA;AAEAF,QAAAA,aAAAA,CAAcE,OAAO,GAAGJ,WAAAA;AACxBJ,QAAAA,gBAAAA,CAAiBQ,OAAO,GAAGpB,WAAAA;QAC3BQ,QAAAA,CAASR,WAAAA,CAAAA;IACX,CAAA,EAAG;AAACgB,QAAAA,WAAAA;AAAahB,QAAAA;AAAY,KAAA,CAAA;AAE7B,IAAA,MAAMuB,2BACJC,GAAA,CAAC9B,gBAAAA,EAAAA;QAAiB+B,QAAAA,EAAU,CAACC,KAAAA,GAAsCA,KAAAA,CAAMC,cAAc,EAAA;AACrF,QAAA,QAAA,gBAAAH,GAAA,CAACI,SAAAA,EAAAA;YACCC,IAAAA,EAAK,eAAA;YACLtB,KAAAA,EAAOA,KAAAA;AACPuB,YAAAA,QAAAA,EAAU,CAACJ,KAAAA,GAAyClB,QAAAA,CAASkB,KAAAA,CAAMK,MAAM,CAACxB,KAAK,CAAA;AAC/EyB,YAAAA,OAAAA,EAAS,IAAMxB,QAAAA,CAAS,EAAA,CAAA;AACxByB,YAAAA,UAAAA,EAAYnC,aAAAA,CAAc;gBAAEoC,EAAAA,EAAI,YAAA;gBAAcC,cAAAA,EAAgB;AAAQ,aAAA,CAAA;AACtEC,YAAAA,WAAAA,EAAatC,aAAAA,CAAc;AACzBoC,gBAAAA,EAAAA,EAAIG,iBAAAA,CAAkB,2BAAA,CAAA;gBACtBF,cAAAA,EAAgB;AAClB,aAAA,CAAA;YACAG,IAAAA,EAAK,GAAA;sBAEJxC,aAAAA,CAAc;AACboC,gBAAAA,EAAAA,EAAIG,iBAAAA,CAAkB,cAAA,CAAA;gBACtBF,cAAAA,EAAgB;AAClB,aAAA;;;;;AAON,IAAA,IAAI9B,QAAAA,EAAU;AACZ,QAAA,qBAAOmB,GAAA,CAACe,GAAAA,EAAAA;YAAIC,KAAAA,EAAM,MAAA;AAAQjB,YAAAA,QAAAA,EAAAA;;AAC5B,IAAA;IAEA,OAAOA,UAAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"AssetsSearchInput.mjs","sources":["../../../../../admin/src/pages/Assets/components/AssetsSearchInput.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type FormEvent,\n} from 'react';\n\nimport { useDebounce, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { Search as SearchIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../hooks/useTracking';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSearch } from '../hooks/useAssetSearch';\nimport { useListQueryParams } from '../hooks/useListQueryParams';\n\nconst DEBOUNCE_MS = 300;\n\n// The DS Searchbar nests two bordered boxes: its own shell (neutral150) wrapping\n// the field (neutral200). Side by side they read as a single 2px, two-tone\n// border, which sits oddly next to the 1px neutral200 on the Filter button in the\n// same toolbar. Dropping the shell's border leaves the field's own — same width\n// and colour as the button — and costs nothing, since the focus ring lives on the\n// field too.\nconst StyledSearchForm = styled(SearchForm)`\n > div {\n border: none;\n }\n`;\n\ninterface AssetsSearchInputProps {\n /**\n * Starts as an icon button that opens the field, which folds back once it\n * loses focus empty, like the admin's own `SearchInput` in list views. Used\n * where the toolbar is narrow (the Content Manager asset picker). Mobile\n * always shows the field.\n */\n collapsible?: boolean;\n}\n\n/**\n * Keyword search over the whole Media Library. Owns the typing state and the\n * debounce; `useAssetSearch` owns the `?_q=` URL param.\n */\nexport const AssetsSearchInput = ({ collapsible = false }: AssetsSearchInputProps) => {\n const { formatMessage } = useIntl();\n const { searchQuery, setSearchQuery } = useAssetSearch();\n const { trackUsage } = useTracking();\n const isMobile = useIsMobile();\n\n const [value, setValue] = useState(searchQuery);\n const debouncedValue = useDebounce(value, DEBOUNCE_MS);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [isExpanded, setIsExpanded] = useState(false);\n // A term keeps the field open: folding it would hide an active search.\n const isCollapsed = collapsible && !isMobile && !isExpanded && value === '';\n\n // Only after the button opened it: a field shown on mount must not take focus.\n useEffect(() => {\n if (isExpanded) {\n inputRef.current?.focus();\n }\n }, [isExpanded]);\n\n // Emptied from elsewhere (a folder opened, the empty state's \"Clear search\")\n // after the field was left with a term in it: the blur already happened, so\n // fold it here. Not while it has focus: that is the user clearing it to type.\n useEffect(() => {\n if (value === '' && document.activeElement !== inputRef.current) {\n setIsExpanded(false);\n }\n }, [value]);\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n if (event.currentTarget.value === '') {\n setIsExpanded(false);\n }\n };\n\n // Tracks the last value the URL and the input agreed on. Without it the two\n // effects below would ping-pong: each would see the other's write as a change\n // worth reacting to.\n const lastCommittedRef = useRef(searchQuery);\n\n // Read directly rather than through `useFolderNavigation`, which strips\n // malformed `?folder=` values as a side effect.\n const [{ query }] = useListQueryParams<{ folder?: string }>();\n const folderParam = query?.folder ?? '';\n const lastFolderRef = useRef(folderParam);\n\n // Commit settled input to the URL.\n useEffect(() => {\n if (debouncedValue === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = debouncedValue;\n // Only a real query counts as a search — clearing the box (empty value) is\n // a reset, not a `didSearch`.\n if (debouncedValue) {\n trackUsage('didSearchMediaLibraryElements', { location: MEDIA_LIBRARY_LOCATION });\n }\n setSearchQuery(debouncedValue);\n }, [debouncedValue, setSearchQuery, trackUsage]);\n\n // Re-sync on external changes — back/forward, or \"Clear search\" in the empty\n // state.\n useEffect(() => {\n if (searchQuery === lastCommittedRef.current) {\n return;\n }\n\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [searchQuery]);\n\n // A folder navigation clears `_q`, but a term typed and never committed lives\n // only in the debounce — without this it lands afterwards and reactivates the\n // global search. `_q` alone can't see it: it was never non-empty.\n useEffect(() => {\n if (folderParam === lastFolderRef.current) {\n return;\n }\n\n lastFolderRef.current = folderParam;\n lastCommittedRef.current = searchQuery;\n setValue(searchQuery);\n }, [folderParam, searchQuery]);\n\n const searchForm = (\n <StyledSearchForm onSubmit={(event: FormEvent<HTMLFormElement>) => event.preventDefault()}>\n <Searchbar\n ref={inputRef}\n name=\"search-assets\"\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setValue(event.target.value)}\n onClear={() => setValue('')}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n placeholder={formatMessage({\n id: getTranslationKey('header.search.placeholder'),\n defaultMessage: 'Search',\n })}\n size=\"S\"\n onBlur={collapsible ? handleBlur : undefined}\n >\n {formatMessage({\n id: getTranslationKey('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n </Searchbar>\n </StyledSearchForm>\n );\n\n if (isCollapsed) {\n return (\n <IconButton\n label={formatMessage({ id: 'global.search', defaultMessage: 'Search' })}\n onClick={() => setIsExpanded(true)}\n >\n <SearchIcon />\n </IconButton>\n );\n }\n\n // Mobile: fills the toolbar row (own line). Desktop: keeps its intrinsic size,\n // with empty space between it and the right-aligned Sort/Toggle group.\n if (isMobile) {\n return <Box width=\"100%\">{searchForm}</Box>;\n }\n\n return searchForm;\n};\n"],"names":["DEBOUNCE_MS","StyledSearchForm","styled","SearchForm","AssetsSearchInput","collapsible","formatMessage","useIntl","searchQuery","setSearchQuery","useAssetSearch","trackUsage","useTracking","isMobile","useIsMobile","value","setValue","useState","debouncedValue","useDebounce","inputRef","useRef","isExpanded","setIsExpanded","isCollapsed","useEffect","current","focus","document","activeElement","handleBlur","event","currentTarget","lastCommittedRef","query","useListQueryParams","folderParam","folder","lastFolderRef","location","MEDIA_LIBRARY_LOCATION","searchForm","_jsx","onSubmit","preventDefault","Searchbar","ref","name","onChange","target","onClear","clearLabel","id","defaultMessage","placeholder","getTranslationKey","size","onBlur","undefined","IconButton","label","onClick","SearchIcon","Box","width"],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ var icons = require('@strapi/icons');
|
|
|
7
7
|
var reactIntl = require('react-intl');
|
|
8
8
|
var styledComponents = require('styled-components');
|
|
9
9
|
var TruncatedText = require('../../../components/TruncatedText.js');
|
|
10
|
-
var useMediaLibraryPermissions = require('../../../hooks/useMediaLibraryPermissions.js');
|
|
11
10
|
var useTracking = require('../../../hooks/useTracking.js');
|
|
12
11
|
var files = require('../../../utils/files.js');
|
|
13
12
|
var getAssetIcon = require('../../../utils/getAssetIcon.js');
|
|
@@ -17,6 +16,7 @@ var constants = require('../constants.js');
|
|
|
17
16
|
var useAssetSelection = require('../hooks/useAssetSelection.js');
|
|
18
17
|
var useBusyAssets = require('../hooks/useBusyAssets.js');
|
|
19
18
|
var useFolderNavigation = require('../hooks/useFolderNavigation.js');
|
|
19
|
+
var useListSettings = require('../hooks/useListSettings.js');
|
|
20
20
|
var renderedKeys = require('../utils/renderedKeys.js');
|
|
21
21
|
var selection = require('../utils/selection.js');
|
|
22
22
|
var AssetActionsMenu = require('./AssetActionsMenu.js');
|
|
@@ -38,12 +38,6 @@ const StyledTable = styledComponents.styled(designSystem.RawTable)`
|
|
|
38
38
|
so the dates never wrap. The name cell is what absorbs the leftover and
|
|
39
39
|
ellipsizes — see NameTd. */
|
|
40
40
|
table-layout: auto;
|
|
41
|
-
|
|
42
|
-
& td:last-child,
|
|
43
|
-
& th:last-child {
|
|
44
|
-
width: 5.6rem;
|
|
45
|
-
white-space: nowrap;
|
|
46
|
-
}
|
|
47
41
|
`;
|
|
48
42
|
const StyledThead = styledComponents.styled(designSystem.RawThead)`
|
|
49
43
|
background: ${({ theme })=>theme.colors.neutral100};
|
|
@@ -70,10 +64,13 @@ const flexColumn = styledComponents.css`
|
|
|
70
64
|
max-width: 0;
|
|
71
65
|
overflow: hidden;
|
|
72
66
|
`;
|
|
73
|
-
const
|
|
67
|
+
const headerCellStyles = styledComponents.css`
|
|
74
68
|
height: 40px;
|
|
75
69
|
padding: 0 ${({ theme })=>theme.spaces[4]};
|
|
76
70
|
text-align: left;
|
|
71
|
+
`;
|
|
72
|
+
const StyledTh = styledComponents.styled(designSystem.RawTh)`
|
|
73
|
+
${headerCellStyles}
|
|
77
74
|
|
|
78
75
|
${({ $flex })=>$flex ? flexColumn : hugColumn}
|
|
79
76
|
`;
|
|
@@ -91,13 +88,13 @@ const StyledTr = styledComponents.styled.tr`
|
|
|
91
88
|
height: 48px;
|
|
92
89
|
user-select: none;
|
|
93
90
|
background: ${({ theme, $isSelected })=>$isSelected ? theme.colors.primary100 : theme.colors.neutral0};
|
|
94
|
-
cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget })=>{
|
|
91
|
+
cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget, $isUnselectable })=>{
|
|
95
92
|
if ($isMovePending || $isBusy) {
|
|
96
93
|
return 'wait';
|
|
97
94
|
}
|
|
98
|
-
return $isInvalidDropTarget ? 'not-allowed' : 'pointer';
|
|
95
|
+
return $isInvalidDropTarget || $isUnselectable ? 'not-allowed' : 'pointer';
|
|
99
96
|
}};
|
|
100
|
-
opacity: ${({ $isDragging, $isBusy })=>$isDragging || $isBusy ? 0.4 : 1};
|
|
97
|
+
opacity: ${({ $isDragging, $isBusy, $isUnselectable })=>$isDragging || $isBusy || $isUnselectable ? 0.4 : 1};
|
|
101
98
|
pointer-events: ${({ $isMovePending, $isBusy })=>$isMovePending || $isBusy ? 'none' : 'auto'};
|
|
102
99
|
|
|
103
100
|
${({ $isValidDropTarget, theme })=>$isValidDropTarget && styledComponents.css`
|
|
@@ -121,6 +118,17 @@ const StyledTr = styledComponents.styled.tr`
|
|
|
121
118
|
}
|
|
122
119
|
}
|
|
123
120
|
`;
|
|
121
|
+
// The trailing actions column ("..." menu), sized by name rather than as the
|
|
122
|
+
// last column: where the column is hidden (the Content Manager asset picker),
|
|
123
|
+
// the last column is the name or the size, which must not shrink to this.
|
|
124
|
+
const ActionsTd = styledComponents.styled(StyledTd)`
|
|
125
|
+
width: 5.6rem;
|
|
126
|
+
white-space: nowrap;
|
|
127
|
+
`;
|
|
128
|
+
const ActionsTh = styledComponents.styled(StyledTh)`
|
|
129
|
+
width: 5.6rem;
|
|
130
|
+
white-space: nowrap;
|
|
131
|
+
`;
|
|
124
132
|
// Leading checkbox column. Fixed narrow width so it holds its own column under
|
|
125
133
|
// the mobile fixed table-layout (a 1% width would collapse and let the name
|
|
126
134
|
// cell's preview overlap the control).
|
|
@@ -132,6 +140,16 @@ const CheckboxTh = styledComponents.styled(StyledTh)`
|
|
|
132
140
|
width: 5.6rem;
|
|
133
141
|
white-space: nowrap;
|
|
134
142
|
`;
|
|
143
|
+
// The checkbox column's header when there is no select-all (a single-value
|
|
144
|
+
// picker): a plain cell, since as an empty `RawTh` the design system's grid
|
|
145
|
+
// would make the cell itself a Tab stop.
|
|
146
|
+
const EmptyCheckboxTh = styledComponents.styled.th.attrs({
|
|
147
|
+
role: 'gridcell'
|
|
148
|
+
})`
|
|
149
|
+
${headerCellStyles}
|
|
150
|
+
width: 5.6rem;
|
|
151
|
+
white-space: nowrap;
|
|
152
|
+
`;
|
|
135
153
|
// Flags an asset whose caption or alternative text is empty — mirrors the
|
|
136
154
|
// per-field warning shown in the details drawer. Pushed to the far end of the
|
|
137
155
|
// name cell (shrink 0 so a long name never crowds it out).
|
|
@@ -197,12 +215,13 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
197
215
|
isMovePending: false
|
|
198
216
|
};
|
|
199
217
|
const { attributes, listeners, setNodeRef, isDragging, dragData } = useAssetDnd.useFileDraggable(asset);
|
|
200
|
-
const { isSelected, toggle, selectRange } = useAssetSelection.useAssetSelection();
|
|
201
|
-
const {
|
|
218
|
+
const { isEnabled, isSelected, toggle, selectRange, getSelectability } = useAssetSelection.useAssetSelection();
|
|
219
|
+
const { showItemActions } = useListSettings.useListSettings();
|
|
202
220
|
const busyMessage = useBusyAssets.useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;
|
|
203
221
|
const openContextMenu = ItemContextMenu.useItemContextMenuTrigger();
|
|
204
222
|
const key = selection.assetKey(asset.id);
|
|
205
223
|
const selected = isSelected(key);
|
|
224
|
+
const selectability = getSelectability(key);
|
|
206
225
|
// Caption and alternative text apply to every file type — same "empty =
|
|
207
226
|
// falsy" rule as the drawer's per-field warning.
|
|
208
227
|
const isMetadataMissing = !asset.caption || !asset.alternativeText;
|
|
@@ -263,6 +282,7 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
263
282
|
$isMovePending: isMovePending,
|
|
264
283
|
$isBusy: busyMessage !== null,
|
|
265
284
|
$isSelected: selected,
|
|
285
|
+
$isUnselectable: selectability === 'disabled',
|
|
266
286
|
tabIndex: 0,
|
|
267
287
|
role: "row",
|
|
268
288
|
// Right-click opens this asset's own actions, or the selection's when it
|
|
@@ -287,13 +307,14 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
287
307
|
}
|
|
288
308
|
},
|
|
289
309
|
children: [
|
|
290
|
-
|
|
310
|
+
isEnabled && /*#__PURE__*/ jsxRuntime.jsx(CheckboxTd, {
|
|
291
311
|
...constants.ASSET_ITEM_CONTROL_PROPS,
|
|
292
312
|
onClick: stopRowEvent,
|
|
293
313
|
onKeyDown: stopRowEvent,
|
|
294
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
314
|
+
children: selectability !== 'hidden' && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
295
315
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
|
|
296
316
|
checked: selected,
|
|
317
|
+
disabled: selectability === 'disabled',
|
|
297
318
|
onClick: handleCheckboxClick,
|
|
298
319
|
"aria-label": formatMessage({
|
|
299
320
|
id: translations.getTranslationKey('list.table.row.select'),
|
|
@@ -386,7 +407,7 @@ const AssetRow = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
386
407
|
})
|
|
387
408
|
]
|
|
388
409
|
}),
|
|
389
|
-
/*#__PURE__*/ jsxRuntime.jsx(
|
|
410
|
+
showItemActions && /*#__PURE__*/ jsxRuntime.jsx(ActionsTd, {
|
|
390
411
|
...constants.ASSET_ITEM_CONTROL_PROPS,
|
|
391
412
|
onClick: stopRowEvent,
|
|
392
413
|
onKeyDown: stopRowEvent,
|
|
@@ -411,8 +432,8 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
|
|
|
411
432
|
const isDesktop = strapiAdmin.useIsDesktop();
|
|
412
433
|
const { formatDate, formatMessage } = reactIntl.useIntl();
|
|
413
434
|
const { navigateToFolder } = useFolderNavigation.useFolderNavigation();
|
|
414
|
-
const { isSelected, toggle, selectRange } = useAssetSelection.useAssetSelection();
|
|
415
|
-
const {
|
|
435
|
+
const { isEnabled, isSelected, toggle, selectRange, getSelectability } = useAssetSelection.useAssetSelection();
|
|
436
|
+
const { showItemActions } = useListSettings.useListSettings();
|
|
416
437
|
const openContextMenu = ItemContextMenu.useItemContextMenuTrigger();
|
|
417
438
|
const { isMovePending } = AssetsDndProvider.useAssetsDndOptional() ?? {
|
|
418
439
|
isMovePending: false
|
|
@@ -498,12 +519,13 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
|
|
|
498
519
|
}
|
|
499
520
|
},
|
|
500
521
|
children: [
|
|
501
|
-
|
|
522
|
+
isEnabled && /*#__PURE__*/ jsxRuntime.jsx(CheckboxTd, {
|
|
502
523
|
onClick: stopRowEvent,
|
|
503
524
|
onKeyDown: stopRowEvent,
|
|
504
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
525
|
+
children: getSelectability(key) !== 'hidden' && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
505
526
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
|
|
506
527
|
checked: isSelected(key),
|
|
528
|
+
disabled: getSelectability(key) === 'disabled',
|
|
507
529
|
onClick: handleCheckboxClick,
|
|
508
530
|
"aria-label": formatMessage({
|
|
509
531
|
id: translations.getTranslationKey('list.table.row.select'),
|
|
@@ -567,7 +589,7 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
|
|
|
567
589
|
})
|
|
568
590
|
]
|
|
569
591
|
}),
|
|
570
|
-
/*#__PURE__*/ jsxRuntime.jsx(
|
|
592
|
+
showItemActions && /*#__PURE__*/ jsxRuntime.jsx(ActionsTd, {
|
|
571
593
|
onClick: stopRowEvent,
|
|
572
594
|
onKeyDown: stopRowEvent,
|
|
573
595
|
onPointerDown: stopRowEvent,
|
|
@@ -585,16 +607,15 @@ const FolderRow = ({ folder, orderedItemKeys })=>{
|
|
|
585
607
|
const AssetsTable = ({ assets, folders = EMPTY_FOLDERS, mixedItems = null, renderedKeys: renderedKeys$1, onAssetItemClick })=>{
|
|
586
608
|
const isDesktop = strapiAdmin.useIsDesktop();
|
|
587
609
|
const { formatMessage } = reactIntl.useIntl();
|
|
588
|
-
const { selectedKeys, selectAll,
|
|
589
|
-
const {
|
|
610
|
+
const { isEnabled, canSelectAll, selectedKeys, selectAll, deselectAll, getSelectability } = useAssetSelection.useAssetSelection();
|
|
611
|
+
const { showItemActions } = useListSettings.useListSettings();
|
|
590
612
|
const { trackUsage } = useTracking.useTracking();
|
|
591
613
|
// Below the desktop breakpoint only the name (and actions) column is kept —
|
|
592
614
|
// the date/size columns don't fit; size moves under the name as a subtitle.
|
|
593
|
-
const visibleHeaders = isDesktop ? constants.TABLE_HEADERS : constants.TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions');
|
|
615
|
+
const visibleHeaders = (isDesktop ? constants.TABLE_HEADERS : constants.TABLE_HEADERS.filter((h)=>h.name === 'name' || h.name === 'actions')).filter((h)=>showItemActions || h.name !== 'actions');
|
|
594
616
|
// The checkbox column is a dedicated structural column (not part of
|
|
595
|
-
// TABLE_HEADERS)
|
|
596
|
-
|
|
597
|
-
const showCheckboxColumn = canUpdate;
|
|
617
|
+
// TABLE_HEADERS), shown whenever selection is on.
|
|
618
|
+
const showCheckboxColumn = isEnabled;
|
|
598
619
|
const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);
|
|
599
620
|
const totalRows = folders.length + assets.length;
|
|
600
621
|
// Render order — folders first by default, or the interleaved mixed order.
|
|
@@ -604,13 +625,16 @@ const AssetsTable = ({ assets, folders = EMPTY_FOLDERS, mixedItems = null, rende
|
|
|
604
625
|
assets,
|
|
605
626
|
mixedItems
|
|
606
627
|
});
|
|
607
|
-
|
|
628
|
+
// Select-all only reaches what can be selected: folders in the picker, or
|
|
629
|
+
// assets outside its `allowedTypes`, are left out.
|
|
630
|
+
const selectableKeys = orderedItemKeys.filter((key)=>getSelectability(key) === 'enabled');
|
|
631
|
+
const { allSelected, isIndeterminate } = selection.getSelectAllState(selectedKeys, selectableKeys);
|
|
608
632
|
const handleSelectAll = ()=>{
|
|
609
633
|
if (allSelected) {
|
|
610
|
-
|
|
634
|
+
deselectAll(selectableKeys);
|
|
611
635
|
} else {
|
|
612
636
|
trackUsage('didSelectAllMediaLibraryElements');
|
|
613
|
-
selectAll(
|
|
637
|
+
selectAll(selectableKeys);
|
|
614
638
|
}
|
|
615
639
|
};
|
|
616
640
|
// The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an
|
|
@@ -625,11 +649,11 @@ const AssetsTable = ({ assets, folders = EMPTY_FOLDERS, mixedItems = null, rende
|
|
|
625
649
|
/*#__PURE__*/ jsxRuntime.jsx(StyledThead, {
|
|
626
650
|
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.RawTr, {
|
|
627
651
|
children: [
|
|
628
|
-
showCheckboxColumn && /*#__PURE__*/ jsxRuntime.jsx(CheckboxTh, {
|
|
652
|
+
showCheckboxColumn && canSelectAll && /*#__PURE__*/ jsxRuntime.jsx(CheckboxTh, {
|
|
629
653
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
630
654
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Checkbox, {
|
|
631
655
|
checked: isIndeterminate ? 'indeterminate' : allSelected,
|
|
632
|
-
disabled:
|
|
656
|
+
disabled: selectableKeys.length === 0,
|
|
633
657
|
onCheckedChange: handleSelectAll,
|
|
634
658
|
"aria-label": formatMessage({
|
|
635
659
|
id: translations.getTranslationKey('list.table.header.select-all'),
|
|
@@ -638,12 +662,12 @@ const AssetsTable = ({ assets, folders = EMPTY_FOLDERS, mixedItems = null, rende
|
|
|
638
662
|
})
|
|
639
663
|
})
|
|
640
664
|
}),
|
|
665
|
+
showCheckboxColumn && !canSelectAll && /*#__PURE__*/ jsxRuntime.jsx(EmptyCheckboxTh, {}),
|
|
641
666
|
visibleHeaders.map((header)=>{
|
|
642
667
|
const tableHeaderLabel = formatMessage(header.label);
|
|
643
668
|
const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;
|
|
644
669
|
if (isVisuallyHidden) {
|
|
645
|
-
return /*#__PURE__*/ jsxRuntime.jsx(
|
|
646
|
-
$flex: header.name === 'name',
|
|
670
|
+
return /*#__PURE__*/ jsxRuntime.jsx(ActionsTh, {
|
|
647
671
|
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
|
|
648
672
|
children: formatMessage({
|
|
649
673
|
id: translations.getTranslationKey('table.header.actions'),
|