@strapi/upload 5.51.0 → 5.51.2
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/components/Drawer.js +3 -1
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +3 -1
- 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/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 +344 -150
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +343 -149
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +161 -19
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +162 -20
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
- package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +218 -37
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +219 -38
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +370 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +368 -0
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +209 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +207 -0
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.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/Dnd/AssetsDndProvider.js +129 -37
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +131 -39
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +120 -13
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +71 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +69 -0
- package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js +34 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs +32 -0
- package/dist/admin/future/pages/Assets/components/Dnd/computeValidDropTargets.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js +15 -0
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs +13 -1
- package/dist/admin/future/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +19 -25
- package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js +35 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs +33 -0
- package/dist/admin/future/pages/Assets/components/Dnd/useFolderTreeDroppable.mjs.map +1 -0
- 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 +408 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
- package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
- package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +195 -40
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +198 -43
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js +22 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs +19 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js +154 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs +152 -0
- package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -0
- 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 +75 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +71 -0
- package/dist/admin/future/pages/Assets/hooks/useAssetSelection.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 +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- 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/hooks/useListSort.js +124 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.mjs +120 -0
- package/dist/admin/future/pages/Assets/hooks/useListSort.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 +29 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +27 -0
- package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js +84 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs +81 -0
- package/dist/admin/future/pages/Assets/utils/mergeMixedList.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.js +104 -0
- package/dist/admin/future/pages/Assets/utils/selection.js.map +1 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs +94 -0
- package/dist/admin/future/pages/Assets/utils/selection.mjs.map +1 -0
- package/dist/admin/future/services/api.js +163 -28
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +163 -30
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/assets.js +62 -18
- package/dist/admin/future/services/assets.js.map +1 -1
- package/dist/admin/future/services/assets.mjs +62 -19
- package/dist/admin/future/services/assets.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +31 -19
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +31 -19
- 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 +33 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs +31 -0
- package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.js.map +1 -1
- package/dist/admin/future/utils/canDropItemOnFolder.mjs +4 -0
- package/dist/admin/future/utils/canDropItemOnFolder.mjs.map +1 -1
- package/dist/admin/future/utils/flattenFolderStructure.js +28 -0
- package/dist/admin/future/utils/flattenFolderStructure.js.map +1 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs +26 -0
- package/dist/admin/future/utils/flattenFolderStructure.mjs.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js +19 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +17 -0
- package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.js +31 -0
- package/dist/admin/future/utils/getFolderLabel.js.map +1 -0
- package/dist/admin/future/utils/getFolderLabel.mjs +29 -0
- package/dist/admin/future/utils/getFolderLabel.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/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/hooks/useMediaLibraryPermissions.d.ts +21 -0
- package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
- package/dist/admin/src/future/pages/Assets/components/AssetsTable.d.ts +7 -1
- package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -0
- package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +13 -0
- package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +2 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/DragOverlayChip.d.ts +2 -2
- package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/computeValidDropTargets.d.ts +7 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/dndIds.d.ts +3 -0
- package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +3 -1
- package/dist/admin/src/future/pages/Assets/components/Dnd/useFolderTreeDroppable.d.ts +19 -0
- 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 +6 -0
- package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
- package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
- package/dist/admin/src/future/pages/Assets/components/FolderTree/useSpringLoadedExpand.d.ts +6 -0
- package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +23 -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 +46 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
- package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListSort.d.ts +47 -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 +29 -0
- package/dist/admin/src/future/pages/Assets/utils/mergeMixedList.d.ts +40 -0
- package/dist/admin/src/future/pages/Assets/utils/selection.d.ts +50 -0
- package/dist/admin/src/future/services/api.d.ts +53 -5
- package/dist/admin/src/future/services/assets.d.ts +13 -2
- package/dist/admin/src/future/services/folders.d.ts +7 -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/types/dnd.d.ts +5 -0
- package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +11 -0
- package/dist/admin/src/future/utils/canDropItemOnFolder.d.ts +1 -1
- package/dist/admin/src/future/utils/flattenFolderStructure.d.ts +18 -0
- package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +14 -0
- package/dist/admin/src/future/utils/getFolderLabel.d.ts +11 -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 +85 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +85 -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/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/folders.d.ts +1 -1
- package/dist/shared/contracts/settings.d.ts +7 -0
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BulkMoveDialog.js","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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"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
3
|
+
import { useNotification } from '@strapi/admin/strapi-admin';
|
|
4
|
+
import { Modal, Field, SingleSelect, SingleSelectOption, Flex, Button } from '@strapi/design-system';
|
|
5
|
+
import { useIntl } from 'react-intl';
|
|
6
|
+
import { styled } from 'styled-components';
|
|
7
|
+
import { useGetFolderStructureQuery, useGetFolderQuery, useBulkMoveMutation } from '../../../services/folders.mjs';
|
|
8
|
+
import { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection.mjs';
|
|
9
|
+
import { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder.mjs';
|
|
10
|
+
import { flattenFolderStructure } from '../../../utils/flattenFolderStructure.mjs';
|
|
11
|
+
import { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage.mjs';
|
|
12
|
+
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
13
|
+
import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
|
|
14
|
+
import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
|
|
15
|
+
|
|
16
|
+
const StyledModalContent = styled(Modal.Content)`
|
|
17
|
+
max-width: 51.6rem;
|
|
18
|
+
`;
|
|
19
|
+
/**
|
|
20
|
+
* "Move elements to" modal for the bulk actions bar. Moves the current
|
|
21
|
+
* selection (assets and/or folders) into the picked destination folder via
|
|
22
|
+
* `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,
|
|
23
|
+
* folder list and the sidebar folder-structure, so both panes refresh on
|
|
24
|
+
* success. On failure the modal stays open so the user can retry or cancel.
|
|
25
|
+
*/ const BulkMoveDialog = ({ open, onClose })=>{
|
|
26
|
+
const { formatMessage } = useIntl();
|
|
27
|
+
const { toggleNotification } = useNotification();
|
|
28
|
+
const { selectedIds, selectedFolderIds, clear } = useAssetSelection();
|
|
29
|
+
const { currentFolderId } = useFolderNavigation();
|
|
30
|
+
const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, {
|
|
31
|
+
skip: !open
|
|
32
|
+
});
|
|
33
|
+
const { data: currentFolder } = useGetFolderQuery({
|
|
34
|
+
id: currentFolderId
|
|
35
|
+
}, {
|
|
36
|
+
skip: currentFolderId === null
|
|
37
|
+
});
|
|
38
|
+
const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
|
|
39
|
+
// '' is the DOM-only sentinel for the Media Library root (null everywhere else).
|
|
40
|
+
const [destination, setDestination] = useState('');
|
|
41
|
+
useEffect(()=>{
|
|
42
|
+
if (open) {
|
|
43
|
+
setDestination('');
|
|
44
|
+
}
|
|
45
|
+
}, [
|
|
46
|
+
open
|
|
47
|
+
]);
|
|
48
|
+
const rootLabel = formatMessage({
|
|
49
|
+
id: getTranslationKey('plugin.name'),
|
|
50
|
+
defaultMessage: 'Media Library'
|
|
51
|
+
});
|
|
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
|
+
// Options carry the full ancestry ("About / Images" vs "Tech / Images") so
|
|
60
|
+
// same-named folders stay distinguishable, listed depth-first under their
|
|
61
|
+
// parent. Selected folders and their descendants are pruned during the same
|
|
62
|
+
// single walk — an item can't be moved into itself or below itself (the
|
|
63
|
+
// server would reject it). The current folder (where the items already live)
|
|
64
|
+
// is filtered out too via `canDropItemOnFolder`, so we never offer a no-op
|
|
65
|
+
// move. Memoized: large libraries shouldn't re-walk the tree on every render.
|
|
66
|
+
const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure, selectedFolderIds).filter((option)=>canDropItemOnFolder({
|
|
67
|
+
items: dragSet,
|
|
68
|
+
targetFolderId: option.id,
|
|
69
|
+
folderStructure
|
|
70
|
+
})), [
|
|
71
|
+
folderStructure,
|
|
72
|
+
selectedFolderIds,
|
|
73
|
+
dragSet
|
|
74
|
+
]);
|
|
75
|
+
// Hide the root option when the items already live at root — dropping there
|
|
76
|
+
// would be a no-op. Uses the same predicate as the DnD highlight.
|
|
77
|
+
const canMoveToRoot = useMemo(()=>canDropItemOnFolder({
|
|
78
|
+
items: dragSet,
|
|
79
|
+
targetFolderId: null,
|
|
80
|
+
folderStructure
|
|
81
|
+
}), [
|
|
82
|
+
dragSet,
|
|
83
|
+
folderStructure
|
|
84
|
+
]);
|
|
85
|
+
const count = selectedIds.size + selectedFolderIds.size;
|
|
86
|
+
const handleMove = async ()=>{
|
|
87
|
+
if (isMoving) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const destinationFolderId = destination === '' ? null : Number(destination);
|
|
91
|
+
try {
|
|
92
|
+
await bulkMove({
|
|
93
|
+
fileIds: Array.from(selectedIds),
|
|
94
|
+
folderIds: Array.from(selectedFolderIds),
|
|
95
|
+
destinationFolderId
|
|
96
|
+
}).unwrap();
|
|
97
|
+
} catch (error) {
|
|
98
|
+
// Keep the modal open and the selection intact so the user can retry
|
|
99
|
+
// (e.g. after picking a valid destination) or cancel. Surface the server
|
|
100
|
+
// message when there is one — it carries actionable causes like moving a
|
|
101
|
+
// folder into its own descendant or a name collision in the destination.
|
|
102
|
+
toggleNotification({
|
|
103
|
+
type: 'danger',
|
|
104
|
+
message: getBulkMoveErrorMessage(error, formatMessage({
|
|
105
|
+
id: getTranslationKey('list.bulk-actions.move.error'),
|
|
106
|
+
defaultMessage: 'An error occurred while moving the items.'
|
|
107
|
+
}))
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const sourceName = currentFolderId === null ? rootLabel : currentFolder?.name ?? rootLabel;
|
|
112
|
+
const destinationName = destinationFolderId === null ? rootLabel : destinationOptions.find((option)=>option.id === destinationFolderId)?.label ?? rootLabel;
|
|
113
|
+
toggleNotification({
|
|
114
|
+
type: 'success',
|
|
115
|
+
message: formatMessage({
|
|
116
|
+
id: getTranslationKey('list.bulk-actions.move.success'),
|
|
117
|
+
defaultMessage: '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}'
|
|
118
|
+
}, {
|
|
119
|
+
count,
|
|
120
|
+
source: sourceName,
|
|
121
|
+
destination: destinationName
|
|
122
|
+
})
|
|
123
|
+
});
|
|
124
|
+
clear();
|
|
125
|
+
onClose();
|
|
126
|
+
};
|
|
127
|
+
return /*#__PURE__*/ jsx(Modal.Root, {
|
|
128
|
+
open: open,
|
|
129
|
+
onOpenChange: (nextOpen)=>{
|
|
130
|
+
// The modal must stay open while the request runs — the loader on the
|
|
131
|
+
// Move button is the source of truth for the pending state.
|
|
132
|
+
if (!nextOpen && !isMoving) {
|
|
133
|
+
onClose();
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
children: /*#__PURE__*/ jsxs(StyledModalContent, {
|
|
137
|
+
children: [
|
|
138
|
+
/*#__PURE__*/ jsx(Modal.Header, {
|
|
139
|
+
children: /*#__PURE__*/ jsx(Modal.Title, {
|
|
140
|
+
children: formatMessage({
|
|
141
|
+
id: getTranslationKey('list.bulk-actions.move.title'),
|
|
142
|
+
defaultMessage: 'Move elements to'
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
}),
|
|
146
|
+
/*#__PURE__*/ jsx(Modal.Body, {
|
|
147
|
+
children: /*#__PURE__*/ jsxs(Field.Root, {
|
|
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
|
+
})
|
|
173
|
+
}),
|
|
174
|
+
/*#__PURE__*/ jsx(Modal.Footer, {
|
|
175
|
+
children: /*#__PURE__*/ jsxs(Flex, {
|
|
176
|
+
gap: 2,
|
|
177
|
+
justifyContent: "space-between",
|
|
178
|
+
width: "100%",
|
|
179
|
+
children: [
|
|
180
|
+
/*#__PURE__*/ jsx(Button, {
|
|
181
|
+
variant: "tertiary",
|
|
182
|
+
onClick: onClose,
|
|
183
|
+
disabled: isMoving,
|
|
184
|
+
type: "button",
|
|
185
|
+
children: formatMessage({
|
|
186
|
+
id: 'app.components.Button.cancel',
|
|
187
|
+
defaultMessage: 'Cancel'
|
|
188
|
+
})
|
|
189
|
+
}),
|
|
190
|
+
/*#__PURE__*/ jsx(Button, {
|
|
191
|
+
onClick: handleMove,
|
|
192
|
+
loading: isMoving,
|
|
193
|
+
children: formatMessage({
|
|
194
|
+
id: getTranslationKey('list.bulk-actions.move.submit'),
|
|
195
|
+
defaultMessage: 'Move'
|
|
196
|
+
})
|
|
197
|
+
})
|
|
198
|
+
]
|
|
199
|
+
})
|
|
200
|
+
})
|
|
201
|
+
]
|
|
202
|
+
})
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
export { BulkMoveDialog };
|
|
207
|
+
//# sourceMappingURL=BulkMoveDialog.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var designSystem = require('@strapi/design-system');
|
|
6
|
+
var icons = require('@strapi/icons');
|
|
7
|
+
var reactIntl = require('react-intl');
|
|
8
|
+
var styledComponents = require('styled-components');
|
|
9
|
+
var translations = require('../../../utils/translations.js');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Month-grid range picker: first click sets the start, second click the end
|
|
13
|
+
* (clicks are reordered when the second date is before the first). The DS only
|
|
14
|
+
* ships a single-value DatePicker, so the range grid is built locally.
|
|
15
|
+
*
|
|
16
|
+
* Month/year move via chevrons rather than the mock's dropdowns — nested
|
|
17
|
+
* popovers inside a dropdown menu fight Radix's outside-interaction handling.
|
|
18
|
+
*/ const DayCell = styledComponents.styled.button`
|
|
19
|
+
width: 3rem;
|
|
20
|
+
height: 3rem;
|
|
21
|
+
border: none;
|
|
22
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
font: inherit;
|
|
25
|
+
color: ${({ theme, $isEdge, $isMuted })=>{
|
|
26
|
+
if ($isEdge) return theme.colors.primary600;
|
|
27
|
+
if ($isMuted) return theme.colors.neutral400;
|
|
28
|
+
return theme.colors.neutral800;
|
|
29
|
+
}};
|
|
30
|
+
background: ${({ theme, $inRange, $isEdge })=>{
|
|
31
|
+
if ($isEdge) return theme.colors.primary200;
|
|
32
|
+
if ($inRange) return theme.colors.primary100;
|
|
33
|
+
return 'transparent';
|
|
34
|
+
}};
|
|
35
|
+
|
|
36
|
+
&:hover {
|
|
37
|
+
background: ${({ theme })=>theme.colors.primary100};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&:focus-visible {
|
|
41
|
+
outline: 2px solid ${({ theme })=>theme.colors.primary600};
|
|
42
|
+
outline-offset: -2px;
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
const toKey = (date)=>{
|
|
46
|
+
const month = `${date.getMonth() + 1}`.padStart(2, '0');
|
|
47
|
+
const day = `${date.getDate()}`.padStart(2, '0');
|
|
48
|
+
return `${date.getFullYear()}-${month}-${day}`;
|
|
49
|
+
};
|
|
50
|
+
const fromKey = (key)=>{
|
|
51
|
+
const [year, month, day] = key.split('-').map(Number);
|
|
52
|
+
return new Date(year, month - 1, day);
|
|
53
|
+
};
|
|
54
|
+
/** Monday-first weeks covering the given month, padded with adjacent days. */ const buildWeeks = (year, month)=>{
|
|
55
|
+
const first = new Date(year, month, 1);
|
|
56
|
+
const start = new Date(first.getTime());
|
|
57
|
+
start.setDate(first.getDate() - (first.getDay() + 6) % 7);
|
|
58
|
+
const weeks = [];
|
|
59
|
+
const cursor = new Date(start.getTime());
|
|
60
|
+
do {
|
|
61
|
+
const week = [];
|
|
62
|
+
for(let i = 0; i < 7; i += 1){
|
|
63
|
+
week.push(new Date(cursor.getTime()));
|
|
64
|
+
cursor.setDate(cursor.getDate() + 1);
|
|
65
|
+
}
|
|
66
|
+
weeks.push(week);
|
|
67
|
+
}while (cursor.getMonth() === month && cursor.getFullYear() === year)
|
|
68
|
+
return weeks;
|
|
69
|
+
};
|
|
70
|
+
const DateRangeCalendar = ({ from, to, onSelect })=>{
|
|
71
|
+
const { formatMessage, formatDate } = reactIntl.useIntl();
|
|
72
|
+
const initialMonth = from ? fromKey(from) : new Date();
|
|
73
|
+
const [viewYear, setViewYear] = React.useState(initialMonth.getFullYear());
|
|
74
|
+
const [viewMonth, setViewMonth] = React.useState(initialMonth.getMonth());
|
|
75
|
+
// In-progress selection: set on the first click, cleared on commit.
|
|
76
|
+
const [pendingStart, setPendingStart] = React.useState(null);
|
|
77
|
+
const rangeStart = pendingStart ?? from ?? null;
|
|
78
|
+
const rangeEnd = pendingStart ? null : to ?? null;
|
|
79
|
+
const moveMonth = (delta)=>{
|
|
80
|
+
const next = new Date(viewYear, viewMonth + delta, 1);
|
|
81
|
+
setViewYear(next.getFullYear());
|
|
82
|
+
setViewMonth(next.getMonth());
|
|
83
|
+
};
|
|
84
|
+
const handleDayClick = (day)=>{
|
|
85
|
+
const key = toKey(day);
|
|
86
|
+
if (!pendingStart) {
|
|
87
|
+
setPendingStart(key);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const [start, end] = key < pendingStart ? [
|
|
91
|
+
key,
|
|
92
|
+
pendingStart
|
|
93
|
+
] : [
|
|
94
|
+
pendingStart,
|
|
95
|
+
key
|
|
96
|
+
];
|
|
97
|
+
setPendingStart(null);
|
|
98
|
+
onSelect(start, end);
|
|
99
|
+
};
|
|
100
|
+
const weeks = buildWeeks(viewYear, viewMonth);
|
|
101
|
+
const weekDayLabels = weeks[0].map((day)=>formatDate(day, {
|
|
102
|
+
weekday: 'short'
|
|
103
|
+
}).slice(0, 2));
|
|
104
|
+
return(// role="group" (not "application"): these are plain buttons — hijacking
|
|
105
|
+
// the screen reader's own key handling would take away navigation and
|
|
106
|
+
// give nothing back.
|
|
107
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
|
|
108
|
+
padding: 2,
|
|
109
|
+
width: "100%",
|
|
110
|
+
role: "group",
|
|
111
|
+
"aria-label": formatMessage({
|
|
112
|
+
id: translations.getTranslationKey('list.filters.calendar.label'),
|
|
113
|
+
defaultMessage: 'Select date range'
|
|
114
|
+
}),
|
|
115
|
+
"data-testid": "date-range-calendar",
|
|
116
|
+
children: [
|
|
117
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
118
|
+
justifyContent: "space-between",
|
|
119
|
+
alignItems: "center",
|
|
120
|
+
paddingBottom: 2,
|
|
121
|
+
children: [
|
|
122
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
123
|
+
variant: "ghost",
|
|
124
|
+
label: formatMessage({
|
|
125
|
+
id: translations.getTranslationKey('list.filters.calendar.previous-month'),
|
|
126
|
+
defaultMessage: 'Previous month'
|
|
127
|
+
}),
|
|
128
|
+
onClick: ()=>moveMonth(-1),
|
|
129
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronLeft, {})
|
|
130
|
+
}),
|
|
131
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
132
|
+
fontWeight: "semiBold",
|
|
133
|
+
textColor: "neutral800",
|
|
134
|
+
children: formatDate(new Date(viewYear, viewMonth, 1), {
|
|
135
|
+
month: 'long',
|
|
136
|
+
year: 'numeric'
|
|
137
|
+
})
|
|
138
|
+
}),
|
|
139
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
140
|
+
variant: "ghost",
|
|
141
|
+
label: formatMessage({
|
|
142
|
+
id: translations.getTranslationKey('list.filters.calendar.next-month'),
|
|
143
|
+
defaultMessage: 'Next month'
|
|
144
|
+
}),
|
|
145
|
+
onClick: ()=>moveMonth(1),
|
|
146
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronRight, {})
|
|
147
|
+
})
|
|
148
|
+
]
|
|
149
|
+
}),
|
|
150
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
151
|
+
children: weekDayLabels.map((label, index)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
152
|
+
width: "3rem",
|
|
153
|
+
height: "2.4rem",
|
|
154
|
+
justifyContent: "center",
|
|
155
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
156
|
+
variant: "pi",
|
|
157
|
+
fontWeight: "semiBold",
|
|
158
|
+
textColor: "neutral600",
|
|
159
|
+
children: label
|
|
160
|
+
})
|
|
161
|
+
}, index))
|
|
162
|
+
}),
|
|
163
|
+
weeks.map((week, weekIndex)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
164
|
+
children: week.map((day)=>{
|
|
165
|
+
const key = toKey(day);
|
|
166
|
+
const isEdge = key === rangeStart || key === rangeEnd;
|
|
167
|
+
const inRange = rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;
|
|
168
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(DayCell, {
|
|
169
|
+
type: "button",
|
|
170
|
+
$isEdge: isEdge,
|
|
171
|
+
$inRange: inRange,
|
|
172
|
+
$isMuted: day.getMonth() !== viewMonth,
|
|
173
|
+
onClick: ()=>handleDayClick(day),
|
|
174
|
+
children: [
|
|
175
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
|
|
176
|
+
children: formatDate(day, {
|
|
177
|
+
dateStyle: 'long'
|
|
178
|
+
})
|
|
179
|
+
}),
|
|
180
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
181
|
+
"aria-hidden": true,
|
|
182
|
+
children: day.getDate()
|
|
183
|
+
})
|
|
184
|
+
]
|
|
185
|
+
}, key);
|
|
186
|
+
})
|
|
187
|
+
}, weekIndex))
|
|
188
|
+
]
|
|
189
|
+
}));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
exports.DateRangeCalendar = DateRangeCalendar;
|
|
193
|
+
//# sourceMappingURL=DateRangeCalendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateRangeCalendar.js","sources":["../../../../../../admin/src/future/pages/Assets/components/DateRangeCalendar.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box, Flex, IconButton, Typography, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\n/**\n * Month-grid range picker: first click sets the start, second click the end\n * (clicks are reordered when the second date is before the first). The DS only\n * ships a single-value DatePicker, so the range grid is built locally.\n *\n * Month/year move via chevrons rather than the mock's dropdowns — nested\n * popovers inside a dropdown menu fight Radix's outside-interaction handling.\n */\n\nconst DayCell = styled.button<{ $inRange?: boolean; $isEdge?: boolean; $isMuted?: boolean }>`\n width: 3rem;\n height: 3rem;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n font: inherit;\n color: ${({ theme, $isEdge, $isMuted }) => {\n if ($isEdge) return theme.colors.primary600;\n if ($isMuted) return theme.colors.neutral400;\n return theme.colors.neutral800;\n }};\n background: ${({ theme, $inRange, $isEdge }) => {\n if ($isEdge) return theme.colors.primary200;\n if ($inRange) return theme.colors.primary100;\n return 'transparent';\n }};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst toKey = (date: Date): string => {\n const month = `${date.getMonth() + 1}`.padStart(2, '0');\n const day = `${date.getDate()}`.padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst fromKey = (key: string): Date => {\n const [year, month, day] = key.split('-').map(Number);\n return new Date(year, month - 1, day);\n};\n\n/** Monday-first weeks covering the given month, padded with adjacent days. */\nconst buildWeeks = (year: number, month: number): Date[][] => {\n const first = new Date(year, month, 1);\n const start = new Date(first.getTime());\n start.setDate(first.getDate() - ((first.getDay() + 6) % 7));\n\n const weeks: Date[][] = [];\n const cursor = new Date(start.getTime());\n\n do {\n const week: Date[] = [];\n for (let i = 0; i < 7; i += 1) {\n week.push(new Date(cursor.getTime()));\n cursor.setDate(cursor.getDate() + 1);\n }\n weeks.push(week);\n } while (cursor.getMonth() === month && cursor.getFullYear() === year);\n\n return weeks;\n};\n\ninterface DateRangeCalendarProps {\n /** `YYYY-MM-DD`, both set when editing an existing range badge. */\n from?: string;\n to?: string;\n onSelect: (from: string, to: string) => void;\n}\n\nexport const DateRangeCalendar = ({ from, to, onSelect }: DateRangeCalendarProps) => {\n const { formatMessage, formatDate } = useIntl();\n\n const initialMonth = from ? fromKey(from) : new Date();\n const [viewYear, setViewYear] = useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = useState(initialMonth.getMonth());\n // In-progress selection: set on the first click, cleared on commit.\n const [pendingStart, setPendingStart] = useState<string | null>(null);\n\n const rangeStart = pendingStart ?? from ?? null;\n const rangeEnd = pendingStart ? null : (to ?? null);\n\n const moveMonth = (delta: number) => {\n const next = new Date(viewYear, viewMonth + delta, 1);\n setViewYear(next.getFullYear());\n setViewMonth(next.getMonth());\n };\n\n const handleDayClick = (day: Date) => {\n const key = toKey(day);\n\n if (!pendingStart) {\n setPendingStart(key);\n return;\n }\n\n const [start, end] = key < pendingStart ? [key, pendingStart] : [pendingStart, key];\n setPendingStart(null);\n onSelect(start, end);\n };\n\n const weeks = buildWeeks(viewYear, viewMonth);\n const weekDayLabels = weeks[0].map((day) => formatDate(day, { weekday: 'short' }).slice(0, 2));\n\n return (\n // role=\"group\" (not \"application\"): these are plain buttons — hijacking\n // the screen reader's own key handling would take away navigation and\n // give nothing back.\n <Box\n padding={2}\n width=\"100%\"\n role=\"group\"\n aria-label={formatMessage({\n id: getTranslationKey('list.filters.calendar.label'),\n defaultMessage: 'Select date range',\n })}\n data-testid=\"date-range-calendar\"\n >\n <Flex justifyContent=\"space-between\" alignItems=\"center\" paddingBottom={2}>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.previous-month'),\n defaultMessage: 'Previous month',\n })}\n onClick={() => moveMonth(-1)}\n >\n <ChevronLeft />\n </IconButton>\n <Typography fontWeight=\"semiBold\" textColor=\"neutral800\">\n {formatDate(new Date(viewYear, viewMonth, 1), { month: 'long', year: 'numeric' })}\n </Typography>\n <IconButton\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('list.filters.calendar.next-month'),\n defaultMessage: 'Next month',\n })}\n onClick={() => moveMonth(1)}\n >\n <ChevronRight />\n </IconButton>\n </Flex>\n\n <Flex>\n {weekDayLabels.map((label, index) => (\n <Flex key={index} width=\"3rem\" height=\"2.4rem\" justifyContent=\"center\">\n <Typography variant=\"pi\" fontWeight=\"semiBold\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Flex>\n ))}\n </Flex>\n\n {weeks.map((week, weekIndex) => (\n <Flex key={weekIndex}>\n {week.map((day) => {\n const key = toKey(day);\n const isEdge = key === rangeStart || key === rangeEnd;\n const inRange =\n rangeStart !== null && rangeEnd !== null && key > rangeStart && key < rangeEnd;\n\n return (\n <DayCell\n key={key}\n type=\"button\"\n $isEdge={isEdge}\n $inRange={inRange}\n $isMuted={day.getMonth() !== viewMonth}\n onClick={() => handleDayClick(day)}\n >\n <VisuallyHidden>{formatDate(day, { dateStyle: 'long' })}</VisuallyHidden>\n <span aria-hidden>{day.getDate()}</span>\n </DayCell>\n );\n })}\n </Flex>\n ))}\n </Box>\n );\n};\n"],"names":["DayCell","styled","button","theme","borderRadius","$isEdge","$isMuted","colors","primary600","neutral400","neutral800","$inRange","primary200","primary100","toKey","date","month","getMonth","padStart","day","getDate","getFullYear","fromKey","key","year","split","map","Number","Date","buildWeeks","first","start","getTime","setDate","getDay","weeks","cursor","week","i","push","DateRangeCalendar","from","to","onSelect","formatMessage","formatDate","useIntl","initialMonth","viewYear","setViewYear","useState","viewMonth","setViewMonth","pendingStart","setPendingStart","rangeStart","rangeEnd","moveMonth","delta","next","handleDayClick","end","weekDayLabels","weekday","slice","_jsxs","Box","padding","width","role","aria-label","id","getTranslationKey","defaultMessage","data-testid","Flex","justifyContent","alignItems","paddingBottom","_jsx","IconButton","variant","label","onClick","ChevronLeft","Typography","fontWeight","textColor","ChevronRight","index","height","weekIndex","isEdge","inRange","type","VisuallyHidden","dateStyle","span","aria-hidden"],"mappings":"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"}
|