@strapi/upload 5.58.0 → 5.60.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/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/MediaLibraryInput/AddAssetMenu.js +142 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +140 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
- 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 +156 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +154 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
- 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 +211 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +208 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
- 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 +439 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +433 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
- 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/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/useAIMetadataAvailability.js +5 -1
- package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
- package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
- package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs +16 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +5 -1
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +5 -1
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/index.js +7 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +7 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
- package/dist/admin/legacy/components/TableList/TableList.js +3 -1
- package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
- package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
- package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
- package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
- package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +13 -302
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +143 -31
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +146 -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 +60 -35
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +62 -37
- 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.js +3 -1
- package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +4 -2
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
- package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
- package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
- package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
- package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +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/DropZone/UploadDropZoneContext.js +4 -2
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
- package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.mjs +35 -6
- package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
- 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/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 +106 -11
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +105 -13
- 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/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/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
- 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 +21 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +28 -0
- package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
- package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
- package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +3 -0
- package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
- package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
- 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/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 +30 -1
- package/dist/admin/src/store/uploadProgress.d.ts +14 -1
- package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
- 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/ca.json.js +3 -3
- package/dist/admin/translations/ca.json.mjs +3 -3
- package/dist/admin/translations/da.json.js +1 -1
- package/dist/admin/translations/da.json.mjs +1 -1
- package/dist/admin/translations/de.json.js +1 -1
- package/dist/admin/translations/de.json.mjs +1 -1
- package/dist/admin/translations/en.json.js +29 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +29 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/sk.json.js +2 -2
- package/dist/admin/translations/sk.json.mjs +2 -2
- package/dist/admin/translations/tr.json.js +2 -2
- package/dist/admin/translations/tr.json.mjs +2 -2
- package/dist/admin/translations/zh-Hans.json.js +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +1 -1
- package/dist/admin/translations/zh.json.js +2 -2
- package/dist/admin/translations/zh.json.mjs +2 -2
- package/dist/admin/utils/allowedMediaTypes.js +42 -0
- package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
- package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
- package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
- 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/config.js +6 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +6 -0
- package/dist/server/config.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/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
- package/dist/server/mcp/ambient-instance.js +7 -5
- package/dist/server/mcp/ambient-instance.js.map +1 -1
- package/dist/server/mcp/ambient-instance.mjs +7 -5
- package/dist/server/mcp/ambient-instance.mjs.map +1 -1
- package/dist/server/mcp/handlers/folder-handlers.js +4 -16
- package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
- package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/read-handlers.js +6 -14
- package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
- package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/write-handlers.js +3 -13
- package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
- package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
- package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
- package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
- package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
- package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +35 -16
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +35 -16
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/config.d.ts +3 -0
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
- package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +11 -11
- package/dist/server/src/services/image-manipulation.d.ts +1 -1
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/types.d.ts +64 -12
- package/dist/server/src/types.d.ts.map +1 -1
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsGrid.js","sources":["../../../../../admin/src/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import { Box, Card, CardBody, CardHeader, Checkbox, Flex } from '@strapi/design-system';\nimport { Folder as FolderIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { TruncatedText } from '../../../components/TruncatedText';\nimport { ASSET_TYPES } from '../../../enums';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { isEventFromWithin } from '../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { buildRenderedKeys } from '../utils/renderedKeys';\nimport { assetKey, folderKey, type ItemKey } from '../utils/selection';\n\nimport { AssetActionsMenu } from './AssetActionsMenu';\nimport { BusyOverlay } from './BusyOverlay';\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\nimport { FolderActionsMenu } from './FolderActionsMenu';\nimport { useItemContextMenuTrigger } from './ItemContextMenu';\n\nimport type { File } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\n// Cards own click, Enter and Space; the controls sitting on them (checkbox, \"...\"\n// menu) must not let those reach the card. Scoped to the wrapper's own DOM\n// subtree so the menu's portaled content — a React child of the wrapper, but\n// never a DOM descendant — still reaches `document`, where Radix listens in\n// order to dismiss its layers.\nconst stopCardEvent = (e: React.SyntheticEvent) => {\n if (isEventFromWithin(e)) {\n e.stopPropagation();\n }\n};\n\n// Top-left selection checkbox overlaid on the asset preview, always visible.\nconst CheckboxOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n left: ${({ theme }) => theme.spaces[3]};\n z-index: 1;\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n`;\n\nconst StyledCard = styled(Card)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isBusy?: boolean;\n $isSelected?: boolean;\n}>`\n border: 1px solid\n ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary600 : theme.colors.neutral200)};\n border-radius: 8px;\n overflow: hidden;\n isolation: isolate;\n cursor: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n /* No opacity change while busy — the overlay does the dimming, and stacking\n one on the other would wash the card out. */\n pointer-events: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'none' : 'auto')};\n background: ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary100 : undefined)};\n /* Shift+click range selection must not highlight card text. */\n user-select: none;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst MIN_TILE_WIDTH = '240px';\n\nconst ItemsGrid = styled(Box)`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(${MIN_TILE_WIDTH}, 100%), 1fr));\n gap: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n width: 100%;\n user-select: none;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid\n ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(TruncatedText)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderCard = ({ folder, orderedItemKeys }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const openContextMenu = useItemContextMenuTrigger();\n const {\n dragData,\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n // Folders share the selection mechanism with assets (toggle, range,\n // select-all). Only the plain-click semantic differs: it navigates into the\n // folder instead of selecting it.\n //\n // The containment guard on this and the handlers below is what keeps the\n // actions menu's portaled dialogs — React children of this card — from\n // navigating into the folder or starting a drag.\n const handleClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n // Checkbox is the pointer path to selection; Shift extends the range.\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n role=\"listitem\"\n tabIndex={0}\n // Right-click opens this folder's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'folder', folder, dragData });\n }\n }}\n >\n {canUpdate && (\n <Flex onKeyDown={(e: React.KeyboardEvent) => e.stopPropagation()}>\n <Checkbox\n checked={isSelected(key)}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n )}\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\">{folder.name}</FolderName>\n <Flex onClick={stopCardEvent} onKeyDown={stopCardEvent} onPointerDown={stopCardEvent}>\n <FolderActionsMenu folder={folder} dragData={dragData} />\n </Flex>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url, updatedAt, isLocal, isUrlSigned } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n // Replace keeps the same hash/URL, so without a cache-buster the browser\n // serves the stale thumbnail after a Replace Media. `updatedAt`\n // changes on replace, so it re-fetches exactly once per replacement.\n // Skipped for signed URLs — an extra query param invalidates the signature.\n const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string) => {\n if (cacheKey === undefined) {\n return raw;\n }\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n\n const rawMediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n const mediaURL = rawMediaURL ? appendCacheBuster(rawMediaURL) : rawMediaURL;\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n // Only signed remote URLs need crossOrigin (cache collision with\n // the preview). Public/unsigned remote thumbnails must render\n // without a bucket CORS rule. See #26581.\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n position: relative;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(TruncatedText)`\n flex: 1;\n min-width: 0;\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the card (mirrors the table view).\nconst NameButton = styled.button`\n display: inline-flex;\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\ninterface AssetCardProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, orderedItemKeys, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;\n const openContextMenu = useItemContextMenuTrigger();\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n //\n // The containment guard on this and the handler below is what keeps the\n // actions menu's portaled dialogs — React children of this card — from\n // opening the details drawer or toggling the selection.\n const handleCardClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n // Same semantics as the table's row checkbox: Shift extends the range,\n // otherwise a plain additive toggle. Never bubbles into the card click.\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"listitem\"\n // Right-click opens this asset's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'asset', asset, dragData });\n }\n }}\n onDragStart={(e) => e.preventDefault()}\n onClick={handleCardClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n <StyledCardHeader>\n {canUpdate && (\n <CheckboxOverlay\n {...ASSET_ITEM_CONTROL_PROPS}\n onKeyDown={(e: React.KeyboardEvent) => e.stopPropagation()}\n >\n <Checkbox\n checked={selected}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </CheckboxOverlay>\n )}\n <AssetPreview asset={asset} />\n {/* The header is the card's only positioned ancestor, and it's the part\n worth covering — the footer keeps the name legible while the preview\n is mid-replace. Below the checkbox overlay (z-index 1) would hide\n the spinner, so it sits above it. */}\n {busyMessage !== null ? <BusyOverlay zIndex={2}>{busyMessage}</BusyOverlay> : null}\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <NameButton type=\"button\" onClick={handleNameClick}>\n <FileName textColor=\"primary800\">{asset.name}</FileName>\n </NameButton>\n <Flex\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopCardEvent}\n onKeyDown={stopCardEvent}\n onPointerDown={stopCardEvent}\n >\n <AssetActionsMenu asset={asset} dragData={dragData} />\n </Flex>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n /** Keys of the rendered items, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({\n assets,\n folders = [],\n renderedKeys,\n onAssetItemClick,\n}: AssetsGridProps) => {\n const totalItems = folders.length + assets.length;\n\n // Render order: folders always on top in the grid (mixing is table-only) —\n // range selection follows it.\n const orderedItemKeys: ItemKey[] = renderedKeys ?? buildRenderedKeys({ folders, assets });\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty grid renders nothing at all.\n if (totalItems === 0) {\n return null;\n }\n\n return (\n <ItemsGrid role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <ItemsGrid>\n {folders.map((folder) => (\n <FolderCard\n folder={folder}\n orderedItemKeys={orderedItemKeys}\n key={`folder-${folder.id}`}\n />\n ))}\n </ItemsGrid>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Flex key={asset.id} direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n </Flex>\n ))}\n </ItemsGrid>\n );\n};\n"],"names":["stopCardEvent","e","isEventFromWithin","stopPropagation","CheckboxOverlay","styled","Flex","theme","spaces","shadows","filterShadow","StyledCard","Card","$isSelected","colors","primary600","neutral200","$isMovePending","$isBusy","$isDragging","primary100","undefined","FoldersRow","Box","MIN_TILE_WIDTH","ItemsGrid","StyledFolderCard","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","TruncatedText","FolderCard","folder","orderedItemKeys","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","isSelected","toggle","selectRange","useAssetSelection","canUpdate","useMediaLibraryPermissions","openContextMenu","useItemContextMenuTrigger","dragData","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","key","folderKey","id","node","handleClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleCheckboxClick","_jsxs","ref","onClick","onKeyDown","onPointerDown","role","tabIndex","data-native-context-menu","onContextMenu","kind","_jsx","Checkbox","checked","aria-label","getTranslationKey","defaultMessage","name","FolderIcon","width","height","textColor","FolderActionsMenu","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","updatedAt","isLocal","isUrlSigned","includes","ASSET_TYPES","Image","cacheKey","Date","getTime","appendCacheBuster","raw","rawMediaURL","prefixFileUrlWithBackendUrl","thumbnail","mediaURL","src","alt","crossOrigin","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","NameButton","button","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","busyMessage","useBusyAssetsOptional","getBusyMessage","assetKey","selected","handleCardClick","handleNameClick","ASSET_DETAILS_TRIGGER_PROPS","ASSET_ITEM_CONTROL_PROPS","BusyOverlay","zIndex","CardBody","gap","type","AssetActionsMenu","AssetsGrid","assets","folders","renderedKeys","totalItems","length","buildRenderedKeys","data-testid","map","direction"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsGrid.js","sources":["../../../../../admin/src/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Checkbox,\n Divider,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { TruncatedText } from '../../../components/TruncatedText';\nimport { ASSET_TYPES } from '../../../enums';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { isEventFromWithin } from '../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { useListSettings } from '../hooks/useListSettings';\nimport { buildRenderedKeys } from '../utils/renderedKeys';\nimport { assetKey, folderKey, getSelectAllState, type ItemKey } from '../utils/selection';\n\nimport { AssetActionsMenu } from './AssetActionsMenu';\nimport { BusyOverlay } from './BusyOverlay';\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { isFromReorderHandle } from './Dnd/assetSortable';\nimport { ReorderHandle } from './Dnd/ReorderHandle';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\nimport { FolderActionsMenu } from './FolderActionsMenu';\nimport { useItemContextMenuTrigger } from './ItemContextMenu';\n\nimport type { File } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\n\nconst EMPTY_FOLDERS: NonNullable<AssetsGridProps['folders']> = [];\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\n// Cards own click, Enter and Space; the controls sitting on them (checkbox, \"...\"\n// menu) must not let those reach the card. Scoped to the wrapper's own DOM\n// subtree so the menu's portaled content — a React child of the wrapper, but\n// never a DOM descendant — still reaches `document`, where Radix listens in\n// order to dismiss its layers.\nconst stopCardEvent = (e: React.SyntheticEvent) => {\n if (isEventFromWithin(e)) {\n e.stopPropagation();\n }\n};\n\n// Top-left selection checkbox overlaid on the asset preview, always visible.\nconst CheckboxOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n left: ${({ theme }) => theme.spaces[3]};\n z-index: 1;\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n`;\n\nconst StyledCard = styled(Card)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isBusy?: boolean;\n $isSelected?: boolean;\n /** Shown but not choosable here (the picker's `allowedTypes`). */\n $isUnselectable?: boolean;\n}>`\n border: 1px solid\n ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary600 : theme.colors.neutral200)};\n border-radius: 8px;\n overflow: hidden;\n isolation: isolate;\n cursor: ${({ $isMovePending, $isBusy, $isUnselectable }) => {\n if ($isMovePending || $isBusy) return 'wait';\n return $isUnselectable ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging, $isUnselectable }) => ($isDragging || $isUnselectable ? 0.4 : 1)};\n /* No opacity change while busy — the overlay does the dimming, and stacking\n one on the other would wash the card out. */\n pointer-events: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'none' : 'auto')};\n background: ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary100 : undefined)};\n /* Shift+click range selection must not highlight card text. */\n user-select: none;\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledItemsGrid = styled(Box)<{ $minTileWidth: string }>`\n display: grid;\n grid-template-columns: ${({ $minTileWidth }) =>\n `repeat(auto-fill, minmax(min(${$minTileWidth}, 100%), 1fr))`};\n gap: ${({ theme }) => theme.spaces[4]};\n`;\n\nconst ItemsGrid = (props: React.ComponentProps<typeof Box>) => {\n const { gridMinTileWidth } = useListSettings();\n\n return <StyledItemsGrid $minTileWidth={gridMinTileWidth} {...props} />;\n};\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n width: 100%;\n user-select: none;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid\n ${({ theme, $isSelected }) => ($isSelected ? theme.colors.primary600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(TruncatedText)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderCard = ({ folder, orderedItemKeys }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { isSelected, toggle, selectRange, getSelectability } = useAssetSelection();\n const { showItemActions } = useListSettings();\n const openContextMenu = useItemContextMenuTrigger();\n const {\n dragData,\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n const selectability = getSelectability(key);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n // Folders share the selection mechanism with assets (toggle, range,\n // select-all). Only the plain-click semantic differs: it navigates into the\n // folder instead of selecting it.\n //\n // The containment guard on this and the handlers below is what keeps the\n // actions menu's portaled dialogs — React children of this card — from\n // navigating into the folder or starting a drag.\n const handleClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n // Checkbox is the pointer path to selection; Shift extends the range.\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n role=\"listitem\"\n tabIndex={0}\n // Right-click opens this folder's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'folder', folder, dragData });\n }\n }}\n >\n {selectability !== 'hidden' && (\n <Flex onKeyDown={(e: React.KeyboardEvent) => e.stopPropagation()}>\n <Checkbox\n checked={isSelected(key)}\n disabled={selectability === 'disabled'}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n )}\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\">{folder.name}</FolderName>\n {showItemActions && (\n <Flex onClick={stopCardEvent} onKeyDown={stopCardEvent} onPointerDown={stopCardEvent}>\n <FolderActionsMenu folder={folder} dragData={dragData} />\n </Flex>\n )}\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url, updatedAt, isLocal, isUrlSigned } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n // Replace keeps the same hash/URL, so without a cache-buster the browser\n // serves the stale thumbnail after a Replace Media. `updatedAt`\n // changes on replace, so it re-fetches exactly once per replacement.\n // Skipped for signed URLs — an extra query param invalidates the signature.\n const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string) => {\n if (cacheKey === undefined) {\n return raw;\n }\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n\n const rawMediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n const mediaURL = rawMediaURL ? appendCacheBuster(rawMediaURL) : rawMediaURL;\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n // Only signed remote URLs need crossOrigin (cache collision with\n // the preview). Public/unsigned remote thumbnails must render\n // without a bucket CORS rule. See #26581.\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n position: relative;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(TruncatedText)`\n flex: 1;\n min-width: 0;\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the card (mirrors the table view).\nconst NameButton = styled.button`\n display: inline-flex;\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\ninterface AssetCardProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, orderedItemKeys, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging, dragData, dragStyle, dragHandle } =\n useFileDraggable(asset);\n const { isSelected, toggle, selectRange, getSelectability } = useAssetSelection();\n const { showItemActions } = useListSettings();\n const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;\n const openContextMenu = useItemContextMenuTrigger();\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n const selectability = getSelectability(key);\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n //\n // The containment guard on this and the handler below is what keeps the\n // actions menu's portaled dialogs — React children of this card — from\n // opening the details drawer or toggling the selection.\n const handleCardClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e) || isFromReorderHandle(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n // Same semantics as the table's row checkbox: Shift extends the range,\n // otherwise a plain additive toggle. Never bubbles into the card click.\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n $isUnselectable={selectability === 'disabled'}\n style={dragStyle}\n tabIndex={0}\n role=\"listitem\"\n // Right-click opens this asset's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'asset', asset, dragData });\n }\n }}\n onDragStart={(e) => e.preventDefault()}\n onClick={handleCardClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n <StyledCardHeader>\n {selectability !== 'hidden' && (\n <CheckboxOverlay\n {...ASSET_ITEM_CONTROL_PROPS}\n onKeyDown={(e: React.KeyboardEvent) => e.stopPropagation()}\n >\n <Checkbox\n checked={selected}\n disabled={selectability === 'disabled'}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </CheckboxOverlay>\n )}\n <AssetPreview asset={asset} />\n {/* The header is the card's only positioned ancestor, and it's the part\n worth covering — the footer keeps the name legible while the preview\n is mid-replace. Below the checkbox overlay (z-index 1) would hide\n the spinner, so it sits above it. */}\n {busyMessage !== null ? <BusyOverlay zIndex={2}>{busyMessage}</BusyOverlay> : null}\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n {/* The grip takes the type icon's place: the preview above already\n shows what the asset is. */}\n {dragHandle ? (\n <ReorderHandle name={asset.name} handle={dragHandle} />\n ) : (\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n )}\n <NameButton type=\"button\" onClick={handleNameClick}>\n <FileName textColor=\"primary800\">{asset.name}</FileName>\n </NameButton>\n {showItemActions && (\n <Flex\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopCardEvent}\n onKeyDown={stopCardEvent}\n onPointerDown={stopCardEvent}\n >\n <AssetActionsMenu asset={asset} dragData={dragData} />\n </Flex>\n )}\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GridSectionProps {\n title: string;\n /** Sits at the end of the heading row. */\n action?: React.ReactNode;\n children: React.ReactNode;\n}\n\n// Headings sit outside the `role=\"list\"` grid: a list may only contain items.\nconst GridSection = ({ title, action, children }: GridSectionProps) => (\n <Flex tag=\"section\" direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={4}>\n <Typography variant=\"delta\" tag=\"h3\">\n {title}\n </Typography>\n {action}\n </Flex>\n <ItemsGrid role=\"list\">{children}</ItemsGrid>\n </Flex>\n);\n\n/**\n * The grid's counterpart of the table's header checkbox: selects the loaded\n * assets that can be selected, or un-selects them when they all are.\n */\nconst GridSelectAll = ({ assets }: { assets: File[] }) => {\n const { formatMessage } = useIntl();\n const { selectedKeys, selectAll, deselectAll, getSelectability } = useAssetSelection();\n const { trackUsage } = useTracking();\n\n const selectableKeys = assets\n .map((asset) => assetKey(asset.id))\n .filter((key) => getSelectability(key) === 'enabled');\n const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, selectableKeys);\n\n const handleChange = () => {\n if (allSelected) {\n deselectAll(selectableKeys);\n } else {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(selectableKeys);\n }\n };\n\n return (\n <Checkbox\n checked={isIndeterminate ? 'indeterminate' : allSelected}\n disabled={selectableKeys.length === 0}\n onCheckedChange={handleChange}\n >\n {formatMessage({\n id: getTranslationKey('list.table.header.select-all'),\n defaultMessage: 'Select all',\n })}\n </Checkbox>\n );\n};\n\ninterface AssetsGridProps {\n assets: File[];\n /** Shown in the \"Assets (n)\" heading; falls back to the loaded count. */\n assetsTotal?: number;\n folders?: Folder[];\n /** Keys of the rendered items, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({\n assets,\n assetsTotal,\n folders = EMPTY_FOLDERS,\n renderedKeys,\n onAssetItemClick,\n}: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n const { showSectionHeadings, showGridSelectAll } = useListSettings();\n const { isEnabled, canSelectAll } = useAssetSelection();\n const totalItems = folders.length + assets.length;\n\n // Render order: folders always on top in the grid (mixing is table-only) —\n // range selection follows it.\n const orderedItemKeys: ItemKey[] = renderedKeys ?? buildRenderedKeys({ folders, assets });\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty grid renders nothing at all.\n if (totalItems === 0) {\n return null;\n }\n\n const folderCards = folders.map((folder) => (\n <FolderCard folder={folder} orderedItemKeys={orderedItemKeys} key={`folder-${folder.id}`} />\n ));\n const assetCards = assets.map((asset) => (\n <Flex key={asset.id} direction=\"column\" alignItems=\"stretch\">\n <AssetCard\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n </Flex>\n ));\n\n if (showSectionHeadings) {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <GridSection\n title={formatMessage(\n { id: getTranslationKey('list.folders.title'), defaultMessage: 'Folders ({count})' },\n { count: folders.length }\n )}\n >\n {folderCards}\n </GridSection>\n )}\n {folders.length > 0 && assets.length > 0 && <Divider />}\n {assets.length > 0 && (\n <GridSection\n title={formatMessage(\n { id: getTranslationKey('list.assets.title'), defaultMessage: 'Assets ({count})' },\n { count: assetsTotal ?? assets.length }\n )}\n action={\n showGridSelectAll && isEnabled && canSelectAll ? (\n <GridSelectAll assets={assets} />\n ) : undefined\n }\n >\n {assetCards}\n </GridSection>\n )}\n </Flex>\n );\n }\n\n return (\n <ItemsGrid role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <ItemsGrid>{folderCards}</ItemsGrid>\n </FoldersRow>\n )}\n {assetCards}\n </ItemsGrid>\n );\n};\n"],"names":["EMPTY_FOLDERS","stopCardEvent","e","isEventFromWithin","stopPropagation","CheckboxOverlay","styled","Flex","theme","spaces","shadows","filterShadow","StyledCard","Card","$isSelected","colors","primary600","neutral200","$isMovePending","$isBusy","$isUnselectable","$isDragging","primary100","undefined","FoldersRow","Box","StyledItemsGrid","$minTileWidth","ItemsGrid","props","gridMinTileWidth","useListSettings","_jsx","StyledFolderCard","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","TruncatedText","FolderCard","folder","orderedItemKeys","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","isSelected","toggle","selectRange","getSelectability","useAssetSelection","showItemActions","openContextMenu","useItemContextMenuTrigger","dragData","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","key","folderKey","id","selectability","node","handleClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleCheckboxClick","_jsxs","ref","onClick","onKeyDown","onPointerDown","role","tabIndex","data-native-context-menu","onContextMenu","kind","Checkbox","checked","disabled","aria-label","getTranslationKey","defaultMessage","name","FolderIcon","width","height","textColor","FolderActionsMenu","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","updatedAt","isLocal","isUrlSigned","includes","ASSET_TYPES","Image","cacheKey","Date","getTime","appendCacheBuster","raw","rawMediaURL","prefixFileUrlWithBackendUrl","thumbnail","mediaURL","src","alt","crossOrigin","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","NameButton","button","AssetCard","onAssetItemClick","TypeIcon","dragStyle","dragHandle","useFileDraggable","busyMessage","useBusyAssetsOptional","getBusyMessage","assetKey","selected","handleCardClick","isFromReorderHandle","handleNameClick","ASSET_DETAILS_TRIGGER_PROPS","style","ASSET_ITEM_CONTROL_PROPS","BusyOverlay","zIndex","CardBody","gap","ReorderHandle","handle","type","AssetActionsMenu","GridSection","title","action","children","tag","direction","Typography","variant","GridSelectAll","assets","selectedKeys","selectAll","deselectAll","trackUsage","useTracking","selectableKeys","map","filter","allSelected","isIndeterminate","getSelectAllState","handleChange","length","onCheckedChange","AssetsGrid","assetsTotal","folders","renderedKeys","showSectionHeadings","showGridSelectAll","isEnabled","canSelectAll","totalItems","buildRenderedKeys","folderCards","assetCards","data-testid","count","Divider"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Flex, Box, Checkbox, CardBody,
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Flex, Card, Box, CardHeader, Divider, Checkbox, CardBody, Typography } from '@strapi/design-system';
|
|
3
3
|
import { Folder } from '@strapi/icons';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
5
|
import { styled, css } from 'styled-components';
|
|
6
6
|
import { TruncatedText } from '../../../components/TruncatedText.mjs';
|
|
7
7
|
import { ASSET_TYPES } from '../../../enums.mjs';
|
|
8
|
-
import {
|
|
8
|
+
import { useTracking } from '../../../hooks/useTracking.mjs';
|
|
9
9
|
import { prefixFileUrlWithBackendUrl } from '../../../utils/files.mjs';
|
|
10
10
|
import { getAssetIcon } from '../../../utils/getAssetIcon.mjs';
|
|
11
11
|
import { isEventFromWithin } from '../../../utils/isEventFromWithin.mjs';
|
|
@@ -14,15 +14,19 @@ import { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS } from '../consta
|
|
|
14
14
|
import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
|
|
15
15
|
import { useBusyAssetsOptional } from '../hooks/useBusyAssets.mjs';
|
|
16
16
|
import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
|
|
17
|
+
import { useListSettings } from '../hooks/useListSettings.mjs';
|
|
17
18
|
import { buildRenderedKeys } from '../utils/renderedKeys.mjs';
|
|
18
|
-
import { folderKey, assetKey } from '../utils/selection.mjs';
|
|
19
|
+
import { folderKey, assetKey, getSelectAllState } from '../utils/selection.mjs';
|
|
19
20
|
import { AssetActionsMenu } from './AssetActionsMenu.mjs';
|
|
20
21
|
import { BusyOverlay } from './BusyOverlay.mjs';
|
|
21
22
|
import { useAssetsDndOptional } from './Dnd/AssetsDndProvider.mjs';
|
|
23
|
+
import { isFromReorderHandle } from './Dnd/assetSortable.mjs';
|
|
24
|
+
import { ReorderHandle } from './Dnd/ReorderHandle.mjs';
|
|
22
25
|
import { useFolderDraggableDroppable, useFileDraggable } from './Dnd/useAssetDnd.mjs';
|
|
23
26
|
import { FolderActionsMenu } from './FolderActionsMenu.mjs';
|
|
24
27
|
import { useItemContextMenuTrigger } from './ItemContextMenu.mjs';
|
|
25
28
|
|
|
29
|
+
const EMPTY_FOLDERS = [];
|
|
26
30
|
/* -------------------------------------------------------------------------------------------------
|
|
27
31
|
* AssetsGrid
|
|
28
32
|
* -----------------------------------------------------------------------------------------------*/ // Cards own click, Enter and Space; the controls sitting on them (checkbox, "..."
|
|
@@ -49,8 +53,11 @@ const StyledCard = styled(Card)`
|
|
|
49
53
|
border-radius: 8px;
|
|
50
54
|
overflow: hidden;
|
|
51
55
|
isolation: isolate;
|
|
52
|
-
cursor: ${({ $isMovePending, $isBusy
|
|
53
|
-
|
|
56
|
+
cursor: ${({ $isMovePending, $isBusy, $isUnselectable })=>{
|
|
57
|
+
if ($isMovePending || $isBusy) return 'wait';
|
|
58
|
+
return $isUnselectable ? 'not-allowed' : 'pointer';
|
|
59
|
+
}};
|
|
60
|
+
opacity: ${({ $isDragging, $isUnselectable })=>$isDragging || $isUnselectable ? 0.4 : 1};
|
|
54
61
|
/* No opacity change while busy — the overlay does the dimming, and stacking
|
|
55
62
|
one on the other would wash the card out. */
|
|
56
63
|
pointer-events: ${({ $isMovePending, $isBusy })=>$isMovePending || $isBusy ? 'none' : 'auto'};
|
|
@@ -72,12 +79,18 @@ const StyledCard = styled(Card)`
|
|
|
72
79
|
* -----------------------------------------------------------------------------------------------*/ const FoldersRow = styled(Box)`
|
|
73
80
|
grid-column: 1 / -1;
|
|
74
81
|
`;
|
|
75
|
-
const
|
|
76
|
-
const ItemsGrid = styled(Box)`
|
|
82
|
+
const StyledItemsGrid = styled(Box)`
|
|
77
83
|
display: grid;
|
|
78
|
-
grid-template-columns: repeat(auto-fill, minmax(min(${
|
|
84
|
+
grid-template-columns: ${({ $minTileWidth })=>`repeat(auto-fill, minmax(min(${$minTileWidth}, 100%), 1fr))`};
|
|
79
85
|
gap: ${({ theme })=>theme.spaces[4]};
|
|
80
86
|
`;
|
|
87
|
+
const ItemsGrid = (props)=>{
|
|
88
|
+
const { gridMinTileWidth } = useListSettings();
|
|
89
|
+
return /*#__PURE__*/ jsx(StyledItemsGrid, {
|
|
90
|
+
$minTileWidth: gridMinTileWidth,
|
|
91
|
+
...props
|
|
92
|
+
});
|
|
93
|
+
};
|
|
81
94
|
const StyledFolderCard = styled(Flex)`
|
|
82
95
|
width: 100%;
|
|
83
96
|
user-select: none;
|
|
@@ -126,11 +139,12 @@ const FolderCard = ({ folder, orderedItemKeys })=>{
|
|
|
126
139
|
const { isMovePending } = useAssetsDndOptional() ?? {
|
|
127
140
|
isMovePending: false
|
|
128
141
|
};
|
|
129
|
-
const { isSelected, toggle, selectRange } = useAssetSelection();
|
|
130
|
-
const {
|
|
142
|
+
const { isSelected, toggle, selectRange, getSelectability } = useAssetSelection();
|
|
143
|
+
const { showItemActions } = useListSettings();
|
|
131
144
|
const openContextMenu = useItemContextMenuTrigger();
|
|
132
145
|
const { dragData, draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging }, droppable: { setNodeRef: setDropRef }, showValidDropHighlight, showInvalidDropCursor } = useFolderDraggableDroppable(folder);
|
|
133
146
|
const key = folderKey(folder.id);
|
|
147
|
+
const selectability = getSelectability(key);
|
|
134
148
|
const setNodeRef = (node)=>{
|
|
135
149
|
setDragRef(node);
|
|
136
150
|
setDropRef(node);
|
|
@@ -207,10 +221,11 @@ const FolderCard = ({ folder, orderedItemKeys })=>{
|
|
|
207
221
|
}
|
|
208
222
|
},
|
|
209
223
|
children: [
|
|
210
|
-
|
|
224
|
+
selectability !== 'hidden' && /*#__PURE__*/ jsx(Flex, {
|
|
211
225
|
onKeyDown: (e)=>e.stopPropagation(),
|
|
212
226
|
children: /*#__PURE__*/ jsx(Checkbox, {
|
|
213
227
|
checked: isSelected(key),
|
|
228
|
+
disabled: selectability === 'disabled',
|
|
214
229
|
onClick: handleCheckboxClick,
|
|
215
230
|
"aria-label": formatMessage({
|
|
216
231
|
id: getTranslationKey('list.table.row.select'),
|
|
@@ -230,7 +245,7 @@ const FolderCard = ({ folder, orderedItemKeys })=>{
|
|
|
230
245
|
textColor: "neutral800",
|
|
231
246
|
children: folder.name
|
|
232
247
|
}),
|
|
233
|
-
/*#__PURE__*/ jsx(Flex, {
|
|
248
|
+
showItemActions && /*#__PURE__*/ jsx(Flex, {
|
|
234
249
|
onClick: stopCardEvent,
|
|
235
250
|
onKeyDown: stopCardEvent,
|
|
236
251
|
onPointerDown: stopCardEvent,
|
|
@@ -361,13 +376,14 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
361
376
|
const { isMovePending } = useAssetsDndOptional() ?? {
|
|
362
377
|
isMovePending: false
|
|
363
378
|
};
|
|
364
|
-
const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);
|
|
365
|
-
const { isSelected, toggle, selectRange } = useAssetSelection();
|
|
366
|
-
const {
|
|
379
|
+
const { attributes, listeners, setNodeRef, isDragging, dragData, dragStyle, dragHandle } = useFileDraggable(asset);
|
|
380
|
+
const { isSelected, toggle, selectRange, getSelectability } = useAssetSelection();
|
|
381
|
+
const { showItemActions } = useListSettings();
|
|
367
382
|
const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;
|
|
368
383
|
const openContextMenu = useItemContextMenuTrigger();
|
|
369
384
|
const key = assetKey(asset.id);
|
|
370
385
|
const selected = isSelected(key);
|
|
386
|
+
const selectability = getSelectability(key);
|
|
371
387
|
// Plain click opens the asset details; pointer selection lives on the
|
|
372
388
|
// checkbox only. Modifier clicks keep the selection semantics: shift selects
|
|
373
389
|
// a range, cmd/ctrl toggles.
|
|
@@ -389,7 +405,7 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
389
405
|
};
|
|
390
406
|
// Space toggles selection (additive), Enter opens the details drawer.
|
|
391
407
|
const handleKeyDown = (e)=>{
|
|
392
|
-
if (!isEventFromWithin(e)) {
|
|
408
|
+
if (!isEventFromWithin(e) || isFromReorderHandle(e)) {
|
|
393
409
|
return;
|
|
394
410
|
}
|
|
395
411
|
if (e.key === 'Enter') {
|
|
@@ -423,6 +439,8 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
423
439
|
$isMovePending: isMovePending,
|
|
424
440
|
$isBusy: busyMessage !== null,
|
|
425
441
|
$isSelected: selected,
|
|
442
|
+
$isUnselectable: selectability === 'disabled',
|
|
443
|
+
style: dragStyle,
|
|
426
444
|
tabIndex: 0,
|
|
427
445
|
role: "listitem",
|
|
428
446
|
// Right-click opens this asset's own actions, or the selection's when it
|
|
@@ -449,11 +467,12 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
449
467
|
children: [
|
|
450
468
|
/*#__PURE__*/ jsxs(StyledCardHeader, {
|
|
451
469
|
children: [
|
|
452
|
-
|
|
470
|
+
selectability !== 'hidden' && /*#__PURE__*/ jsx(CheckboxOverlay, {
|
|
453
471
|
...ASSET_ITEM_CONTROL_PROPS,
|
|
454
472
|
onKeyDown: (e)=>e.stopPropagation(),
|
|
455
473
|
children: /*#__PURE__*/ jsx(Checkbox, {
|
|
456
474
|
checked: selected,
|
|
475
|
+
disabled: selectability === 'disabled',
|
|
457
476
|
onClick: handleCheckboxClick,
|
|
458
477
|
"aria-label": formatMessage({
|
|
459
478
|
id: getTranslationKey('list.table.row.select'),
|
|
@@ -477,7 +496,10 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
477
496
|
alignItems: "center",
|
|
478
497
|
gap: 2,
|
|
479
498
|
children: [
|
|
480
|
-
/*#__PURE__*/ jsx(
|
|
499
|
+
dragHandle ? /*#__PURE__*/ jsx(ReorderHandle, {
|
|
500
|
+
name: asset.name,
|
|
501
|
+
handle: dragHandle
|
|
502
|
+
}) : /*#__PURE__*/ jsx(FileTypeIcon, {
|
|
481
503
|
children: /*#__PURE__*/ jsx(TypeIcon, {
|
|
482
504
|
width: 20,
|
|
483
505
|
height: 20
|
|
@@ -491,7 +513,7 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
491
513
|
children: asset.name
|
|
492
514
|
})
|
|
493
515
|
}),
|
|
494
|
-
/*#__PURE__*/ jsx(Flex, {
|
|
516
|
+
showItemActions && /*#__PURE__*/ jsx(Flex, {
|
|
495
517
|
...ASSET_ITEM_CONTROL_PROPS,
|
|
496
518
|
onClick: stopCardEvent,
|
|
497
519
|
onKeyDown: stopCardEvent,
|
|
@@ -507,7 +529,63 @@ const AssetCard = ({ asset, orderedItemKeys, onAssetItemClick })=>{
|
|
|
507
529
|
]
|
|
508
530
|
});
|
|
509
531
|
};
|
|
510
|
-
|
|
532
|
+
// Headings sit outside the `role="list"` grid: a list may only contain items.
|
|
533
|
+
const GridSection = ({ title, action, children })=>/*#__PURE__*/ jsxs(Flex, {
|
|
534
|
+
tag: "section",
|
|
535
|
+
direction: "column",
|
|
536
|
+
alignItems: "stretch",
|
|
537
|
+
gap: 4,
|
|
538
|
+
children: [
|
|
539
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
540
|
+
justifyContent: "space-between",
|
|
541
|
+
alignItems: "center",
|
|
542
|
+
gap: 4,
|
|
543
|
+
children: [
|
|
544
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
545
|
+
variant: "delta",
|
|
546
|
+
tag: "h3",
|
|
547
|
+
children: title
|
|
548
|
+
}),
|
|
549
|
+
action
|
|
550
|
+
]
|
|
551
|
+
}),
|
|
552
|
+
/*#__PURE__*/ jsx(ItemsGrid, {
|
|
553
|
+
role: "list",
|
|
554
|
+
children: children
|
|
555
|
+
})
|
|
556
|
+
]
|
|
557
|
+
});
|
|
558
|
+
/**
|
|
559
|
+
* The grid's counterpart of the table's header checkbox: selects the loaded
|
|
560
|
+
* assets that can be selected, or un-selects them when they all are.
|
|
561
|
+
*/ const GridSelectAll = ({ assets })=>{
|
|
562
|
+
const { formatMessage } = useIntl();
|
|
563
|
+
const { selectedKeys, selectAll, deselectAll, getSelectability } = useAssetSelection();
|
|
564
|
+
const { trackUsage } = useTracking();
|
|
565
|
+
const selectableKeys = assets.map((asset)=>assetKey(asset.id)).filter((key)=>getSelectability(key) === 'enabled');
|
|
566
|
+
const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, selectableKeys);
|
|
567
|
+
const handleChange = ()=>{
|
|
568
|
+
if (allSelected) {
|
|
569
|
+
deselectAll(selectableKeys);
|
|
570
|
+
} else {
|
|
571
|
+
trackUsage('didSelectAllMediaLibraryElements');
|
|
572
|
+
selectAll(selectableKeys);
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
return /*#__PURE__*/ jsx(Checkbox, {
|
|
576
|
+
checked: isIndeterminate ? 'indeterminate' : allSelected,
|
|
577
|
+
disabled: selectableKeys.length === 0,
|
|
578
|
+
onCheckedChange: handleChange,
|
|
579
|
+
children: formatMessage({
|
|
580
|
+
id: getTranslationKey('list.table.header.select-all'),
|
|
581
|
+
defaultMessage: 'Select all'
|
|
582
|
+
})
|
|
583
|
+
});
|
|
584
|
+
};
|
|
585
|
+
const AssetsGrid = ({ assets, assetsTotal, folders = EMPTY_FOLDERS, renderedKeys, onAssetItemClick })=>{
|
|
586
|
+
const { formatMessage } = useIntl();
|
|
587
|
+
const { showSectionHeadings, showGridSelectAll } = useListSettings();
|
|
588
|
+
const { isEnabled, canSelectAll } = useAssetSelection();
|
|
511
589
|
const totalItems = folders.length + assets.length;
|
|
512
590
|
// Render order: folders always on top in the grid (mixing is table-only) —
|
|
513
591
|
// range selection follows it.
|
|
@@ -520,27 +598,61 @@ const AssetsGrid = ({ assets, folders = [], renderedKeys, onAssetItemClick })=>{
|
|
|
520
598
|
if (totalItems === 0) {
|
|
521
599
|
return null;
|
|
522
600
|
}
|
|
601
|
+
const folderCards = folders.map((folder)=>/*#__PURE__*/ jsx(FolderCard, {
|
|
602
|
+
folder: folder,
|
|
603
|
+
orderedItemKeys: orderedItemKeys
|
|
604
|
+
}, `folder-${folder.id}`));
|
|
605
|
+
const assetCards = assets.map((asset)=>/*#__PURE__*/ jsx(Flex, {
|
|
606
|
+
direction: "column",
|
|
607
|
+
alignItems: "stretch",
|
|
608
|
+
children: /*#__PURE__*/ jsx(AssetCard, {
|
|
609
|
+
asset: asset,
|
|
610
|
+
orderedItemKeys: orderedItemKeys,
|
|
611
|
+
onAssetItemClick: onAssetItemClick
|
|
612
|
+
})
|
|
613
|
+
}, asset.id));
|
|
614
|
+
if (showSectionHeadings) {
|
|
615
|
+
return /*#__PURE__*/ jsxs(Flex, {
|
|
616
|
+
direction: "column",
|
|
617
|
+
alignItems: "stretch",
|
|
618
|
+
gap: 6,
|
|
619
|
+
"data-testid": "assets-grid",
|
|
620
|
+
children: [
|
|
621
|
+
folders.length > 0 && /*#__PURE__*/ jsx(GridSection, {
|
|
622
|
+
title: formatMessage({
|
|
623
|
+
id: getTranslationKey('list.folders.title'),
|
|
624
|
+
defaultMessage: 'Folders ({count})'
|
|
625
|
+
}, {
|
|
626
|
+
count: folders.length
|
|
627
|
+
}),
|
|
628
|
+
children: folderCards
|
|
629
|
+
}),
|
|
630
|
+
folders.length > 0 && assets.length > 0 && /*#__PURE__*/ jsx(Divider, {}),
|
|
631
|
+
assets.length > 0 && /*#__PURE__*/ jsx(GridSection, {
|
|
632
|
+
title: formatMessage({
|
|
633
|
+
id: getTranslationKey('list.assets.title'),
|
|
634
|
+
defaultMessage: 'Assets ({count})'
|
|
635
|
+
}, {
|
|
636
|
+
count: assetsTotal ?? assets.length
|
|
637
|
+
}),
|
|
638
|
+
action: showGridSelectAll && isEnabled && canSelectAll ? /*#__PURE__*/ jsx(GridSelectAll, {
|
|
639
|
+
assets: assets
|
|
640
|
+
}) : undefined,
|
|
641
|
+
children: assetCards
|
|
642
|
+
})
|
|
643
|
+
]
|
|
644
|
+
});
|
|
645
|
+
}
|
|
523
646
|
return /*#__PURE__*/ jsxs(ItemsGrid, {
|
|
524
647
|
role: "list",
|
|
525
648
|
"data-testid": "assets-grid",
|
|
526
649
|
children: [
|
|
527
650
|
folders.length > 0 && /*#__PURE__*/ jsx(FoldersRow, {
|
|
528
651
|
children: /*#__PURE__*/ jsx(ItemsGrid, {
|
|
529
|
-
children:
|
|
530
|
-
folder: folder,
|
|
531
|
-
orderedItemKeys: orderedItemKeys
|
|
532
|
-
}, `folder-${folder.id}`))
|
|
652
|
+
children: folderCards
|
|
533
653
|
})
|
|
534
654
|
}),
|
|
535
|
-
|
|
536
|
-
direction: "column",
|
|
537
|
-
alignItems: "stretch",
|
|
538
|
-
children: /*#__PURE__*/ jsx(AssetCard, {
|
|
539
|
-
asset: asset,
|
|
540
|
-
orderedItemKeys: orderedItemKeys,
|
|
541
|
-
onAssetItemClick: onAssetItemClick
|
|
542
|
-
})
|
|
543
|
-
}, asset.id))
|
|
655
|
+
assetCards
|
|
544
656
|
]
|
|
545
657
|
});
|
|
546
658
|
};
|