@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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Breadcrumbs, CrumbSimpleMenu, MenuItem, Crumb } from '@strapi/design-system';
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
4
|
+
import { styled } from 'styled-components';
|
|
5
|
+
import { useGetFolderStructureQuery } from '../../services/folders.mjs';
|
|
6
|
+
import { findFolderPath } from '../../utils/findFolderPath.mjs';
|
|
7
|
+
import { getTranslationKey } from '../../utils/translations.mjs';
|
|
8
|
+
|
|
9
|
+
// Past this many folders, the ones between the first and the parent collapse
|
|
10
|
+
// into a menu, so a deep tree doesn't wrap the trail over several lines.
|
|
11
|
+
const MAX_VISIBLE_FOLDERS = 3;
|
|
12
|
+
// `CrumbLink`'s look on a real button. `CrumbLink` only renders an anchor, and
|
|
13
|
+
// one without an `href` is neither announced as a button nor reachable by Tab.
|
|
14
|
+
const CrumbButton = styled.button`
|
|
15
|
+
border: none;
|
|
16
|
+
background: none;
|
|
17
|
+
cursor: pointer;
|
|
18
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
19
|
+
color: ${({ theme })=>theme.colors.neutral600};
|
|
20
|
+
font-size: ${({ theme })=>theme.fontSizes[1]};
|
|
21
|
+
line-height: ${({ theme })=>theme.lineHeights[4]};
|
|
22
|
+
padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
|
|
23
|
+
|
|
24
|
+
&:hover,
|
|
25
|
+
&:focus-visible {
|
|
26
|
+
background-color: ${({ theme })=>theme.colors.neutral200};
|
|
27
|
+
color: ${({ theme })=>theme.colors.neutral700};
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
/**
|
|
31
|
+
* Home › … › parent › current. Every crumb but the current folder navigates,
|
|
32
|
+
* so a user deep in the tree can climb back without a sidebar.
|
|
33
|
+
*/ const FolderBreadcrumbs = ({ currentFolderId, onSelectFolder })=>{
|
|
34
|
+
const { formatMessage } = useIntl();
|
|
35
|
+
const { data: folderStructure = [] } = useGetFolderStructureQuery();
|
|
36
|
+
const path = findFolderPath(folderStructure, currentFolderId);
|
|
37
|
+
const current = path?.at(-1);
|
|
38
|
+
// The tree has not loaded yet, or no longer holds the folder (deleted
|
|
39
|
+
// elsewhere — `useAssetsList` sends the list back to the root on its own).
|
|
40
|
+
if (!path || !current) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const ancestors = path.slice(0, -1);
|
|
44
|
+
const isCollapsed = path.length > MAX_VISIBLE_FOLDERS;
|
|
45
|
+
const leading = isCollapsed ? ancestors.slice(0, 1) : ancestors;
|
|
46
|
+
const hidden = isCollapsed ? ancestors.slice(1, -1) : [];
|
|
47
|
+
const trailing = isCollapsed ? ancestors.slice(-1) : [];
|
|
48
|
+
const renderLink = (folder)=>/*#__PURE__*/ jsx(CrumbButton, {
|
|
49
|
+
type: "button",
|
|
50
|
+
onClick: ()=>onSelectFolder(folder.id ?? null),
|
|
51
|
+
children: folder.name
|
|
52
|
+
}, folder.id);
|
|
53
|
+
return /*#__PURE__*/ jsxs(Breadcrumbs, {
|
|
54
|
+
label: formatMessage({
|
|
55
|
+
id: getTranslationKey('asset-picker.breadcrumbs.label'),
|
|
56
|
+
defaultMessage: 'Folder navigation'
|
|
57
|
+
}),
|
|
58
|
+
children: [
|
|
59
|
+
/*#__PURE__*/ jsx(CrumbButton, {
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: ()=>onSelectFolder(null),
|
|
62
|
+
children: formatMessage({
|
|
63
|
+
id: getTranslationKey('plugin.home'),
|
|
64
|
+
defaultMessage: 'Home'
|
|
65
|
+
})
|
|
66
|
+
}),
|
|
67
|
+
leading.map(renderLink),
|
|
68
|
+
hidden.length > 0 && /*#__PURE__*/ jsx(CrumbSimpleMenu, {
|
|
69
|
+
"aria-label": formatMessage({
|
|
70
|
+
id: getTranslationKey('asset-picker.breadcrumbs.more'),
|
|
71
|
+
defaultMessage: 'Show more folders'
|
|
72
|
+
}),
|
|
73
|
+
label: "…",
|
|
74
|
+
children: hidden.map((folder)=>/*#__PURE__*/ jsx(MenuItem, {
|
|
75
|
+
onSelect: ()=>onSelectFolder(folder.id ?? null),
|
|
76
|
+
children: folder.name
|
|
77
|
+
}, folder.id))
|
|
78
|
+
}),
|
|
79
|
+
trailing.map(renderLink),
|
|
80
|
+
/*#__PURE__*/ jsx(Crumb, {
|
|
81
|
+
isCurrent: true,
|
|
82
|
+
children: current.name
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export { FolderBreadcrumbs };
|
|
89
|
+
//# sourceMappingURL=FolderBreadcrumbs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderBreadcrumbs.mjs","sources":["../../../../admin/src/components/AssetPickerDialog/FolderBreadcrumbs.tsx"],"sourcesContent":["import { Breadcrumbs, Crumb, CrumbSimpleMenu, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../services/folders';\nimport { findFolderPath } from '../../utils/findFolderPath';\nimport { getTranslationKey } from '../../utils/translations';\n\n// Past this many folders, the ones between the first and the parent collapse\n// into a menu, so a deep tree doesn't wrap the trail over several lines.\nconst MAX_VISIBLE_FOLDERS = 3;\n\n// `CrumbLink`'s look on a real button. `CrumbLink` only renders an anchor, and\n// one without an `href` is neither announced as a button nor reachable by Tab.\nconst CrumbButton = styled.button`\n border: none;\n background: none;\n cursor: pointer;\n border-radius: ${({ theme }) => theme.borderRadius};\n color: ${({ theme }) => theme.colors.neutral600};\n font-size: ${({ theme }) => theme.fontSizes[1]};\n line-height: ${({ theme }) => theme.lineHeights[4]};\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n\n &:hover,\n &:focus-visible {\n background-color: ${({ theme }) => theme.colors.neutral200};\n color: ${({ theme }) => theme.colors.neutral700};\n }\n`;\n\ninterface FolderBreadcrumbsProps {\n currentFolderId: number;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Home › … › parent › current. Every crumb but the current folder navigates,\n * so a user deep in the tree can climb back without a sidebar.\n */\nexport const FolderBreadcrumbs = ({ currentFolderId, onSelectFolder }: FolderBreadcrumbsProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [] } = useGetFolderStructureQuery();\n\n const path = findFolderPath(folderStructure, currentFolderId);\n const current = path?.at(-1);\n\n // The tree has not loaded yet, or no longer holds the folder (deleted\n // elsewhere — `useAssetsList` sends the list back to the root on its own).\n if (!path || !current) {\n return null;\n }\n\n const ancestors = path.slice(0, -1);\n const isCollapsed = path.length > MAX_VISIBLE_FOLDERS;\n const leading = isCollapsed ? ancestors.slice(0, 1) : ancestors;\n const hidden = isCollapsed ? ancestors.slice(1, -1) : [];\n const trailing = isCollapsed ? ancestors.slice(-1) : [];\n\n const renderLink = (folder: (typeof path)[number]) => (\n <CrumbButton key={folder.id} type=\"button\" onClick={() => onSelectFolder(folder.id ?? null)}>\n {folder.name}\n </CrumbButton>\n );\n\n return (\n <Breadcrumbs\n label={formatMessage({\n id: getTranslationKey('asset-picker.breadcrumbs.label'),\n defaultMessage: 'Folder navigation',\n })}\n >\n <CrumbButton type=\"button\" onClick={() => onSelectFolder(null)}>\n {formatMessage({ id: getTranslationKey('plugin.home'), defaultMessage: 'Home' })}\n </CrumbButton>\n {leading.map(renderLink)}\n {hidden.length > 0 && (\n <CrumbSimpleMenu\n aria-label={formatMessage({\n id: getTranslationKey('asset-picker.breadcrumbs.more'),\n defaultMessage: 'Show more folders',\n })}\n label=\"…\"\n >\n {hidden.map((folder) => (\n <MenuItem key={folder.id} onSelect={() => onSelectFolder(folder.id ?? null)}>\n {folder.name}\n </MenuItem>\n ))}\n </CrumbSimpleMenu>\n )}\n {trailing.map(renderLink)}\n <Crumb isCurrent>{current.name}</Crumb>\n </Breadcrumbs>\n );\n};\n"],"names":["MAX_VISIBLE_FOLDERS","CrumbButton","styled","button","theme","borderRadius","colors","neutral600","fontSizes","lineHeights","spaces","neutral200","neutral700","FolderBreadcrumbs","currentFolderId","onSelectFolder","formatMessage","useIntl","data","folderStructure","useGetFolderStructureQuery","path","findFolderPath","current","at","ancestors","slice","isCollapsed","length","leading","hidden","trailing","renderLink","folder","_jsx","type","onClick","id","name","_jsxs","Breadcrumbs","label","getTranslationKey","defaultMessage","map","CrumbSimpleMenu","aria-label","MenuItem","onSelect","Crumb","isCurrent"],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var useAssetSelection = require('../../pages/Assets/hooks/useAssetSelection.js');
|
|
6
|
+
var selection = require('../../pages/Assets/utils/selection.js');
|
|
7
|
+
var isAllowedAssetType = require('../../utils/isAllowedAssetType.js');
|
|
8
|
+
var pickerSelection = require('./pickerSelection.js');
|
|
9
|
+
|
|
10
|
+
const PickerSelectionContext = /*#__PURE__*/ React.createContext(null);
|
|
11
|
+
const usePickerSelection = ()=>{
|
|
12
|
+
const context = React.useContext(PickerSelectionContext);
|
|
13
|
+
if (!context) {
|
|
14
|
+
throw new Error('usePickerSelection must be used within a PickerSelectionProvider');
|
|
15
|
+
}
|
|
16
|
+
return context;
|
|
17
|
+
};
|
|
18
|
+
const parseAssetId = (key)=>{
|
|
19
|
+
const [kind, id] = key.split(':');
|
|
20
|
+
return kind === 'asset' ? Number(id) : null;
|
|
21
|
+
};
|
|
22
|
+
const NO_FOLDERS = new Set();
|
|
23
|
+
/**
|
|
24
|
+
* The Content Manager picker's selection, behind the same `AssetSelection`
|
|
25
|
+
* interface the Media Library views read: only assets are selectable, assets
|
|
26
|
+
* outside `allowedTypes` are shown but cannot be picked, and the selection
|
|
27
|
+
* survives folder changes, search, filters and sort.
|
|
28
|
+
*/ const PickerSelectionProvider = ({ children, initialSelection, multiple, allowedTypes, knownFiles })=>{
|
|
29
|
+
const [selection$1, setSelection] = React.useState(initialSelection);
|
|
30
|
+
const filesById = React.useMemo(()=>{
|
|
31
|
+
const map = new Map();
|
|
32
|
+
[
|
|
33
|
+
...knownFiles,
|
|
34
|
+
...selection$1
|
|
35
|
+
].forEach((file)=>map.set(file.id, file));
|
|
36
|
+
return map;
|
|
37
|
+
}, [
|
|
38
|
+
knownFiles,
|
|
39
|
+
selection$1
|
|
40
|
+
]);
|
|
41
|
+
const selectedIds = React.useMemo(()=>new Set(selection$1.map((file)=>file.id)), [
|
|
42
|
+
selection$1
|
|
43
|
+
]);
|
|
44
|
+
const resolveSelectableFile = React.useCallback((key)=>{
|
|
45
|
+
const id = parseAssetId(key);
|
|
46
|
+
const file = id === null ? undefined : filesById.get(id);
|
|
47
|
+
return file && isAllowedAssetType.isAllowedAssetType(allowedTypes, file.mime) ? file : null;
|
|
48
|
+
}, [
|
|
49
|
+
allowedTypes,
|
|
50
|
+
filesById
|
|
51
|
+
]);
|
|
52
|
+
const getSelectability = React.useCallback((key)=>{
|
|
53
|
+
const id = parseAssetId(key);
|
|
54
|
+
if (id === null) {
|
|
55
|
+
return 'hidden';
|
|
56
|
+
}
|
|
57
|
+
// `allowedTypes` only stops adding an asset. One the field already holds,
|
|
58
|
+
// for example from before the schema was narrowed, must stay removable.
|
|
59
|
+
if (selectedIds.has(id)) {
|
|
60
|
+
return 'enabled';
|
|
61
|
+
}
|
|
62
|
+
const file = filesById.get(id);
|
|
63
|
+
return file && !isAllowedAssetType.isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';
|
|
64
|
+
}, [
|
|
65
|
+
allowedTypes,
|
|
66
|
+
filesById,
|
|
67
|
+
selectedIds
|
|
68
|
+
]);
|
|
69
|
+
const toggle = React.useCallback((key)=>{
|
|
70
|
+
const id = parseAssetId(key);
|
|
71
|
+
if (id !== null && selectedIds.has(id)) {
|
|
72
|
+
setSelection((prev)=>pickerSelection.removeFile(prev, id));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const file = resolveSelectableFile(key);
|
|
76
|
+
if (file) {
|
|
77
|
+
setSelection((prev)=>pickerSelection.toggleFile(prev, file, {
|
|
78
|
+
multiple
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
}, [
|
|
82
|
+
multiple,
|
|
83
|
+
resolveSelectableFile,
|
|
84
|
+
selectedIds
|
|
85
|
+
]);
|
|
86
|
+
// Select-all over the assets on screen that can be picked, appended in their
|
|
87
|
+
// on-screen order. Only a multiple-value field offers it.
|
|
88
|
+
const selectAll = React.useCallback((orderedKeys)=>{
|
|
89
|
+
if (!multiple) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const files = orderedKeys.map((key)=>resolveSelectableFile(key)).filter((file)=>file !== null);
|
|
93
|
+
setSelection((prev)=>pickerSelection.addFiles(prev, files));
|
|
94
|
+
}, [
|
|
95
|
+
multiple,
|
|
96
|
+
resolveSelectableFile
|
|
97
|
+
]);
|
|
98
|
+
const selectOnly = React.useCallback((key)=>{
|
|
99
|
+
const file = resolveSelectableFile(key);
|
|
100
|
+
if (file) {
|
|
101
|
+
setSelection([
|
|
102
|
+
file
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
}, [
|
|
106
|
+
resolveSelectableFile
|
|
107
|
+
]);
|
|
108
|
+
const deselect = React.useCallback((key)=>{
|
|
109
|
+
const id = parseAssetId(key);
|
|
110
|
+
if (id !== null) {
|
|
111
|
+
setSelection((prev)=>pickerSelection.removeFile(prev, id));
|
|
112
|
+
}
|
|
113
|
+
}, []);
|
|
114
|
+
const deselectAll = React.useCallback((orderedKeys)=>{
|
|
115
|
+
const ids = new Set(orderedKeys.map((key)=>parseAssetId(key)).filter((id)=>id !== null));
|
|
116
|
+
setSelection((prev)=>pickerSelection.removeFiles(prev, ids));
|
|
117
|
+
}, []);
|
|
118
|
+
const clear = React.useCallback(()=>setSelection([]), []);
|
|
119
|
+
const selectedKeys = React.useMemo(()=>new Set(selection$1.map((file)=>selection.assetKey(file.id))), [
|
|
120
|
+
selection$1
|
|
121
|
+
]);
|
|
122
|
+
const isSelected = React.useCallback((key)=>{
|
|
123
|
+
const id = parseAssetId(key);
|
|
124
|
+
return id !== null && pickerSelection.hasFile(selection$1, id);
|
|
125
|
+
}, [
|
|
126
|
+
selection$1
|
|
127
|
+
]);
|
|
128
|
+
const assetSelection = React.useMemo(()=>({
|
|
129
|
+
isEnabled: true,
|
|
130
|
+
// A single-value field holds one asset: nothing to select all of.
|
|
131
|
+
canSelectAll: multiple,
|
|
132
|
+
getSelectability,
|
|
133
|
+
selectedKeys,
|
|
134
|
+
selectedIds,
|
|
135
|
+
selectedFolderIds: NO_FOLDERS,
|
|
136
|
+
anchorKey: null,
|
|
137
|
+
isSelected,
|
|
138
|
+
toggle,
|
|
139
|
+
// Picking is one asset at a time; a Shift+click range picks the target.
|
|
140
|
+
selectRange: (_orderedKeys, targetKey)=>toggle(targetKey),
|
|
141
|
+
selectAll,
|
|
142
|
+
selectOnly,
|
|
143
|
+
deselect,
|
|
144
|
+
deselectAll,
|
|
145
|
+
clear
|
|
146
|
+
}), [
|
|
147
|
+
multiple,
|
|
148
|
+
getSelectability,
|
|
149
|
+
selectedKeys,
|
|
150
|
+
selectedIds,
|
|
151
|
+
isSelected,
|
|
152
|
+
toggle,
|
|
153
|
+
selectAll,
|
|
154
|
+
selectOnly,
|
|
155
|
+
deselect,
|
|
156
|
+
deselectAll,
|
|
157
|
+
clear
|
|
158
|
+
]);
|
|
159
|
+
const moveSelectedFile = React.useCallback((activeId, overId)=>setSelection((prev)=>pickerSelection.moveFile(prev, activeId, overId)), []);
|
|
160
|
+
const pickerSelection$1 = React.useMemo(()=>({
|
|
161
|
+
selection: selection$1,
|
|
162
|
+
moveFile: moveSelectedFile
|
|
163
|
+
}), [
|
|
164
|
+
selection$1,
|
|
165
|
+
moveSelectedFile
|
|
166
|
+
]);
|
|
167
|
+
return /*#__PURE__*/ jsxRuntime.jsx(PickerSelectionContext.Provider, {
|
|
168
|
+
value: pickerSelection$1,
|
|
169
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(useAssetSelection.AssetSelectionContext.Provider, {
|
|
170
|
+
value: assetSelection,
|
|
171
|
+
children: children
|
|
172
|
+
})
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
exports.PickerSelectionProvider = PickerSelectionProvider;
|
|
177
|
+
exports.usePickerSelection = usePickerSelection;
|
|
178
|
+
//# sourceMappingURL=PickerSelectionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickerSelectionProvider.js","sources":["../../../../admin/src/components/AssetPickerDialog/PickerSelectionProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n AssetSelectionContext,\n type AssetSelection,\n type Selectability,\n} from '../../pages/Assets/hooks/useAssetSelection';\nimport { assetKey, type ItemKey } from '../../pages/Assets/utils/selection';\nimport { isAllowedAssetType, type MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\nimport {\n addFiles,\n hasFile,\n moveFile,\n removeFile,\n removeFiles,\n toggleFile,\n type PickerSelection,\n} from './pickerSelection';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface PickerSelectionContextValue {\n selection: PickerSelection;\n moveFile: (activeId: number, overId: number) => void;\n}\n\nconst PickerSelectionContext = createContext<PickerSelectionContextValue | null>(null);\n\nexport const usePickerSelection = () => {\n const context = useContext(PickerSelectionContext);\n\n if (!context) {\n throw new Error('usePickerSelection must be used within a PickerSelectionProvider');\n }\n\n return context;\n};\n\nconst parseAssetId = (key: ItemKey): number | null => {\n const [kind, id] = key.split(':');\n\n return kind === 'asset' ? Number(id) : null;\n};\n\nconst NO_FOLDERS = new Set<number>();\n\ninterface PickerSelectionProviderProps {\n children: ReactNode;\n initialSelection: File[];\n multiple: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n /**\n * The assets on screen. Views select by key, but the selection keeps whole\n * files, so a newly picked key is resolved against these.\n */\n knownFiles: File[];\n}\n\n/**\n * The Content Manager picker's selection, behind the same `AssetSelection`\n * interface the Media Library views read: only assets are selectable, assets\n * outside `allowedTypes` are shown but cannot be picked, and the selection\n * survives folder changes, search, filters and sort.\n */\nexport const PickerSelectionProvider = ({\n children,\n initialSelection,\n multiple,\n allowedTypes,\n knownFiles,\n}: PickerSelectionProviderProps) => {\n const [selection, setSelection] = useState<PickerSelection>(initialSelection);\n\n const filesById = useMemo(() => {\n const map = new Map<number, File>();\n [...knownFiles, ...selection].forEach((file) => map.set(file.id, file));\n return map;\n }, [knownFiles, selection]);\n\n const selectedIds = useMemo(() => new Set(selection.map((file) => file.id)), [selection]);\n\n const resolveSelectableFile = useCallback(\n (key: ItemKey): File | null => {\n const id = parseAssetId(key);\n const file = id === null ? undefined : filesById.get(id);\n\n return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;\n },\n [allowedTypes, filesById]\n );\n\n const getSelectability = useCallback(\n (key: ItemKey): Selectability => {\n const id = parseAssetId(key);\n\n if (id === null) {\n return 'hidden';\n }\n\n // `allowedTypes` only stops adding an asset. One the field already holds,\n // for example from before the schema was narrowed, must stay removable.\n if (selectedIds.has(id)) {\n return 'enabled';\n }\n\n const file = filesById.get(id);\n\n return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';\n },\n [allowedTypes, filesById, selectedIds]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null && selectedIds.has(id)) {\n setSelection((prev) => removeFile(prev, id));\n return;\n }\n\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection((prev) => toggleFile(prev, file, { multiple }));\n }\n },\n [multiple, resolveSelectableFile, selectedIds]\n );\n\n // Select-all over the assets on screen that can be picked, appended in their\n // on-screen order. Only a multiple-value field offers it.\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (!multiple) {\n return;\n }\n\n const files = orderedKeys\n .map((key) => resolveSelectableFile(key))\n .filter((file): file is File => file !== null);\n\n setSelection((prev) => addFiles(prev, files));\n },\n [multiple, resolveSelectableFile]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection([file]);\n }\n },\n [resolveSelectableFile]\n );\n\n const deselect = useCallback((key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null) {\n setSelection((prev) => removeFile(prev, id));\n }\n }, []);\n\n const deselectAll = useCallback((orderedKeys: ItemKey[]) => {\n const ids = new Set(\n orderedKeys.map((key) => parseAssetId(key)).filter((id): id is number => id !== null)\n );\n\n setSelection((prev) => removeFiles(prev, ids));\n }, []);\n\n const clear = useCallback(() => setSelection([]), []);\n\n const selectedKeys = useMemo(\n () => new Set(selection.map((file) => assetKey(file.id))),\n [selection]\n );\n\n const isSelected = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n return id !== null && hasFile(selection, id);\n },\n [selection]\n );\n\n const assetSelection = useMemo<AssetSelection>(\n () => ({\n isEnabled: true,\n // A single-value field holds one asset: nothing to select all of.\n canSelectAll: multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n selectedFolderIds: NO_FOLDERS,\n anchorKey: null,\n isSelected,\n toggle,\n // Picking is one asset at a time; a Shift+click range picks the target.\n selectRange: (_orderedKeys, targetKey) => toggle(targetKey),\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n }),\n [\n multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n isSelected,\n toggle,\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n ]\n );\n\n const moveSelectedFile = useCallback(\n (activeId: number, overId: number) => setSelection((prev) => moveFile(prev, activeId, overId)),\n []\n );\n\n const pickerSelection = useMemo(\n () => ({ selection, moveFile: moveSelectedFile }),\n [selection, moveSelectedFile]\n );\n\n return (\n <PickerSelectionContext.Provider value={pickerSelection}>\n <AssetSelectionContext.Provider value={assetSelection}>\n {children}\n </AssetSelectionContext.Provider>\n </PickerSelectionContext.Provider>\n );\n};\n"],"names":["PickerSelectionContext","createContext","usePickerSelection","context","useContext","Error","parseAssetId","key","kind","id","split","Number","NO_FOLDERS","Set","PickerSelectionProvider","children","initialSelection","multiple","allowedTypes","knownFiles","selection","setSelection","useState","filesById","useMemo","map","Map","forEach","file","set","selectedIds","resolveSelectableFile","useCallback","undefined","get","isAllowedAssetType","mime","getSelectability","has","toggle","prev","removeFile","toggleFile","selectAll","orderedKeys","files","filter","addFiles","selectOnly","deselect","deselectAll","ids","removeFiles","clear","selectedKeys","assetKey","isSelected","hasFile","assetSelection","isEnabled","canSelectAll","selectedFolderIds","anchorKey","selectRange","_orderedKeys","targetKey","moveSelectedFile","activeId","overId","moveFile","pickerSelection","_jsx","Provider","value","AssetSelectionContext"],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useMemo, useCallback, useContext, createContext } from 'react';
|
|
3
|
+
import { AssetSelectionContext } from '../../pages/Assets/hooks/useAssetSelection.mjs';
|
|
4
|
+
import { assetKey } from '../../pages/Assets/utils/selection.mjs';
|
|
5
|
+
import { isAllowedAssetType } from '../../utils/isAllowedAssetType.mjs';
|
|
6
|
+
import { removeFile, toggleFile, addFiles, removeFiles, hasFile, moveFile } from './pickerSelection.mjs';
|
|
7
|
+
|
|
8
|
+
const PickerSelectionContext = /*#__PURE__*/ createContext(null);
|
|
9
|
+
const usePickerSelection = ()=>{
|
|
10
|
+
const context = useContext(PickerSelectionContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('usePickerSelection must be used within a PickerSelectionProvider');
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
};
|
|
16
|
+
const parseAssetId = (key)=>{
|
|
17
|
+
const [kind, id] = key.split(':');
|
|
18
|
+
return kind === 'asset' ? Number(id) : null;
|
|
19
|
+
};
|
|
20
|
+
const NO_FOLDERS = new Set();
|
|
21
|
+
/**
|
|
22
|
+
* The Content Manager picker's selection, behind the same `AssetSelection`
|
|
23
|
+
* interface the Media Library views read: only assets are selectable, assets
|
|
24
|
+
* outside `allowedTypes` are shown but cannot be picked, and the selection
|
|
25
|
+
* survives folder changes, search, filters and sort.
|
|
26
|
+
*/ const PickerSelectionProvider = ({ children, initialSelection, multiple, allowedTypes, knownFiles })=>{
|
|
27
|
+
const [selection, setSelection] = useState(initialSelection);
|
|
28
|
+
const filesById = useMemo(()=>{
|
|
29
|
+
const map = new Map();
|
|
30
|
+
[
|
|
31
|
+
...knownFiles,
|
|
32
|
+
...selection
|
|
33
|
+
].forEach((file)=>map.set(file.id, file));
|
|
34
|
+
return map;
|
|
35
|
+
}, [
|
|
36
|
+
knownFiles,
|
|
37
|
+
selection
|
|
38
|
+
]);
|
|
39
|
+
const selectedIds = useMemo(()=>new Set(selection.map((file)=>file.id)), [
|
|
40
|
+
selection
|
|
41
|
+
]);
|
|
42
|
+
const resolveSelectableFile = useCallback((key)=>{
|
|
43
|
+
const id = parseAssetId(key);
|
|
44
|
+
const file = id === null ? undefined : filesById.get(id);
|
|
45
|
+
return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;
|
|
46
|
+
}, [
|
|
47
|
+
allowedTypes,
|
|
48
|
+
filesById
|
|
49
|
+
]);
|
|
50
|
+
const getSelectability = useCallback((key)=>{
|
|
51
|
+
const id = parseAssetId(key);
|
|
52
|
+
if (id === null) {
|
|
53
|
+
return 'hidden';
|
|
54
|
+
}
|
|
55
|
+
// `allowedTypes` only stops adding an asset. One the field already holds,
|
|
56
|
+
// for example from before the schema was narrowed, must stay removable.
|
|
57
|
+
if (selectedIds.has(id)) {
|
|
58
|
+
return 'enabled';
|
|
59
|
+
}
|
|
60
|
+
const file = filesById.get(id);
|
|
61
|
+
return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';
|
|
62
|
+
}, [
|
|
63
|
+
allowedTypes,
|
|
64
|
+
filesById,
|
|
65
|
+
selectedIds
|
|
66
|
+
]);
|
|
67
|
+
const toggle = useCallback((key)=>{
|
|
68
|
+
const id = parseAssetId(key);
|
|
69
|
+
if (id !== null && selectedIds.has(id)) {
|
|
70
|
+
setSelection((prev)=>removeFile(prev, id));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const file = resolveSelectableFile(key);
|
|
74
|
+
if (file) {
|
|
75
|
+
setSelection((prev)=>toggleFile(prev, file, {
|
|
76
|
+
multiple
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
}, [
|
|
80
|
+
multiple,
|
|
81
|
+
resolveSelectableFile,
|
|
82
|
+
selectedIds
|
|
83
|
+
]);
|
|
84
|
+
// Select-all over the assets on screen that can be picked, appended in their
|
|
85
|
+
// on-screen order. Only a multiple-value field offers it.
|
|
86
|
+
const selectAll = useCallback((orderedKeys)=>{
|
|
87
|
+
if (!multiple) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const files = orderedKeys.map((key)=>resolveSelectableFile(key)).filter((file)=>file !== null);
|
|
91
|
+
setSelection((prev)=>addFiles(prev, files));
|
|
92
|
+
}, [
|
|
93
|
+
multiple,
|
|
94
|
+
resolveSelectableFile
|
|
95
|
+
]);
|
|
96
|
+
const selectOnly = useCallback((key)=>{
|
|
97
|
+
const file = resolveSelectableFile(key);
|
|
98
|
+
if (file) {
|
|
99
|
+
setSelection([
|
|
100
|
+
file
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
}, [
|
|
104
|
+
resolveSelectableFile
|
|
105
|
+
]);
|
|
106
|
+
const deselect = useCallback((key)=>{
|
|
107
|
+
const id = parseAssetId(key);
|
|
108
|
+
if (id !== null) {
|
|
109
|
+
setSelection((prev)=>removeFile(prev, id));
|
|
110
|
+
}
|
|
111
|
+
}, []);
|
|
112
|
+
const deselectAll = useCallback((orderedKeys)=>{
|
|
113
|
+
const ids = new Set(orderedKeys.map((key)=>parseAssetId(key)).filter((id)=>id !== null));
|
|
114
|
+
setSelection((prev)=>removeFiles(prev, ids));
|
|
115
|
+
}, []);
|
|
116
|
+
const clear = useCallback(()=>setSelection([]), []);
|
|
117
|
+
const selectedKeys = useMemo(()=>new Set(selection.map((file)=>assetKey(file.id))), [
|
|
118
|
+
selection
|
|
119
|
+
]);
|
|
120
|
+
const isSelected = useCallback((key)=>{
|
|
121
|
+
const id = parseAssetId(key);
|
|
122
|
+
return id !== null && hasFile(selection, id);
|
|
123
|
+
}, [
|
|
124
|
+
selection
|
|
125
|
+
]);
|
|
126
|
+
const assetSelection = useMemo(()=>({
|
|
127
|
+
isEnabled: true,
|
|
128
|
+
// A single-value field holds one asset: nothing to select all of.
|
|
129
|
+
canSelectAll: multiple,
|
|
130
|
+
getSelectability,
|
|
131
|
+
selectedKeys,
|
|
132
|
+
selectedIds,
|
|
133
|
+
selectedFolderIds: NO_FOLDERS,
|
|
134
|
+
anchorKey: null,
|
|
135
|
+
isSelected,
|
|
136
|
+
toggle,
|
|
137
|
+
// Picking is one asset at a time; a Shift+click range picks the target.
|
|
138
|
+
selectRange: (_orderedKeys, targetKey)=>toggle(targetKey),
|
|
139
|
+
selectAll,
|
|
140
|
+
selectOnly,
|
|
141
|
+
deselect,
|
|
142
|
+
deselectAll,
|
|
143
|
+
clear
|
|
144
|
+
}), [
|
|
145
|
+
multiple,
|
|
146
|
+
getSelectability,
|
|
147
|
+
selectedKeys,
|
|
148
|
+
selectedIds,
|
|
149
|
+
isSelected,
|
|
150
|
+
toggle,
|
|
151
|
+
selectAll,
|
|
152
|
+
selectOnly,
|
|
153
|
+
deselect,
|
|
154
|
+
deselectAll,
|
|
155
|
+
clear
|
|
156
|
+
]);
|
|
157
|
+
const moveSelectedFile = useCallback((activeId, overId)=>setSelection((prev)=>moveFile(prev, activeId, overId)), []);
|
|
158
|
+
const pickerSelection = useMemo(()=>({
|
|
159
|
+
selection,
|
|
160
|
+
moveFile: moveSelectedFile
|
|
161
|
+
}), [
|
|
162
|
+
selection,
|
|
163
|
+
moveSelectedFile
|
|
164
|
+
]);
|
|
165
|
+
return /*#__PURE__*/ jsx(PickerSelectionContext.Provider, {
|
|
166
|
+
value: pickerSelection,
|
|
167
|
+
children: /*#__PURE__*/ jsx(AssetSelectionContext.Provider, {
|
|
168
|
+
value: assetSelection,
|
|
169
|
+
children: children
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export { PickerSelectionProvider, usePickerSelection };
|
|
175
|
+
//# sourceMappingURL=PickerSelectionProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickerSelectionProvider.mjs","sources":["../../../../admin/src/components/AssetPickerDialog/PickerSelectionProvider.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\n\nimport {\n AssetSelectionContext,\n type AssetSelection,\n type Selectability,\n} from '../../pages/Assets/hooks/useAssetSelection';\nimport { assetKey, type ItemKey } from '../../pages/Assets/utils/selection';\nimport { isAllowedAssetType, type MediaAllowedTypes } from '../../utils/isAllowedAssetType';\n\nimport {\n addFiles,\n hasFile,\n moveFile,\n removeFile,\n removeFiles,\n toggleFile,\n type PickerSelection,\n} from './pickerSelection';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ninterface PickerSelectionContextValue {\n selection: PickerSelection;\n moveFile: (activeId: number, overId: number) => void;\n}\n\nconst PickerSelectionContext = createContext<PickerSelectionContextValue | null>(null);\n\nexport const usePickerSelection = () => {\n const context = useContext(PickerSelectionContext);\n\n if (!context) {\n throw new Error('usePickerSelection must be used within a PickerSelectionProvider');\n }\n\n return context;\n};\n\nconst parseAssetId = (key: ItemKey): number | null => {\n const [kind, id] = key.split(':');\n\n return kind === 'asset' ? Number(id) : null;\n};\n\nconst NO_FOLDERS = new Set<number>();\n\ninterface PickerSelectionProviderProps {\n children: ReactNode;\n initialSelection: File[];\n multiple: boolean;\n allowedTypes?: MediaAllowedTypes | null;\n /**\n * The assets on screen. Views select by key, but the selection keeps whole\n * files, so a newly picked key is resolved against these.\n */\n knownFiles: File[];\n}\n\n/**\n * The Content Manager picker's selection, behind the same `AssetSelection`\n * interface the Media Library views read: only assets are selectable, assets\n * outside `allowedTypes` are shown but cannot be picked, and the selection\n * survives folder changes, search, filters and sort.\n */\nexport const PickerSelectionProvider = ({\n children,\n initialSelection,\n multiple,\n allowedTypes,\n knownFiles,\n}: PickerSelectionProviderProps) => {\n const [selection, setSelection] = useState<PickerSelection>(initialSelection);\n\n const filesById = useMemo(() => {\n const map = new Map<number, File>();\n [...knownFiles, ...selection].forEach((file) => map.set(file.id, file));\n return map;\n }, [knownFiles, selection]);\n\n const selectedIds = useMemo(() => new Set(selection.map((file) => file.id)), [selection]);\n\n const resolveSelectableFile = useCallback(\n (key: ItemKey): File | null => {\n const id = parseAssetId(key);\n const file = id === null ? undefined : filesById.get(id);\n\n return file && isAllowedAssetType(allowedTypes, file.mime) ? file : null;\n },\n [allowedTypes, filesById]\n );\n\n const getSelectability = useCallback(\n (key: ItemKey): Selectability => {\n const id = parseAssetId(key);\n\n if (id === null) {\n return 'hidden';\n }\n\n // `allowedTypes` only stops adding an asset. One the field already holds,\n // for example from before the schema was narrowed, must stay removable.\n if (selectedIds.has(id)) {\n return 'enabled';\n }\n\n const file = filesById.get(id);\n\n return file && !isAllowedAssetType(allowedTypes, file.mime) ? 'disabled' : 'enabled';\n },\n [allowedTypes, filesById, selectedIds]\n );\n\n const toggle = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null && selectedIds.has(id)) {\n setSelection((prev) => removeFile(prev, id));\n return;\n }\n\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection((prev) => toggleFile(prev, file, { multiple }));\n }\n },\n [multiple, resolveSelectableFile, selectedIds]\n );\n\n // Select-all over the assets on screen that can be picked, appended in their\n // on-screen order. Only a multiple-value field offers it.\n const selectAll = useCallback(\n (orderedKeys: ItemKey[]) => {\n if (!multiple) {\n return;\n }\n\n const files = orderedKeys\n .map((key) => resolveSelectableFile(key))\n .filter((file): file is File => file !== null);\n\n setSelection((prev) => addFiles(prev, files));\n },\n [multiple, resolveSelectableFile]\n );\n\n const selectOnly = useCallback(\n (key: ItemKey) => {\n const file = resolveSelectableFile(key);\n\n if (file) {\n setSelection([file]);\n }\n },\n [resolveSelectableFile]\n );\n\n const deselect = useCallback((key: ItemKey) => {\n const id = parseAssetId(key);\n\n if (id !== null) {\n setSelection((prev) => removeFile(prev, id));\n }\n }, []);\n\n const deselectAll = useCallback((orderedKeys: ItemKey[]) => {\n const ids = new Set(\n orderedKeys.map((key) => parseAssetId(key)).filter((id): id is number => id !== null)\n );\n\n setSelection((prev) => removeFiles(prev, ids));\n }, []);\n\n const clear = useCallback(() => setSelection([]), []);\n\n const selectedKeys = useMemo(\n () => new Set(selection.map((file) => assetKey(file.id))),\n [selection]\n );\n\n const isSelected = useCallback(\n (key: ItemKey) => {\n const id = parseAssetId(key);\n\n return id !== null && hasFile(selection, id);\n },\n [selection]\n );\n\n const assetSelection = useMemo<AssetSelection>(\n () => ({\n isEnabled: true,\n // A single-value field holds one asset: nothing to select all of.\n canSelectAll: multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n selectedFolderIds: NO_FOLDERS,\n anchorKey: null,\n isSelected,\n toggle,\n // Picking is one asset at a time; a Shift+click range picks the target.\n selectRange: (_orderedKeys, targetKey) => toggle(targetKey),\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n }),\n [\n multiple,\n getSelectability,\n selectedKeys,\n selectedIds,\n isSelected,\n toggle,\n selectAll,\n selectOnly,\n deselect,\n deselectAll,\n clear,\n ]\n );\n\n const moveSelectedFile = useCallback(\n (activeId: number, overId: number) => setSelection((prev) => moveFile(prev, activeId, overId)),\n []\n );\n\n const pickerSelection = useMemo(\n () => ({ selection, moveFile: moveSelectedFile }),\n [selection, moveSelectedFile]\n );\n\n return (\n <PickerSelectionContext.Provider value={pickerSelection}>\n <AssetSelectionContext.Provider value={assetSelection}>\n {children}\n </AssetSelectionContext.Provider>\n </PickerSelectionContext.Provider>\n );\n};\n"],"names":["PickerSelectionContext","createContext","usePickerSelection","context","useContext","Error","parseAssetId","key","kind","id","split","Number","NO_FOLDERS","Set","PickerSelectionProvider","children","initialSelection","multiple","allowedTypes","knownFiles","selection","setSelection","useState","filesById","useMemo","map","Map","forEach","file","set","selectedIds","resolveSelectableFile","useCallback","undefined","get","isAllowedAssetType","mime","getSelectability","has","toggle","prev","removeFile","toggleFile","selectAll","orderedKeys","files","filter","addFiles","selectOnly","deselect","deselectAll","ids","removeFiles","clear","selectedKeys","assetKey","isSelected","hasFile","assetSelection","isEnabled","canSelectAll","selectedFolderIds","anchorKey","selectRange","_orderedKeys","targetKey","moveSelectedFile","activeId","overId","moveFile","pickerSelection","_jsx","Provider","value","AssetSelectionContext"],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var core = require('@dnd-kit/core');
|
|
6
|
+
var sortable = require('@dnd-kit/sortable');
|
|
7
|
+
var utilities = require('@dnd-kit/utilities');
|
|
8
|
+
var reactIntl = require('react-intl');
|
|
9
|
+
var assetSortable = require('../../pages/Assets/components/Dnd/assetSortable.js');
|
|
10
|
+
var translations = require('../../utils/translations.js');
|
|
11
|
+
var PickerSelectionProvider = require('./PickerSelectionProvider.js');
|
|
12
|
+
|
|
13
|
+
/** Module scope, so every item of the list gets the same hook (see `AssetSortableContext`). */ const usePickerSortableAsset = (assetId)=>{
|
|
14
|
+
const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = sortable.useSortable({
|
|
15
|
+
id: assetId
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
setNodeRef,
|
|
19
|
+
isDragging,
|
|
20
|
+
style: {
|
|
21
|
+
transform: utilities.CSS.Transform.toString(transform),
|
|
22
|
+
transition
|
|
23
|
+
},
|
|
24
|
+
// The item drags with the pointer from anywhere; the keyboard starts from the grip.
|
|
25
|
+
listeners: listeners?.onPointerDown ? {
|
|
26
|
+
onPointerDown: listeners.onPointerDown
|
|
27
|
+
} : undefined,
|
|
28
|
+
handle: {
|
|
29
|
+
...attributes,
|
|
30
|
+
ref: setActivatorNodeRef,
|
|
31
|
+
onKeyDown: (event)=>listeners?.onKeyDown?.(event)
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A pointer release over the item it was dragging would also count as a click,
|
|
37
|
+
* which on a selected item un-picks it. Swallow that one click.
|
|
38
|
+
*/ const swallowNextClick = ()=>{
|
|
39
|
+
const swallow = (event)=>{
|
|
40
|
+
event.stopPropagation();
|
|
41
|
+
event.preventDefault();
|
|
42
|
+
};
|
|
43
|
+
window.addEventListener('click', swallow, {
|
|
44
|
+
capture: true,
|
|
45
|
+
once: true
|
|
46
|
+
});
|
|
47
|
+
// No click follows a keyboard drop: don't leave the listener behind.
|
|
48
|
+
setTimeout(()=>window.removeEventListener('click', swallow, {
|
|
49
|
+
capture: true
|
|
50
|
+
}), 0);
|
|
51
|
+
};
|
|
52
|
+
/** Makes the picker's selected assets reorderable (the Selected tab is always a grid). */ const SortableSelection = ({ children, onReorderingChange })=>{
|
|
53
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
54
|
+
const { selection, moveFile } = PickerSelectionProvider.usePickerSelection();
|
|
55
|
+
const sensors = core.useSensors(// A few pixels of travel before it counts as a drag, so clicks still pick.
|
|
56
|
+
core.useSensor(core.PointerSensor, {
|
|
57
|
+
activationConstraint: {
|
|
58
|
+
distance: 8
|
|
59
|
+
}
|
|
60
|
+
}), core.useSensor(core.KeyboardSensor, {
|
|
61
|
+
coordinateGetter: sortable.sortableKeyboardCoordinates
|
|
62
|
+
}));
|
|
63
|
+
const ids = React.useMemo(()=>selection.map(({ id })=>id), [
|
|
64
|
+
selection
|
|
65
|
+
]);
|
|
66
|
+
const announcements = React.useMemo(()=>{
|
|
67
|
+
const describe = (id)=>{
|
|
68
|
+
const index = ids.indexOf(Number(id));
|
|
69
|
+
return {
|
|
70
|
+
name: selection[index]?.name ?? '',
|
|
71
|
+
position: index + 1,
|
|
72
|
+
count: ids.length
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
onDragStart: ({ active })=>formatMessage({
|
|
77
|
+
id: translations.getTranslationKey('list.reorder.picked-up'),
|
|
78
|
+
defaultMessage: 'Picked up {name}. Position {position} of {count}.'
|
|
79
|
+
}, describe(active.id)),
|
|
80
|
+
onDragOver: ({ active, over })=>over ? formatMessage({
|
|
81
|
+
id: translations.getTranslationKey('list.reorder.moved'),
|
|
82
|
+
defaultMessage: '{name} moved to position {position} of {count}.'
|
|
83
|
+
}, {
|
|
84
|
+
...describe(active.id),
|
|
85
|
+
position: describe(over.id).position
|
|
86
|
+
}) : undefined,
|
|
87
|
+
onDragEnd: ({ active, over })=>formatMessage({
|
|
88
|
+
id: translations.getTranslationKey('list.reorder.dropped'),
|
|
89
|
+
defaultMessage: '{name} dropped at position {position} of {count}.'
|
|
90
|
+
}, {
|
|
91
|
+
...describe(active.id),
|
|
92
|
+
position: describe((over ?? active).id).position
|
|
93
|
+
}),
|
|
94
|
+
onDragCancel: ({ active })=>formatMessage({
|
|
95
|
+
id: translations.getTranslationKey('list.reorder.cancelled'),
|
|
96
|
+
defaultMessage: 'Reordering cancelled. {name} is back at position {position} of {count}.'
|
|
97
|
+
}, describe(active.id))
|
|
98
|
+
};
|
|
99
|
+
}, [
|
|
100
|
+
formatMessage,
|
|
101
|
+
ids,
|
|
102
|
+
selection
|
|
103
|
+
]);
|
|
104
|
+
const handleDragEnd = ({ active, over })=>{
|
|
105
|
+
if (active.data.current?.sortable && over) {
|
|
106
|
+
moveFile(Number(active.id), Number(over.id));
|
|
107
|
+
}
|
|
108
|
+
onReorderingChange?.(false);
|
|
109
|
+
swallowNextClick();
|
|
110
|
+
};
|
|
111
|
+
// Escape cancels a pointer drag while the button is still down, so the click
|
|
112
|
+
// that would un-pick the item comes with the release, possibly much later.
|
|
113
|
+
const handleDragCancel = ({ activatorEvent })=>{
|
|
114
|
+
onReorderingChange?.(false);
|
|
115
|
+
if (activatorEvent.type === 'pointerdown') {
|
|
116
|
+
window.addEventListener('pointerup', swallowNextClick, {
|
|
117
|
+
capture: true,
|
|
118
|
+
once: true
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
return /*#__PURE__*/ jsxRuntime.jsx(core.DndContext, {
|
|
123
|
+
sensors: sensors,
|
|
124
|
+
collisionDetection: core.closestCenter,
|
|
125
|
+
onDragStart: ()=>onReorderingChange?.(true),
|
|
126
|
+
onDragEnd: handleDragEnd,
|
|
127
|
+
onDragCancel: handleDragCancel,
|
|
128
|
+
accessibility: {
|
|
129
|
+
announcements
|
|
130
|
+
},
|
|
131
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(sortable.SortableContext, {
|
|
132
|
+
items: ids,
|
|
133
|
+
strategy: sortable.rectSortingStrategy,
|
|
134
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(assetSortable.AssetSortableContext.Provider, {
|
|
135
|
+
value: usePickerSortableAsset,
|
|
136
|
+
children: children
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
exports.SortableSelection = SortableSelection;
|
|
143
|
+
//# sourceMappingURL=SortableSelection.js.map
|