@strapi/upload 5.51.1 → 5.52.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/AssetCard/VideoPreview.js +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
- package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +1 -1
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +1 -1
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/future/App.js +3 -3
- package/dist/admin/future/App.js.map +1 -1
- package/dist/admin/future/App.mjs +4 -4
- package/dist/admin/future/App.mjs.map +1 -1
- package/dist/admin/future/components/BetaNotice.js +72 -0
- package/dist/admin/future/components/BetaNotice.js.map +1 -0
- package/dist/admin/future/components/BetaNotice.mjs +70 -0
- package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
- package/dist/admin/future/components/Drawer.js +18 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +18 -3
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +200 -27
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
- package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
- package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/AssetsPage.js +453 -170
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +454 -171
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
- package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +325 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +323 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +110 -46
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +110 -46
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +95 -67
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +95 -68
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +94 -26
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +96 -28
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +112 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +110 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -56
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -59
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +188 -138
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +191 -141
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
- package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
- package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
- package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +45 -18
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +46 -19
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
- package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
- package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FilterBadges.js +417 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +415 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +453 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +447 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +144 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +142 -0
- package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +50 -16
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +52 -18
- package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +125 -148
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +127 -150
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
- package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +222 -45
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +223 -46
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
- package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
- package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
- package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
- package/dist/admin/future/services/api.js +187 -28
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +187 -30
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +40 -17
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +40 -17
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +66 -19
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +66 -20
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/services/settings.js +10 -3
- package/dist/admin/future/services/settings.js.map +1 -1
- package/dist/admin/future/services/settings.mjs +10 -3
- package/dist/admin/future/services/settings.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +109 -2
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +105 -3
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
- package/dist/admin/future/utils/getRelationId.js +24 -0
- package/dist/admin/future/utils/getRelationId.js.map +1 -0
- package/dist/admin/future/utils/getRelationId.mjs +22 -0
- package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.js +14 -0
- package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
- package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
- package/dist/admin/future/utils/itemLocations.js +40 -0
- package/dist/admin/future/utils/itemLocations.js.map +1 -0
- package/dist/admin/future/utils/itemLocations.mjs +36 -0
- package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
- package/dist/admin/future/utils/itemSource.js +36 -0
- package/dist/admin/future/utils/itemSource.js.map +1 -0
- package/dist/admin/future/utils/itemSource.mjs +32 -0
- package/dist/admin/future/utils/itemSource.mjs.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.js +11 -0
- package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
- package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
- package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
- package/dist/admin/hooks/useSelectionState.js +2 -4
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.mjs +2 -4
- package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
- package/dist/admin/index.js +11 -17
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +12 -18
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/shared/constants.js +43 -0
- package/dist/admin/shared/constants.js.map +1 -0
- package/dist/admin/shared/constants.mjs +38 -0
- package/dist/admin/shared/constants.mjs.map +1 -0
- package/dist/admin/src/future/App.d.ts +1 -1
- package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
- package/dist/admin/src/future/components/Drawer.d.ts +5 -1
- package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
- package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
- package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +24 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +21 -1
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
- package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
- package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
- package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +26 -0
- package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +20 -0
- package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
- package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
- package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +27 -3
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
- package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
- package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +9 -1
- package/dist/admin/src/future/services/folders.d.ts +9 -1
- package/dist/admin/src/future/services/settings.d.ts +2 -2
- package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
- package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
- package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
- package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
- package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
- package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
- package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
- package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
- package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
- package/dist/admin/src/hooks/useSettings.d.ts +1 -0
- package/dist/admin/src/hooks/useTracking.d.ts +1 -1
- package/dist/admin/src/hooks/useUpload.d.ts +1 -1
- package/dist/admin/translations/en.json.js +73 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +73 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js +33 -9
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlYupSchema.mjs +33 -9
- package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
- package/dist/server/config.js +13 -5
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +13 -5
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/constants.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +30 -0
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +30 -0
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +20 -2
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +21 -3
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +1 -2
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +2 -2
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
- package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
- package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
- package/dist/server/controllers/validation/admin/settings.js +4 -1
- package/dist/server/controllers/validation/admin/settings.js.map +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs +1 -1
- package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
- package/dist/server/routes/admin.js +18 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +18 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-metadata.js +108 -11
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +108 -11
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/file.js +86 -13
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +87 -14
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +4 -4
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +4 -4
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/shared/constants.js +43 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/constants.mjs +38 -0
- package/dist/server/shared/constants.mjs.map +1 -0
- package/dist/server/src/config.d.ts +2 -0
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/constants.d.ts +2 -1
- package/dist/server/src/constants.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +10 -0
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
- package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata.d.ts +19 -0
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +12 -2
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts +0 -5
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +3 -0
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +35 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/contracts/files.d.ts +25 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/dist/shared/contracts/settings.d.ts +7 -0
- package/package.json +10 -10
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
- package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
- package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
|
@@ -1,97 +1,119 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, useEffect
|
|
2
|
+
import { useMemo, useState, useEffect } from 'react';
|
|
3
3
|
import { useNotification } from '@strapi/admin/strapi-admin';
|
|
4
|
-
import { Modal,
|
|
4
|
+
import { Modal, Flex, Button, Typography, Field, SingleSelect, SingleSelectOption } from '@strapi/design-system';
|
|
5
5
|
import { useIntl } from 'react-intl';
|
|
6
6
|
import { styled } from 'styled-components';
|
|
7
|
-
import { useGetFolderStructureQuery,
|
|
8
|
-
import { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection.mjs';
|
|
7
|
+
import { useGetFolderStructureQuery, useBulkMoveMutation, useGetFolderQuery } from '../../../services/folders.mjs';
|
|
9
8
|
import { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder.mjs';
|
|
10
9
|
import { flattenFolderStructure } from '../../../utils/flattenFolderStructure.mjs';
|
|
10
|
+
import { formatMoveSuccessMessage } from '../../../utils/formatMoveSuccessMessage.mjs';
|
|
11
11
|
import { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage.mjs';
|
|
12
|
+
import { hasUniformSource, uniformSourceFolderId } from '../../../utils/itemSource.mjs';
|
|
12
13
|
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
13
|
-
import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
|
|
14
|
-
import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
|
|
15
14
|
|
|
16
15
|
const StyledModalContent = styled(Modal.Content)`
|
|
17
16
|
max-width: 51.6rem;
|
|
18
17
|
`;
|
|
19
18
|
/**
|
|
20
|
-
* "Move elements to" modal
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* folder
|
|
24
|
-
*
|
|
25
|
-
|
|
19
|
+
* "Move elements to" modal. Moves the given items (assets and/or folders) into
|
|
20
|
+
* the picked destination folder via `POST /upload/actions/bulk-move`. The
|
|
21
|
+
* mutation invalidates the asset list, folder list and the sidebar
|
|
22
|
+
* folder-structure, so both panes refresh on success. On failure the modal stays
|
|
23
|
+
* open so the user can retry or cancel.
|
|
24
|
+
*
|
|
25
|
+
* Used both by the bulk actions bar (the whole selection) and by a folder's
|
|
26
|
+
* actions menu (that one folder).
|
|
27
|
+
*/ const BulkMoveDialog = ({ open, onClose, items, onSuccess })=>{
|
|
26
28
|
const { formatMessage } = useIntl();
|
|
27
29
|
const { toggleNotification } = useNotification();
|
|
28
|
-
const {
|
|
29
|
-
const { currentFolderId } = useFolderNavigation();
|
|
30
|
-
const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, {
|
|
30
|
+
const { data: folderStructure = [], isUninitialized: isStructureUninitialized, isLoading: isLoadingStructure, isError: isStructureError } = useGetFolderStructureQuery(undefined, {
|
|
31
31
|
skip: !open
|
|
32
32
|
});
|
|
33
|
-
const {
|
|
34
|
-
|
|
33
|
+
const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
|
|
34
|
+
const fileIds = useMemo(()=>items.filter((item)=>item.kind === 'file').map((item)=>item.id), [
|
|
35
|
+
items
|
|
36
|
+
]);
|
|
37
|
+
const folderIds = useMemo(()=>items.filter((item)=>item.kind === 'folder').map((item)=>item.id), [
|
|
38
|
+
items
|
|
39
|
+
]);
|
|
40
|
+
// A selection made under a global search can span folders, so the source is
|
|
41
|
+
// nameable only when every item agrees on it — `null` otherwise, and the toast
|
|
42
|
+
// then omits the source rather than crediting one item's folder to all of them.
|
|
43
|
+
// The bar can also hand over an empty set, which is likewise unnameable.
|
|
44
|
+
const isSourceUniform = hasUniformSource(items);
|
|
45
|
+
const sourceFolderId = uniformSourceFolderId(items);
|
|
46
|
+
const { data: sourceFolder } = useGetFolderQuery({
|
|
47
|
+
id: sourceFolderId
|
|
35
48
|
}, {
|
|
36
|
-
skip:
|
|
49
|
+
skip: sourceFolderId === null
|
|
37
50
|
});
|
|
38
|
-
const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
|
|
39
51
|
// '' is the DOM-only sentinel for the Media Library root (null everywhere else).
|
|
40
52
|
const [destination, setDestination] = useState('');
|
|
41
|
-
useEffect(()=>{
|
|
42
|
-
if (open) {
|
|
43
|
-
setDestination('');
|
|
44
|
-
}
|
|
45
|
-
}, [
|
|
46
|
-
open
|
|
47
|
-
]);
|
|
48
53
|
const rootLabel = formatMessage({
|
|
49
54
|
id: getTranslationKey('plugin.name'),
|
|
50
55
|
defaultMessage: 'Media Library'
|
|
51
56
|
});
|
|
52
|
-
// Reconstruct the selection as a drag set so the dialog validates destinations
|
|
53
|
-
// through the exact same canonical predicate as the DnD highlight.
|
|
54
|
-
const dragSet = useMemo(()=>buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId), [
|
|
55
|
-
selectedIds,
|
|
56
|
-
selectedFolderIds,
|
|
57
|
-
currentFolderId
|
|
58
|
-
]);
|
|
59
57
|
// Options carry the full ancestry ("About / Images" vs "Tech / Images") so
|
|
60
58
|
// same-named folders stay distinguishable, listed depth-first under their
|
|
61
|
-
// parent.
|
|
59
|
+
// parent. The moved folders and their descendants are pruned during the same
|
|
62
60
|
// single walk — an item can't be moved into itself or below itself (the
|
|
63
|
-
// server would reject it). The
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure,
|
|
67
|
-
items
|
|
61
|
+
// server would reject it). The folder the items already live in is filtered
|
|
62
|
+
// out too via `canDropItemOnFolder`, so we never offer a no-op move.
|
|
63
|
+
// Memoized: large libraries shouldn't re-walk the tree on every render.
|
|
64
|
+
const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure, new Set(folderIds)).filter((option)=>canDropItemOnFolder({
|
|
65
|
+
items,
|
|
68
66
|
targetFolderId: option.id,
|
|
69
67
|
folderStructure
|
|
70
68
|
})), [
|
|
71
69
|
folderStructure,
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
folderIds,
|
|
71
|
+
items
|
|
74
72
|
]);
|
|
75
73
|
// Hide the root option when the items already live at root — dropping there
|
|
76
74
|
// would be a no-op. Uses the same predicate as the DnD highlight.
|
|
77
75
|
const canMoveToRoot = useMemo(()=>canDropItemOnFolder({
|
|
78
|
-
items
|
|
76
|
+
items,
|
|
79
77
|
targetFolderId: null,
|
|
80
78
|
folderStructure
|
|
81
79
|
}), [
|
|
82
|
-
|
|
80
|
+
items,
|
|
83
81
|
folderStructure
|
|
84
82
|
]);
|
|
85
|
-
|
|
83
|
+
// The default has to be an option that is actually rendered, or the select
|
|
84
|
+
// shows blank: root is absent when the items already live there, and the
|
|
85
|
+
// folder options only exist once the structure query has resolved.
|
|
86
|
+
const defaultDestination = canMoveToRoot ? '' : destinationOptions[0]?.id.toString() ?? '';
|
|
87
|
+
// Re-derived rather than only reset on open, because the options arrive after
|
|
88
|
+
// the first render. It is a primitive, so a background refetch that produces
|
|
89
|
+
// the same default won't discard a destination the user already picked.
|
|
90
|
+
useEffect(()=>{
|
|
91
|
+
setDestination(defaultDestination);
|
|
92
|
+
}, [
|
|
93
|
+
open,
|
|
94
|
+
defaultDestination
|
|
95
|
+
]);
|
|
96
|
+
// Until the structure resolves there are no options, so the default falls
|
|
97
|
+
// back to root ('') — which for a root-level item is the no-op destination
|
|
98
|
+
// that was deliberately filtered out. Nothing may be submitted before this.
|
|
99
|
+
const isStructureReady = !isStructureUninitialized && !isLoadingStructure && !isStructureError;
|
|
100
|
+
// Moving a single folder that already sits next to every other folder leaves
|
|
101
|
+
// nowhere to go; say so instead of showing an empty select. Only once the
|
|
102
|
+
// structure has arrived — an in-flight or failed fetch also has no options,
|
|
103
|
+
// and a failure is a different story to tell.
|
|
104
|
+
const hasNoDestination = isStructureReady && destinationOptions.length === 0 && !canMoveToRoot;
|
|
105
|
+
const count = items.length;
|
|
86
106
|
const handleMove = async ()=>{
|
|
87
|
-
|
|
107
|
+
// The button is disabled in both cases; the dialog can also be submitted
|
|
108
|
+
// from the keyboard, so guard here too.
|
|
109
|
+
if (isMoving || !isStructureReady) {
|
|
88
110
|
return;
|
|
89
111
|
}
|
|
90
112
|
const destinationFolderId = destination === '' ? null : Number(destination);
|
|
91
113
|
try {
|
|
92
114
|
await bulkMove({
|
|
93
|
-
fileIds
|
|
94
|
-
folderIds
|
|
115
|
+
fileIds,
|
|
116
|
+
folderIds,
|
|
95
117
|
destinationFolderId
|
|
96
118
|
}).unwrap();
|
|
97
119
|
} catch (error) {
|
|
@@ -108,22 +130,71 @@ const StyledModalContent = styled(Modal.Content)`
|
|
|
108
130
|
});
|
|
109
131
|
return;
|
|
110
132
|
}
|
|
111
|
-
|
|
133
|
+
// A uniform source with a `null` id is the Media Library root — a real name.
|
|
134
|
+
// Only a set that genuinely spans folders has no source to report.
|
|
135
|
+
const sourceName = !isSourceUniform ? null : sourceFolderId === null ? rootLabel : sourceFolder?.name ?? rootLabel;
|
|
112
136
|
const destinationName = destinationFolderId === null ? rootLabel : destinationOptions.find((option)=>option.id === destinationFolderId)?.label ?? rootLabel;
|
|
113
137
|
toggleNotification({
|
|
114
138
|
type: 'success',
|
|
115
|
-
message:
|
|
116
|
-
|
|
117
|
-
defaultMessage: '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}'
|
|
118
|
-
}, {
|
|
139
|
+
message: formatMoveSuccessMessage({
|
|
140
|
+
formatMessage,
|
|
119
141
|
count,
|
|
120
142
|
source: sourceName,
|
|
121
143
|
destination: destinationName
|
|
122
144
|
})
|
|
123
145
|
});
|
|
124
|
-
|
|
146
|
+
onSuccess?.();
|
|
125
147
|
onClose();
|
|
126
148
|
};
|
|
149
|
+
// Three states: a failed structure request, a genuine dead end, and the
|
|
150
|
+
// select — which also covers the loading window, so the hint and the error
|
|
151
|
+
// don't flash in ahead of the options.
|
|
152
|
+
const renderBody = ()=>{
|
|
153
|
+
if (isStructureError) {
|
|
154
|
+
return /*#__PURE__*/ jsx(Typography, {
|
|
155
|
+
textColor: "danger600",
|
|
156
|
+
children: formatMessage({
|
|
157
|
+
id: getTranslationKey('list.bulk-actions.move.load-error'),
|
|
158
|
+
defaultMessage: "Couldn't load the folder list. Please try again."
|
|
159
|
+
})
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (hasNoDestination) {
|
|
163
|
+
return /*#__PURE__*/ jsx(Typography, {
|
|
164
|
+
textColor: "neutral600",
|
|
165
|
+
children: formatMessage({
|
|
166
|
+
id: getTranslationKey('list.bulk-actions.move.no-destination'),
|
|
167
|
+
defaultMessage: 'There is no other folder to move this to.'
|
|
168
|
+
})
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
return /*#__PURE__*/ jsxs(Field.Root, {
|
|
172
|
+
name: "destination",
|
|
173
|
+
children: [
|
|
174
|
+
/*#__PURE__*/ jsx(Field.Label, {
|
|
175
|
+
children: formatMessage({
|
|
176
|
+
id: getTranslationKey('list.bulk-actions.move.location'),
|
|
177
|
+
defaultMessage: 'Location'
|
|
178
|
+
})
|
|
179
|
+
}),
|
|
180
|
+
/*#__PURE__*/ jsxs(SingleSelect, {
|
|
181
|
+
value: destination,
|
|
182
|
+
onChange: (value)=>setDestination(String(value)),
|
|
183
|
+
disabled: isMoving || !isStructureReady,
|
|
184
|
+
children: [
|
|
185
|
+
canMoveToRoot && /*#__PURE__*/ jsx(SingleSelectOption, {
|
|
186
|
+
value: "",
|
|
187
|
+
children: rootLabel
|
|
188
|
+
}),
|
|
189
|
+
destinationOptions.map((option)=>/*#__PURE__*/ jsx(SingleSelectOption, {
|
|
190
|
+
value: String(option.id),
|
|
191
|
+
children: option.label
|
|
192
|
+
}, option.id))
|
|
193
|
+
]
|
|
194
|
+
})
|
|
195
|
+
]
|
|
196
|
+
});
|
|
197
|
+
};
|
|
127
198
|
return /*#__PURE__*/ jsx(Modal.Root, {
|
|
128
199
|
open: open,
|
|
129
200
|
onOpenChange: (nextOpen)=>{
|
|
@@ -144,32 +215,7 @@ const StyledModalContent = styled(Modal.Content)`
|
|
|
144
215
|
})
|
|
145
216
|
}),
|
|
146
217
|
/*#__PURE__*/ jsx(Modal.Body, {
|
|
147
|
-
children:
|
|
148
|
-
name: "destination",
|
|
149
|
-
children: [
|
|
150
|
-
/*#__PURE__*/ jsx(Field.Label, {
|
|
151
|
-
children: formatMessage({
|
|
152
|
-
id: getTranslationKey('list.bulk-actions.move.location'),
|
|
153
|
-
defaultMessage: 'Location'
|
|
154
|
-
})
|
|
155
|
-
}),
|
|
156
|
-
/*#__PURE__*/ jsxs(SingleSelect, {
|
|
157
|
-
value: destination,
|
|
158
|
-
onChange: (value)=>setDestination(String(value)),
|
|
159
|
-
disabled: isMoving,
|
|
160
|
-
children: [
|
|
161
|
-
canMoveToRoot && /*#__PURE__*/ jsx(SingleSelectOption, {
|
|
162
|
-
value: "",
|
|
163
|
-
children: rootLabel
|
|
164
|
-
}),
|
|
165
|
-
destinationOptions.map((option)=>/*#__PURE__*/ jsx(SingleSelectOption, {
|
|
166
|
-
value: String(option.id),
|
|
167
|
-
children: option.label
|
|
168
|
-
}, option.id))
|
|
169
|
-
]
|
|
170
|
-
})
|
|
171
|
-
]
|
|
172
|
-
})
|
|
218
|
+
children: renderBody()
|
|
173
219
|
}),
|
|
174
220
|
/*#__PURE__*/ jsx(Modal.Footer, {
|
|
175
221
|
children: /*#__PURE__*/ jsxs(Flex, {
|
|
@@ -190,6 +236,7 @@ const StyledModalContent = styled(Modal.Content)`
|
|
|
190
236
|
/*#__PURE__*/ jsx(Button, {
|
|
191
237
|
onClick: handleMove,
|
|
192
238
|
loading: isMoving,
|
|
239
|
+
disabled: !isStructureReady || hasNoDestination,
|
|
193
240
|
children: formatMessage({
|
|
194
241
|
id: getTranslationKey('list.bulk-actions.move.submit'),
|
|
195
242
|
defaultMessage: 'Move'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\n/**\n * \"Move elements to\" modal for the bulk actions bar. Moves the current\n * selection (assets and/or folders) into the picked destination folder via\n * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,\n * folder list and the sidebar folder-structure, so both panes refresh on\n * success. On failure the modal stays open so the user can retry or cancel.\n */\nexport const BulkMoveDialog = ({ open, onClose }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const { currentFolderId } = useFolderNavigation();\n const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, { skip: !open });\n const { data: currentFolder } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n useEffect(() => {\n if (open) {\n setDestination('');\n }\n }, [open]);\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Reconstruct the selection as a drag set so the dialog validates destinations\n // through the exact same canonical predicate as the DnD highlight.\n const dragSet = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId),\n [selectedIds, selectedFolderIds, currentFolderId]\n );\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. Selected folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The current folder (where the items already live)\n // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op\n // move. Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, selectedFolderIds).filter((option) =>\n canDropItemOnFolder({ items: dragSet, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, selectedFolderIds, dragSet]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items: dragSet, targetFolderId: null, folderStructure }),\n [dragSet, folderStructure]\n );\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const handleMove = async () => {\n if (isMoving) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n destinationFolderId,\n }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n const sourceName = currentFolderId === null ? rootLabel : (currentFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.move.success'),\n defaultMessage:\n '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}',\n },\n { count, source: sourceName, destination: destinationName }\n ),\n });\n clear();\n onClose();\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleMove} loading={isMoving}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","formatMessage","useIntl","toggleNotification","useNotification","selectedIds","selectedFolderIds","clear","useAssetSelection","currentFolderId","useFolderNavigation","data","folderStructure","useGetFolderStructureQuery","undefined","skip","currentFolder","useGetFolderQuery","id","bulkMove","isLoading","isMoving","useBulkMoveMutation","destination","setDestination","useState","useEffect","rootLabel","getTranslationKey","defaultMessage","dragSet","useMemo","buildDragSetFromSelection","destinationOptions","flattenFolderStructure","filter","option","canDropItemOnFolder","items","targetFolderId","canMoveToRoot","count","size","handleMove","destinationFolderId","Number","fileIds","Array","from","folderIds","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","source","_jsx","Root","onOpenChange","nextOpen","_jsxs","Header","Title","Body","Field","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","map","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { formatMoveSuccessMessage } from '../../../utils/formatMoveSuccessMessage';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { hasUniformSource, uniformSourceFolderId } from '../../../utils/itemSource';\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport type { DragItemData } from '../../../types/dnd';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n /**\n * Items to move, as drag data so destination validation sees each item's real\n * parent — the current folder is not a reliable stand-in once results come\n * from a global search.\n */\n items: DragItemData[];\n onSuccess?: () => void;\n}\n\n/**\n * \"Move elements to\" modal. Moves the given items (assets and/or folders) into\n * the picked destination folder via `POST /upload/actions/bulk-move`. The\n * mutation invalidates the asset list, folder list and the sidebar\n * folder-structure, so both panes refresh on success. On failure the modal stays\n * open so the user can retry or cancel.\n *\n * Used both by the bulk actions bar (the whole selection) and by a folder's\n * actions menu (that one folder).\n */\nexport const BulkMoveDialog = ({ open, onClose, items, onSuccess }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const {\n data: folderStructure = [],\n isUninitialized: isStructureUninitialized,\n isLoading: isLoadingStructure,\n isError: isStructureError,\n } = useGetFolderStructureQuery(undefined, { skip: !open });\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n const fileIds = useMemo(\n () => items.filter((item) => item.kind === 'file').map((item) => item.id),\n [items]\n );\n const folderIds = useMemo(\n () => items.filter((item) => item.kind === 'folder').map((item) => item.id),\n [items]\n );\n\n // A selection made under a global search can span folders, so the source is\n // nameable only when every item agrees on it — `null` otherwise, and the toast\n // then omits the source rather than crediting one item's folder to all of them.\n // The bar can also hand over an empty set, which is likewise unnameable.\n const isSourceUniform = hasUniformSource(items);\n const sourceFolderId = uniformSourceFolderId(items);\n const { data: sourceFolder } = useGetFolderQuery(\n { id: sourceFolderId! },\n { skip: sourceFolderId === null }\n );\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. The moved folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The folder the items already live in is filtered\n // out too via `canDropItemOnFolder`, so we never offer a no-op move.\n // Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, new Set(folderIds)).filter((option) =>\n canDropItemOnFolder({ items, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, folderIds, items]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items, targetFolderId: null, folderStructure }),\n [items, folderStructure]\n );\n\n // The default has to be an option that is actually rendered, or the select\n // shows blank: root is absent when the items already live there, and the\n // folder options only exist once the structure query has resolved.\n const defaultDestination = canMoveToRoot ? '' : (destinationOptions[0]?.id.toString() ?? '');\n\n // Re-derived rather than only reset on open, because the options arrive after\n // the first render. It is a primitive, so a background refetch that produces\n // the same default won't discard a destination the user already picked.\n useEffect(() => {\n setDestination(defaultDestination);\n }, [open, defaultDestination]);\n\n // Until the structure resolves there are no options, so the default falls\n // back to root ('') — which for a root-level item is the no-op destination\n // that was deliberately filtered out. Nothing may be submitted before this.\n const isStructureReady = !isStructureUninitialized && !isLoadingStructure && !isStructureError;\n\n // Moving a single folder that already sits next to every other folder leaves\n // nowhere to go; say so instead of showing an empty select. Only once the\n // structure has arrived — an in-flight or failed fetch also has no options,\n // and a failure is a different story to tell.\n const hasNoDestination = isStructureReady && destinationOptions.length === 0 && !canMoveToRoot;\n\n const count = items.length;\n\n const handleMove = async () => {\n // The button is disabled in both cases; the dialog can also be submitted\n // from the keyboard, so guard here too.\n if (isMoving || !isStructureReady) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({ fileIds, folderIds, destinationFolderId }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n // A uniform source with a `null` id is the Media Library root — a real name.\n // Only a set that genuinely spans folders has no source to report.\n const sourceName = !isSourceUniform\n ? null\n : sourceFolderId === null\n ? rootLabel\n : (sourceFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMoveSuccessMessage({\n formatMessage,\n count,\n source: sourceName,\n destination: destinationName,\n }),\n });\n onSuccess?.();\n onClose();\n };\n\n // Three states: a failed structure request, a genuine dead end, and the\n // select — which also covers the loading window, so the hint and the error\n // don't flash in ahead of the options.\n const renderBody = () => {\n if (isStructureError) {\n return (\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.load-error'),\n defaultMessage: \"Couldn't load the folder list. Please try again.\",\n })}\n </Typography>\n );\n }\n\n if (hasNoDestination) {\n return (\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.no-destination'),\n defaultMessage: 'There is no other folder to move this to.',\n })}\n </Typography>\n );\n }\n\n return (\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving || !isStructureReady}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n );\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>{renderBody()}</Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button\n onClick={handleMove}\n loading={isMoving}\n disabled={!isStructureReady || hasNoDestination}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","items","onSuccess","formatMessage","useIntl","toggleNotification","useNotification","data","folderStructure","isUninitialized","isStructureUninitialized","isLoading","isLoadingStructure","isError","isStructureError","useGetFolderStructureQuery","undefined","skip","bulkMove","isMoving","useBulkMoveMutation","fileIds","useMemo","filter","item","kind","map","id","folderIds","isSourceUniform","hasUniformSource","sourceFolderId","uniformSourceFolderId","sourceFolder","useGetFolderQuery","destination","setDestination","useState","rootLabel","getTranslationKey","defaultMessage","destinationOptions","flattenFolderStructure","Set","option","canDropItemOnFolder","targetFolderId","canMoveToRoot","defaultDestination","toString","useEffect","isStructureReady","hasNoDestination","length","count","handleMove","destinationFolderId","Number","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","formatMoveSuccessMessage","source","renderBody","_jsx","Typography","textColor","_jsxs","Field","Root","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","onOpenChange","nextOpen","Header","Title","Body","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":";;;;;;;;;;;;;;AA6BA,MAAMA,kBAAAA,GAAqBC,MAAAA,CAAOC,KAAAA,CAAMC,OAAO,CAAC;;AAEhD,CAAC;AAcD;;;;;;;;;AASC,IACM,MAAMC,cAAAA,GAAiB,CAAC,EAAEC,IAAI,EAAEC,OAAO,EAAEC,KAAK,EAAEC,SAAS,EAAuB,GAAA;IACrF,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,EACJC,IAAAA,EAAMC,eAAAA,GAAkB,EAAE,EAC1BC,iBAAiBC,wBAAwB,EACzCC,SAAAA,EAAWC,kBAAkB,EAC7BC,OAAAA,EAASC,gBAAgB,EAC1B,GAAGC,2BAA2BC,SAAAA,EAAW;AAAEC,QAAAA,IAAAA,EAAM,CAAClB;AAAK,KAAA,CAAA;AACxD,IAAA,MAAM,CAACmB,QAAAA,EAAU,EAAEP,WAAWQ,QAAQ,EAAE,CAAC,GAAGC,mBAAAA,EAAAA;AAE5C,IAAA,MAAMC,UAAUC,OAAAA,CACd,IAAMrB,MAAMsB,MAAM,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,IAAI,KAAK,QAAQC,GAAG,CAAC,CAACF,IAAAA,GAASA,IAAAA,CAAKG,EAAE,CAAA,EACxE;AAAC1B,QAAAA;AAAM,KAAA,CAAA;AAET,IAAA,MAAM2B,YAAYN,OAAAA,CAChB,IAAMrB,MAAMsB,MAAM,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,IAAI,KAAK,UAAUC,GAAG,CAAC,CAACF,IAAAA,GAASA,IAAAA,CAAKG,EAAE,CAAA,EAC1E;AAAC1B,QAAAA;AAAM,KAAA,CAAA;;;;;AAOT,IAAA,MAAM4B,kBAAkBC,gBAAAA,CAAiB7B,KAAAA,CAAAA;AACzC,IAAA,MAAM8B,iBAAiBC,qBAAAA,CAAsB/B,KAAAA,CAAAA;AAC7C,IAAA,MAAM,EAAEM,IAAAA,EAAM0B,YAAY,EAAE,GAAGC,iBAAAA,CAC7B;QAAEP,EAAAA,EAAII;KAAgB,EACtB;AAAEd,QAAAA,IAAAA,EAAMc,cAAAA,KAAmB;AAAK,KAAA,CAAA;;AAIlC,IAAA,MAAM,CAACI,WAAAA,EAAaC,cAAAA,CAAe,GAAGC,QAAAA,CAAiB,EAAA,CAAA;AAEvD,IAAA,MAAMC,YAAYnC,aAAAA,CAAc;AAC9BwB,QAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,aAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;;;;;;;;AASA,IAAA,MAAMC,kBAAAA,GAAqBnB,OAAAA,CACzB,IACEoB,sBAAAA,CAAuBlC,eAAAA,EAAiB,IAAImC,GAAAA,CAAIf,SAAAA,CAAAA,CAAAA,CAAYL,MAAM,CAAC,CAACqB,MAAAA,GAClEC,mBAAAA,CAAoB;AAAE5C,gBAAAA,KAAAA;AAAO6C,gBAAAA,cAAAA,EAAgBF,OAAOjB,EAAE;AAAEnB,gBAAAA;aAAgB,CAAA,CAAA,EAE5E;AAACA,QAAAA,eAAAA;AAAiBoB,QAAAA,SAAAA;AAAW3B,QAAAA;AAAM,KAAA,CAAA;;;IAKrC,MAAM8C,aAAAA,GAAgBzB,OAAAA,CACpB,IAAMuB,mBAAAA,CAAoB;AAAE5C,YAAAA,KAAAA;YAAO6C,cAAAA,EAAgB,IAAA;AAAMtC,YAAAA;SAAgB,CAAA,EACzE;AAACP,QAAAA,KAAAA;AAAOO,QAAAA;AAAgB,KAAA,CAAA;;;;IAM1B,MAAMwC,kBAAAA,GAAqBD,gBAAgB,EAAA,GAAMN,kBAAkB,CAAC,CAAA,CAAE,EAAEd,GAAGsB,QAAAA,EAAAA,IAAc,EAAA;;;;IAKzFC,SAAAA,CAAU,IAAA;QACRd,cAAAA,CAAeY,kBAAAA,CAAAA;IACjB,CAAA,EAAG;AAACjD,QAAAA,IAAAA;AAAMiD,QAAAA;AAAmB,KAAA,CAAA;;;;AAK7B,IAAA,MAAMG,gBAAAA,GAAmB,CAACzC,wBAAAA,IAA4B,CAACE,sBAAsB,CAACE,gBAAAA;;;;;AAM9E,IAAA,MAAMsC,mBAAmBD,gBAAAA,IAAoBV,kBAAAA,CAAmBY,MAAM,KAAK,KAAK,CAACN,aAAAA;IAEjF,MAAMO,KAAAA,GAAQrD,MAAMoD,MAAM;AAE1B,IAAA,MAAME,UAAAA,GAAa,UAAA;;;QAGjB,IAAIpC,QAAAA,IAAY,CAACgC,gBAAAA,EAAkB;AACjC,YAAA;AACF,QAAA;AAEA,QAAA,MAAMK,mBAAAA,GAAsBrB,WAAAA,KAAgB,EAAA,GAAK,IAAA,GAAOsB,MAAAA,CAAOtB,WAAAA,CAAAA;QAE/D,IAAI;AACF,YAAA,MAAMjB,QAAAA,CAAS;AAAEG,gBAAAA,OAAAA;AAASO,gBAAAA,SAAAA;AAAW4B,gBAAAA;AAAoB,aAAA,CAAA,CAAGE,MAAM,EAAA;AACpE,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;;;;;YAKdtD,kBAAAA,CAAmB;gBACjBuD,IAAAA,EAAM,QAAA;gBACNC,OAAAA,EAASC,uBAAAA,CACPH,OACAxD,aAAAA,CAAc;AACZwB,oBAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,8BAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;AAEJ,aAAA,CAAA;AACA,YAAA;AACF,QAAA;;;QAIA,MAAMuB,UAAAA,GAAa,CAAClC,eAAAA,GAChB,IAAA,GACAE,mBAAmB,IAAA,GACjBO,SAAAA,GACCL,cAAc+B,IAAAA,IAAQ1B,SAAAA;AAC7B,QAAA,MAAM2B,eAAAA,GACJT,mBAAAA,KAAwB,IAAA,GACpBlB,SAAAA,GACCG,kBAAAA,CAAmByB,IAAI,CAAC,CAACtB,MAAAA,GAAWA,MAAAA,CAAOjB,EAAE,KAAK6B,sBAAsBW,KAAAA,IACzE7B,SAAAA;QAENjC,kBAAAA,CAAmB;YACjBuD,IAAAA,EAAM,SAAA;AACNC,YAAAA,OAAAA,EAASO,wBAAAA,CAAyB;AAChCjE,gBAAAA,aAAAA;AACAmD,gBAAAA,KAAAA;gBACAe,MAAAA,EAAQN,UAAAA;gBACR5B,WAAAA,EAAa8B;AACf,aAAA;AACF,SAAA,CAAA;AACA/D,QAAAA,SAAAA,IAAAA;AACAF,QAAAA,OAAAA,EAAAA;AACF,IAAA,CAAA;;;;AAKA,IAAA,MAAMsE,UAAAA,GAAa,IAAA;AACjB,QAAA,IAAIxD,gBAAAA,EAAkB;AACpB,YAAA,qBACEyD,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,SAAAA,EAAU,WAAA;0BACnBtE,aAAAA,CAAc;AACbwB,oBAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,mCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA;;AAGN,QAAA;AAEA,QAAA,IAAIY,gBAAAA,EAAkB;AACpB,YAAA,qBACEmB,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,SAAAA,EAAU,YAAA;0BACnBtE,aAAAA,CAAc;AACbwB,oBAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,uCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA;;AAGN,QAAA;QAEA,qBACEkC,IAAA,CAACC,MAAMC,IAAI,EAAA;YAACZ,IAAAA,EAAK,aAAA;;AACf,8BAAAO,GAAA,CAACI,MAAME,KAAK,EAAA;8BACT1E,aAAAA,CAAc;AACbwB,wBAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,iCAAA,CAAA;wBACtBC,cAAAA,EAAgB;AAClB,qBAAA;;8BAEFkC,IAAA,CAACI,YAAAA,EAAAA;oBACCC,KAAAA,EAAO5C,WAAAA;oBACP6C,QAAAA,EAAU,CAACD,KAAAA,GAAU3C,cAAAA,CAAe6C,MAAAA,CAAOF,KAAAA,CAAAA,CAAAA;AAC3CG,oBAAAA,QAAAA,EAAU/D,YAAY,CAACgC,gBAAAA;;AAEtBJ,wBAAAA,aAAAA,kBAAiBwB,GAAA,CAACY,kBAAAA,EAAAA;4BAAmBJ,KAAAA,EAAM,EAAA;AAAIzC,4BAAAA,QAAAA,EAAAA;;AAC/CG,wBAAAA,kBAAAA,CAAmBf,GAAG,CAAC,CAACkB,MAAAA,iBACvB2B,GAAA,CAACY,kBAAAA,EAAAA;gCAAmCJ,KAAAA,EAAOE,MAAAA,CAAOrC,OAAOjB,EAAE,CAAA;AACxDiB,gCAAAA,QAAAA,EAAAA,MAAAA,CAAOuB;AADevB,6BAAAA,EAAAA,MAAAA,CAAOjB,EAAE,CAAA;;;;;AAO5C,IAAA,CAAA;IAEA,qBACE4C,GAAA,CAAC3E,MAAMgF,IAAI,EAAA;QACT7E,IAAAA,EAAMA,IAAAA;AACNqF,QAAAA,YAAAA,EAAc,CAACC,QAAAA,GAAAA;;;YAGb,IAAI,CAACA,QAAAA,IAAY,CAAClE,QAAAA,EAAU;AAC1BnB,gBAAAA,OAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA;AAEA,QAAA,QAAA,gBAAA0E,IAAA,CAAChF,kBAAAA,EAAAA;;AACC,8BAAA6E,GAAA,CAAC3E,MAAM0F,MAAM,EAAA;4CACXf,GAAA,CAAC3E,MAAM2F,KAAK,EAAA;kCACTpF,aAAAA,CAAc;AACbwB,4BAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,8BAAA,CAAA;4BACtBC,cAAAA,EAAgB;AAClB,yBAAA;;;AAGJ,8BAAA+B,GAAA,CAAC3E,MAAM4F,IAAI,EAAA;AAAElB,oBAAAA,QAAAA,EAAAA,UAAAA;;AACb,8BAAAC,GAAA,CAAC3E,MAAM6F,MAAM,EAAA;AACX,oBAAA,QAAA,gBAAAf,IAAA,CAACgB,IAAAA,EAAAA;wBAAKC,GAAAA,EAAK,CAAA;wBAAGC,cAAAA,EAAe,eAAA;wBAAgBC,KAAAA,EAAM,MAAA;;0CACjDtB,GAAA,CAACuB,MAAAA,EAAAA;gCAAOC,OAAAA,EAAQ,UAAA;gCAAWC,OAAAA,EAAShG,OAAAA;gCAASkF,QAAAA,EAAU/D,QAAAA;gCAAUyC,IAAAA,EAAK,QAAA;0CACnEzD,aAAAA,CAAc;oCAAEwB,EAAAA,EAAI,8BAAA;oCAAgCa,cAAAA,EAAgB;AAAS,iCAAA;;0CAEhF+B,GAAA,CAACuB,MAAAA,EAAAA;gCACCE,OAAAA,EAASzC,UAAAA;gCACT0C,OAAAA,EAAS9E,QAAAA;AACT+D,gCAAAA,QAAAA,EAAU,CAAC/B,gBAAAA,IAAoBC,gBAAAA;0CAE9BjD,aAAAA,CAAc;AACbwB,oCAAAA,EAAAA,EAAIY,iBAAAA,CAAkB,+BAAA,CAAA;oCACtBC,cAAAA,EAAgB;AAClB,iCAAA;;;;;;;;AAOd;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var designSystem = require('@strapi/design-system');
|
|
5
|
+
var styledComponents = require('styled-components');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Translucent overlay for a container with a long-running mutation in flight,
|
|
9
|
+
* covering it and centring a labelled loader.
|
|
10
|
+
*
|
|
11
|
+
* Used by the asset details drawer (over the whole form) and by the list's rows
|
|
12
|
+
* and cards (over the one item being replaced). It positions against the
|
|
13
|
+
* nearest positioned ancestor, so the container must be `position: relative`.
|
|
14
|
+
*
|
|
15
|
+
* `$zIndex` is a prop because the two callers stack differently: in the drawer
|
|
16
|
+
* it has to clear the in-drawer toast slot at 10, while in a row it only has to
|
|
17
|
+
* clear the row's own content.
|
|
18
|
+
*/ const BusyOverlayRoot = styledComponents.styled(designSystem.Flex)`
|
|
19
|
+
position: absolute;
|
|
20
|
+
inset: 0;
|
|
21
|
+
z-index: ${({ $zIndex })=>$zIndex};
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
25
|
+
opacity: 0.7;
|
|
26
|
+
`;
|
|
27
|
+
const BusyOverlay = ({ children, zIndex = 20, hideLabel = false })=>/*#__PURE__*/ jsxRuntime.jsx(BusyOverlayRoot, {
|
|
28
|
+
$zIndex: zIndex,
|
|
29
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
|
|
30
|
+
small: hideLabel,
|
|
31
|
+
children: children
|
|
32
|
+
})
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
exports.BusyOverlay = BusyOverlay;
|
|
36
|
+
//# sourceMappingURL=BusyOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BusyOverlay.js","sources":["../../../../../../admin/src/future/pages/Assets/components/BusyOverlay.tsx"],"sourcesContent":["import { Flex, Loader } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * Translucent overlay for a container with a long-running mutation in flight,\n * covering it and centring a labelled loader.\n *\n * Used by the asset details drawer (over the whole form) and by the list's rows\n * and cards (over the one item being replaced). It positions against the\n * nearest positioned ancestor, so the container must be `position: relative`.\n *\n * `$zIndex` is a prop because the two callers stack differently: in the drawer\n * it has to clear the in-drawer toast slot at 10, while in a row it only has to\n * clear the row's own content.\n */\nconst BusyOverlayRoot = styled(Flex)<{ $zIndex: number }>`\n position: absolute;\n inset: 0;\n z-index: ${({ $zIndex }) => $zIndex};\n align-items: center;\n justify-content: center;\n background: ${({ theme }) => theme.colors.neutral0};\n opacity: 0.7;\n`;\n\ninterface BusyOverlayProps {\n /** Shown next to the spinner, and read out as the loader's accessible label. */\n children: string;\n zIndex?: number;\n /** Hides the label, leaving the spinner — for containers too small to fit text. */\n hideLabel?: boolean;\n}\n\nexport const BusyOverlay = ({ children, zIndex = 20, hideLabel = false }: BusyOverlayProps) => (\n <BusyOverlayRoot $zIndex={zIndex}>\n <Loader small={hideLabel}>{children}</Loader>\n </BusyOverlayRoot>\n);\n"],"names":["BusyOverlayRoot","styled","Flex","$zIndex","theme","colors","neutral0","BusyOverlay","children","zIndex","hideLabel","_jsx","Loader","small"],"mappings":";;;;;;AAGA;;;;;;;;;;;AAWC,IACD,MAAMA,eAAAA,GAAkBC,uBAAAA,CAAOC,iBAAAA,CAA0B;;;AAG9C,WAAA,EAAE,CAAC,EAAEC,OAAO,EAAE,GAAKA,OAAAA,CAAQ;;;cAGxB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;;AAErD,CAAC;AAUM,MAAMC,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,MAAAA,GAAS,EAAE,EAAEC,SAAAA,GAAY,KAAK,EAAoB,iBACxFC,cAAA,CAACX,eAAAA,EAAAA;QAAgBG,OAAAA,EAASM,MAAAA;AACxB,QAAA,QAAA,gBAAAE,cAAA,CAACC,mBAAAA,EAAAA;YAAOC,KAAAA,EAAOH,SAAAA;AAAYF,YAAAA,QAAAA,EAAAA;;AAE7B,KAAA;;;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Loader, Flex } from '@strapi/design-system';
|
|
3
|
+
import { styled } from 'styled-components';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Translucent overlay for a container with a long-running mutation in flight,
|
|
7
|
+
* covering it and centring a labelled loader.
|
|
8
|
+
*
|
|
9
|
+
* Used by the asset details drawer (over the whole form) and by the list's rows
|
|
10
|
+
* and cards (over the one item being replaced). It positions against the
|
|
11
|
+
* nearest positioned ancestor, so the container must be `position: relative`.
|
|
12
|
+
*
|
|
13
|
+
* `$zIndex` is a prop because the two callers stack differently: in the drawer
|
|
14
|
+
* it has to clear the in-drawer toast slot at 10, while in a row it only has to
|
|
15
|
+
* clear the row's own content.
|
|
16
|
+
*/ const BusyOverlayRoot = styled(Flex)`
|
|
17
|
+
position: absolute;
|
|
18
|
+
inset: 0;
|
|
19
|
+
z-index: ${({ $zIndex })=>$zIndex};
|
|
20
|
+
align-items: center;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
23
|
+
opacity: 0.7;
|
|
24
|
+
`;
|
|
25
|
+
const BusyOverlay = ({ children, zIndex = 20, hideLabel = false })=>/*#__PURE__*/ jsx(BusyOverlayRoot, {
|
|
26
|
+
$zIndex: zIndex,
|
|
27
|
+
children: /*#__PURE__*/ jsx(Loader, {
|
|
28
|
+
small: hideLabel,
|
|
29
|
+
children: children
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export { BusyOverlay };
|
|
34
|
+
//# sourceMappingURL=BusyOverlay.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BusyOverlay.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BusyOverlay.tsx"],"sourcesContent":["import { Flex, Loader } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * Translucent overlay for a container with a long-running mutation in flight,\n * covering it and centring a labelled loader.\n *\n * Used by the asset details drawer (over the whole form) and by the list's rows\n * and cards (over the one item being replaced). It positions against the\n * nearest positioned ancestor, so the container must be `position: relative`.\n *\n * `$zIndex` is a prop because the two callers stack differently: in the drawer\n * it has to clear the in-drawer toast slot at 10, while in a row it only has to\n * clear the row's own content.\n */\nconst BusyOverlayRoot = styled(Flex)<{ $zIndex: number }>`\n position: absolute;\n inset: 0;\n z-index: ${({ $zIndex }) => $zIndex};\n align-items: center;\n justify-content: center;\n background: ${({ theme }) => theme.colors.neutral0};\n opacity: 0.7;\n`;\n\ninterface BusyOverlayProps {\n /** Shown next to the spinner, and read out as the loader's accessible label. */\n children: string;\n zIndex?: number;\n /** Hides the label, leaving the spinner — for containers too small to fit text. */\n hideLabel?: boolean;\n}\n\nexport const BusyOverlay = ({ children, zIndex = 20, hideLabel = false }: BusyOverlayProps) => (\n <BusyOverlayRoot $zIndex={zIndex}>\n <Loader small={hideLabel}>{children}</Loader>\n </BusyOverlayRoot>\n);\n"],"names":["BusyOverlayRoot","styled","Flex","$zIndex","theme","colors","neutral0","BusyOverlay","children","zIndex","hideLabel","_jsx","Loader","small"],"mappings":";;;;AAGA;;;;;;;;;;;AAWC,IACD,MAAMA,eAAAA,GAAkBC,MAAAA,CAAOC,IAAAA,CAA0B;;;AAG9C,WAAA,EAAE,CAAC,EAAEC,OAAO,EAAE,GAAKA,OAAAA,CAAQ;;;cAGxB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;;AAErD,CAAC;AAUM,MAAMC,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,MAAAA,GAAS,EAAE,EAAEC,SAAAA,GAAY,KAAK,EAAoB,iBACxFC,GAAA,CAACX,eAAAA,EAAAA;QAAgBG,OAAAA,EAASM,MAAAA;AACxB,QAAA,QAAA,gBAAAE,GAAA,CAACC,MAAAA,EAAAA;YAAOC,KAAAA,EAAOH,SAAAA;AAAYF,YAAAA,QAAAA,EAAAA;;AAE7B,KAAA;;;;"}
|