@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
|
@@ -3,8 +3,12 @@ import * as Dialog from '@radix-ui/react-dialog';
|
|
|
3
3
|
import { FlexProps } from '@strapi/design-system';
|
|
4
4
|
/** Duration of the close animation in ms. Use for timing cleanup (e.g. removing URL params). */
|
|
5
5
|
export declare const DRAWER_CLOSE_ANIMATION_MS = 300;
|
|
6
|
-
interface DrawerBodyProps extends FlexProps {
|
|
6
|
+
interface DrawerBodyProps extends Omit<FlexProps, 'width' | 'maxHeight'> {
|
|
7
7
|
animationDirection?: 'up' | 'left';
|
|
8
|
+
/** Width of the panel from the medium breakpoint up. Mobile is always full-bleed. */
|
|
9
|
+
width?: string;
|
|
10
|
+
/** Cap on the panel height. Defaults to the dynamic viewport height. */
|
|
11
|
+
maxHeight?: string;
|
|
8
12
|
children: React.ReactNode;
|
|
9
13
|
}
|
|
10
14
|
interface DrawerRootProps {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the replace flow will actually regenerate AI metadata, so the UI only
|
|
3
|
+
* promises it when it happens.
|
|
4
|
+
*
|
|
5
|
+
* Two independent gates, both required — `GET /upload/settings` returns the
|
|
6
|
+
* stored `aiMetadata` toggle on its own, which stays `true` (its default) on
|
|
7
|
+
* licenses without AI, so the setting alone over-promises. The server's own
|
|
8
|
+
* check (`aiMetadata.isEnabled()`) ANDs the same two conditions.
|
|
9
|
+
*
|
|
10
|
+
* Pass `{ mime }` to add the third gate the replace flow applies: it only
|
|
11
|
+
* regenerates metadata for images the AI provider can read
|
|
12
|
+
* (`admin-upload.replaceFile` → `aiMetadata.processFiles`, which filters on this
|
|
13
|
+
* same allowlist). Promising it for a PDF — or for a GIF, which clears the
|
|
14
|
+
* server's looser `image/*` gate but is skipped by the provider — would describe
|
|
15
|
+
* something that never happens.
|
|
16
|
+
*
|
|
17
|
+
* The argument is an object rather than a bare `mime` so the two intents stay
|
|
18
|
+
* distinguishable: `File.mime` is optional on the contract, so a positional
|
|
19
|
+
* parameter let `useAIMetadataEnabled(asset.mime)` collapse into the ungated
|
|
20
|
+
* call whenever the mime was missing — silently taking the permissive path this
|
|
21
|
+
* hook exists to close. `useAIMetadataEnabled({ mime: undefined })` still gates
|
|
22
|
+
* (and fails closed); only an omitted `options` skips the mime check.
|
|
23
|
+
*/
|
|
24
|
+
export declare const useAIMetadataEnabled: (options?: {
|
|
25
|
+
mime?: string | null;
|
|
26
|
+
}) => boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC gate for the future Media Library UI. Mirrors the legacy hook of the
|
|
3
|
+
* same name: the server already enforces every action route-side (assets and
|
|
4
|
+
* folder operations share the asset permissions — folder create requires
|
|
5
|
+
* `assets.create`, folder rename/move/delete require `assets.update`); this
|
|
6
|
+
* hook is what keeps the UI honest so users don't discover a missing
|
|
7
|
+
* permission through a 403.
|
|
8
|
+
*
|
|
9
|
+
* - `canCreate` — upload (files, from URL) and New folder
|
|
10
|
+
* - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete
|
|
11
|
+
* (single + bulk), AI metadata — the `assets.update` action covers
|
|
12
|
+
* "Update (crop, details, replace) + delete" by definition
|
|
13
|
+
* - `canDownload` / `canCopyLink` — the matching drawer actions
|
|
14
|
+
*/
|
|
15
|
+
export declare const useMediaLibraryPermissions: () => {
|
|
16
|
+
isLoading: boolean;
|
|
17
|
+
canCreate: boolean;
|
|
18
|
+
canUpdate: boolean;
|
|
19
|
+
canDownload: boolean;
|
|
20
|
+
canCopyLink: boolean;
|
|
21
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Menu } from '@strapi/design-system';
|
|
2
|
+
/**
|
|
3
|
+
* `Menu.Content` for the row-level "..." menus, with the design system's height
|
|
4
|
+
* clamp replaced by a viewport-aware one.
|
|
5
|
+
*
|
|
6
|
+
* The DS caps its menus at a flat `15rem` and hides the scrollbar
|
|
7
|
+
* (`scrollbar-width: none` + `::-webkit-scrollbar { display: none }`). Under a
|
|
8
|
+
* last-row trigger that clamp cut items off with nothing on screen to hint they
|
|
9
|
+
* were there — Delete simply wasn't reachable.
|
|
10
|
+
*
|
|
11
|
+
* Raising the cap to `fit-content` fixed that, but it removes the fallback too:
|
|
12
|
+
* the box then grows to its content and the DS's `overflow: auto` can never
|
|
13
|
+
* fire. At 200% zoom or in a short window the menu ends up taller than the
|
|
14
|
+
* viewport with no way to scroll it — the same items-you-can't-reach bug, moved
|
|
15
|
+
* to a different trigger condition (WCAG 1.4.4 / 1.4.10).
|
|
16
|
+
*
|
|
17
|
+
* So cap to the space Radix measured instead. `--radix-popper-available-height`
|
|
18
|
+
* is set on the content element by `@radix-ui/react-popper`, and the DS mounts
|
|
19
|
+
* this box as the popper content (`asChild`), so it resolves here. The fallback
|
|
20
|
+
* in `min()` covers the first paint, before the property is written. Radix's
|
|
21
|
+
* collision flip still picks the side with more room; this only decides what
|
|
22
|
+
* happens when neither side has enough. The scrollbar is un-hidden so the
|
|
23
|
+
* overflow is visible when it does happen.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ActionsMenuContent: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<Omit<Omit<Menu.ContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
26
|
+
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
27
|
+
}, "key" | "id" | "slot" | "style" | "title" | "children" | keyof import("@strapi/design-system").TransientBoxProps | "ref" | keyof import("@strapi/design-system").TransientFlexProps | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | keyof import("@strapi/design-system/dist/types").AsProp<"div"> | "onCloseAutoFocus" | "intersectionId" | "popoverPlacement"> & Omit<Omit<Menu.ContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
28
|
+
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
29
|
+
}, "maxHeight"> & Partial<Pick<import("styled-components").FastOmit<Omit<Omit<Menu.ContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
30
|
+
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
31
|
+
}, "key" | "id" | "slot" | "style" | "title" | "children" | keyof import("@strapi/design-system").TransientBoxProps | "ref" | keyof import("@strapi/design-system").TransientFlexProps | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "nonce" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | keyof import("@strapi/design-system/dist/types").AsProp<"div"> | "onCloseAutoFocus" | "intersectionId" | "popoverPlacement"> & Omit<Omit<Menu.ContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
|
|
32
|
+
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
|
|
33
|
+
}, "maxHeight">>> & string & Omit<import("react").ForwardRefExoticComponent<Omit<Menu.ContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>, keyof import("react").Component<any, {}, any>>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { File } from '../../../../../../shared/contracts/files';
|
|
2
|
+
import type { DragFileData } from '../../../types/dnd';
|
|
3
|
+
interface AssetActionsMenuProps {
|
|
4
|
+
asset: File;
|
|
5
|
+
/** Drag data for this asset, so the move dialog validates against its real folder. */
|
|
6
|
+
dragData: DragFileData;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The "..." menu on an asset row/card. Always acts on that one asset, whatever
|
|
10
|
+
* the current multi-selection is (the bulk actions bar is the selection-scoped
|
|
11
|
+
* affordance) — the file mirror of `FolderActionsMenu`.
|
|
12
|
+
*
|
|
13
|
+
* Replace / copy link / download duplicate what the details drawer offers as
|
|
14
|
+
* icon buttons, so the same action is one click away without opening the asset
|
|
15
|
+
* first. They are re-implemented rather than lifted out of the drawer: the
|
|
16
|
+
* drawer versions render as `IconButton`s and report through its in-drawer toast
|
|
17
|
+
* slot, neither of which fits a menu item on a row.
|
|
18
|
+
*
|
|
19
|
+
* Any successful move or delete clears the whole selection: a delete only
|
|
20
|
+
* invalidates RTK tags, so without it an `asset:<id>` key for a file that no
|
|
21
|
+
* longer exists would linger in the selection.
|
|
22
|
+
*/
|
|
23
|
+
export declare const AssetActionsMenu: ({ asset, dragData }: AssetActionsMenuProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
24
|
+
export {};
|
|
@@ -5,6 +5,12 @@ interface AssetCropEditorProps {
|
|
|
5
5
|
onClose: () => void;
|
|
6
6
|
onApply: (file: globalThis.File, focalPoint: FocalPoint) => void;
|
|
7
7
|
onSaveAsCopy: (file: globalThis.File, focalPoint: FocalPoint) => void;
|
|
8
|
+
/**
|
|
9
|
+
* "Save as copy" creates a new asset (`assets.create`), a different permission
|
|
10
|
+
* from cropping in place (`assets.update`). Hidden when the user lacks it, so
|
|
11
|
+
* an update-only role can't trigger a 403.
|
|
12
|
+
*/
|
|
13
|
+
canSaveAsCopy: boolean;
|
|
8
14
|
}
|
|
9
|
-
export declare const AssetCropEditor: ({ asset, isBusy, onClose, onApply, onSaveAsCopy, }: AssetCropEditorProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare const AssetCropEditor: ({ asset, isBusy, onClose, onApply, onSaveAsCopy, canSaveAsCopy, }: AssetCropEditorProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
16
|
export {};
|
|
@@ -21,6 +21,22 @@ export declare const useAssetDetailsParam: () => {
|
|
|
21
21
|
openDetails: (id: number) => void;
|
|
22
22
|
closeDetails: () => void;
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Map the drawer-scoped mutation flags to a single i18n message for the busy
|
|
26
|
+
* overlay loader. Returns `null` when nothing is in flight.
|
|
27
|
+
*
|
|
28
|
+
* Exported for the unit test: the branch order only matters when two flags are
|
|
29
|
+
* true at once, which the UI makes hard to stage through the rendered drawer
|
|
30
|
+
* (each trigger disables itself while its own mutation runs).
|
|
31
|
+
*/
|
|
32
|
+
export declare const getBusyMessage: (state: {
|
|
33
|
+
isDeleting: boolean;
|
|
34
|
+
isReplacing: boolean;
|
|
35
|
+
isCropCopying: boolean;
|
|
36
|
+
}) => {
|
|
37
|
+
id: string;
|
|
38
|
+
defaultMessage: string;
|
|
39
|
+
} | null;
|
|
24
40
|
interface AssetDetailsProps {
|
|
25
41
|
asset: AssetWithPopulatedCreatedBy;
|
|
26
42
|
closeDetails: () => void;
|
|
@@ -1 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ItemLocations } from '../../../utils/itemLocations';
|
|
2
|
+
import type { File } from '../../../../../../shared/contracts/files';
|
|
3
|
+
interface BulkActionsBarProps {
|
|
4
|
+
/**
|
|
5
|
+
* The assets currently rendered in the list, used to resolve the mime types
|
|
6
|
+
* of the selection — the bar needs them to know which selected assets the AI
|
|
7
|
+
* provider can actually read.
|
|
8
|
+
*
|
|
9
|
+
* Selection is page-scoped and cleared whenever the list identity changes, so
|
|
10
|
+
* every selected asset id is guaranteed to appear here.
|
|
11
|
+
*/
|
|
12
|
+
assets?: File[];
|
|
13
|
+
/**
|
|
14
|
+
* Real location of every loaded row, so the move dialog validates each
|
|
15
|
+
* selected item against its own parent. Defaults to a lookup that misses
|
|
16
|
+
* everything, which falls back to the folder currently open.
|
|
17
|
+
*/
|
|
18
|
+
locations?: ItemLocations;
|
|
19
|
+
}
|
|
20
|
+
export declare const BulkActionsBar: ({ assets, locations, }: BulkActionsBarProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
21
|
+
export {};
|
|
@@ -1,13 +1,24 @@
|
|
|
1
|
+
import type { DragItemData } from '../../../types/dnd';
|
|
1
2
|
interface BulkMoveDialogProps {
|
|
2
3
|
open: boolean;
|
|
3
4
|
onClose: () => void;
|
|
5
|
+
/**
|
|
6
|
+
* Items to move, as drag data so destination validation sees each item's real
|
|
7
|
+
* parent — the current folder is not a reliable stand-in once results come
|
|
8
|
+
* from a global search.
|
|
9
|
+
*/
|
|
10
|
+
items: DragItemData[];
|
|
11
|
+
onSuccess?: () => void;
|
|
4
12
|
}
|
|
5
13
|
/**
|
|
6
|
-
* "Move elements to" modal
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* folder
|
|
10
|
-
*
|
|
14
|
+
* "Move elements to" modal. Moves the given items (assets and/or folders) into
|
|
15
|
+
* the picked destination folder via `POST /upload/actions/bulk-move`. The
|
|
16
|
+
* mutation invalidates the asset list, folder list and the sidebar
|
|
17
|
+
* folder-structure, so both panes refresh on success. On failure the modal stays
|
|
18
|
+
* open so the user can retry or cancel.
|
|
19
|
+
*
|
|
20
|
+
* Used both by the bulk actions bar (the whole selection) and by a folder's
|
|
21
|
+
* actions menu (that one folder).
|
|
11
22
|
*/
|
|
12
|
-
export declare const BulkMoveDialog: ({ open, onClose }: BulkMoveDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export declare const BulkMoveDialog: ({ open, onClose, items, onSuccess }: BulkMoveDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
24
|
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface BusyOverlayProps {
|
|
2
|
+
/** Shown next to the spinner, and read out as the loader's accessible label. */
|
|
3
|
+
children: string;
|
|
4
|
+
zIndex?: number;
|
|
5
|
+
/** Hides the label, leaving the spinner — for containers too small to fit text. */
|
|
6
|
+
hideLabel?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const BusyOverlay: ({ children, zIndex, hideLabel }: BusyOverlayProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface DateRangeCalendarProps {
|
|
2
|
+
/** `YYYY-MM-DD`, both set when editing an existing range badge. */
|
|
3
|
+
from?: string;
|
|
4
|
+
to?: string;
|
|
5
|
+
onSelect: (from: string, to: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const DateRangeCalendar: ({ from, to, onSelect }: DateRangeCalendarProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface DeleteItemsDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
/** Explicit delete target — assets and/or folders, by id. */
|
|
5
|
+
target: {
|
|
6
|
+
fileIds: number[];
|
|
7
|
+
folderIds: number[];
|
|
8
|
+
};
|
|
9
|
+
/** Called after a successful delete, before the toast. */
|
|
10
|
+
onSuccess?: () => void;
|
|
11
|
+
/**
|
|
12
|
+
* Mirrors the in-flight state out to the caller, so a host that has its own
|
|
13
|
+
* controls (the bulk actions bar) can disable them for the duration.
|
|
14
|
+
*/
|
|
15
|
+
onPendingChange?: (pending: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Confirm dialog for `POST /upload/actions/bulk-delete`. Fully controlled: the
|
|
19
|
+
* caller owns `open` and renders its own trigger. Shared by the bulk actions bar
|
|
20
|
+
* (selection-scoped) and the per-folder actions menu (item-scoped), so the
|
|
21
|
+
* target is always passed in explicitly rather than read from the selection.
|
|
22
|
+
*
|
|
23
|
+
* Deleting a folder cascades server-side, which is why the copy warns about
|
|
24
|
+
* folder contents even for a single item.
|
|
25
|
+
*/
|
|
26
|
+
export declare const DeleteItemsDialog: ({ open, onClose, target, onSuccess, onPendingChange, }: DeleteItemsDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
+
import { type ItemLocations } from '../../../../utils/itemLocations';
|
|
2
3
|
interface AssetsDndContextValue {
|
|
3
4
|
isInternalDragActive: boolean;
|
|
4
5
|
isMovePending: boolean;
|
|
@@ -9,6 +10,12 @@ export declare const useAssetsDnd: () => AssetsDndContextValue;
|
|
|
9
10
|
export declare const useAssetsDndOptional: () => AssetsDndContextValue | null;
|
|
10
11
|
interface AssetsDndProviderProps {
|
|
11
12
|
children: ReactNode;
|
|
13
|
+
/**
|
|
14
|
+
* Real location of every loaded row, so a multi-item drag validates against
|
|
15
|
+
* each item's own parent. Defaults to a lookup that misses everything, which
|
|
16
|
+
* falls back to the folder currently open.
|
|
17
|
+
*/
|
|
18
|
+
locations?: ItemLocations;
|
|
12
19
|
}
|
|
13
|
-
export declare const AssetsDndProvider: ({ children }: AssetsDndProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare const AssetsDndProvider: ({ children, locations, }: AssetsDndProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
21
|
export {};
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
import { type ItemLocations } from '../../../../utils/itemLocations';
|
|
1
2
|
import { type ItemKey } from '../../utils/selection';
|
|
2
3
|
import type { DragItemData } from '../../../../types/dnd';
|
|
3
4
|
export interface DragSet {
|
|
4
5
|
items: DragItemData[];
|
|
5
6
|
/** True when the active item was already selected — membership is the full selection. */
|
|
6
7
|
fromSelection: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Location of the row the user actually grabbed — the only item in the set
|
|
10
|
+
* whose origin the user can point at. Names the source in the success toast.
|
|
11
|
+
*/
|
|
12
|
+
activeSourceFolderId: number | null;
|
|
13
|
+
/**
|
|
14
|
+
* True when the set spans more than one source folder, which a global search
|
|
15
|
+
* selection can. There is then no single source to name, so the toast has to
|
|
16
|
+
* drop it rather than pick one item's folder and imply the others came from
|
|
17
|
+
* there too.
|
|
18
|
+
*/
|
|
19
|
+
spansMultipleSources: boolean;
|
|
7
20
|
}
|
|
8
21
|
/**
|
|
9
22
|
* Derive the drag payload once at drag start.
|
|
@@ -11,7 +24,9 @@ export interface DragSet {
|
|
|
11
24
|
* - Dragging a selected item moves the complete current selection.
|
|
12
25
|
* - Dragging an unselected item moves only that item.
|
|
13
26
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
27
|
+
* The active item carries its own location on `dragData` (the row it was
|
|
28
|
+
* grabbed from); the rest of the selection is resolved through `locations`.
|
|
29
|
+
* Neither is derived from the folder currently open, because search results are
|
|
30
|
+
* global — see `utils/itemLocations.ts`.
|
|
16
31
|
*/
|
|
17
|
-
export declare const buildDragSet: (activeData: DragItemData, selectedKeys: Set<ItemKey> | undefined,
|
|
32
|
+
export declare const buildDragSet: (activeData: DragItemData, selectedKeys: Set<ItemKey> | undefined, locations: ItemLocations, fallbackFolderId: number | null) => DragSet;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DragFolderData } from '../../../../types/dnd';
|
|
1
|
+
import type { DragFileData, DragFolderData } from '../../../../types/dnd';
|
|
2
2
|
export declare const useFileDraggable: (asset: {
|
|
3
3
|
id: number;
|
|
4
4
|
name: string;
|
|
@@ -6,6 +6,7 @@ export declare const useFileDraggable: (asset: {
|
|
|
6
6
|
id?: number;
|
|
7
7
|
} | null;
|
|
8
8
|
}) => {
|
|
9
|
+
dragData: DragFileData;
|
|
9
10
|
active: import("@dnd-kit/core").Active | null;
|
|
10
11
|
activatorEvent: Event | null;
|
|
11
12
|
activeNodeRect: import("@dnd-kit/core").ClientRect | null;
|
|
@@ -3,8 +3,15 @@ type DropHandler = (files: File[]) => void | Promise<void>;
|
|
|
3
3
|
interface UploadDropZoneProps {
|
|
4
4
|
children: ReactNode;
|
|
5
5
|
onDrop?: DropHandler;
|
|
6
|
+
/**
|
|
7
|
+
* When true, the zone never enters the dragging state and never fires
|
|
8
|
+
* `onDrop` — no overlay, no "drop here" invitation. Used to hide the whole
|
|
9
|
+
* upload affordance from users without `assets.create`, so they don't drag a
|
|
10
|
+
* file onto an inviting target that then silently discards it.
|
|
11
|
+
*/
|
|
12
|
+
disabled?: boolean;
|
|
6
13
|
}
|
|
7
|
-
export declare const UploadDropZoneProvider: ({ children, onDrop }: UploadDropZoneProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare const UploadDropZoneProvider: ({ children, onDrop, disabled, }: UploadDropZoneProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
15
|
export declare const useUploadDropZone: () => {
|
|
9
16
|
isDragging: boolean;
|
|
10
17
|
};
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
interface EmptyStateProps {
|
|
2
2
|
onAddAssets: () => void;
|
|
3
|
+
/**
|
|
4
|
+
* RBAC gate — without `assets.create` the "Add assets" CTA is hidden.
|
|
5
|
+
* Required (not defaulted) so a permission gate can't silently regress to
|
|
6
|
+
* permissive when a future call site forgets to pass it.
|
|
7
|
+
*/
|
|
8
|
+
canAddAssets: boolean;
|
|
9
|
+
searchQuery?: string;
|
|
10
|
+
onClearSearch?: () => void;
|
|
3
11
|
}
|
|
4
12
|
/**
|
|
5
13
|
* Empty state for the assets list (both views) when the current folder holds
|
|
@@ -7,5 +15,14 @@ interface EmptyStateProps {
|
|
|
7
15
|
* as New > File upload; drag-and-drop upload keeps working since the page-wide
|
|
8
16
|
* drop zone wraps this component.
|
|
9
17
|
*/
|
|
10
|
-
export declare const EmptyState: ({ onAddAssets }: EmptyStateProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare const EmptyState: ({ onAddAssets, canAddAssets, searchQuery, onClearSearch, }: EmptyStateProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
interface FilteredEmptyStateProps {
|
|
20
|
+
onClearFilters: () => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Empty state when active filters match nothing (including contradictory
|
|
24
|
+
* badges — allowed by design). Distinct from the no-content state: the library
|
|
25
|
+
* has items, the filters exclude them all.
|
|
26
|
+
*/
|
|
27
|
+
export declare const FilteredEmptyState: ({ onClearFilters }: FilteredEmptyStateProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
28
|
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ListFilters } from '../hooks/useListFilters';
|
|
2
|
+
interface FilterBadgesProps {
|
|
3
|
+
listFilters: ListFilters;
|
|
4
|
+
/** Sticky header is scrolled/compact — reduce the space above the badges. */
|
|
5
|
+
compact?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const FilterBadges: ({ listFilters, compact }: FilterBadgesProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type DateField, type DatePreset, type ListFilters, type TypeValue } from '../hooks/useListFilters';
|
|
2
|
+
import type { MessageDescriptor } from 'react-intl';
|
|
3
|
+
export declare const TYPE_LABELS: Record<TypeValue, MessageDescriptor>;
|
|
4
|
+
export declare const PRESET_LABELS: Record<DatePreset, MessageDescriptor>;
|
|
5
|
+
export declare const DATE_FIELD_LABELS: Record<DateField, MessageDescriptor>;
|
|
6
|
+
/** Every panel of the filter tree shares this fixed width (design). */
|
|
7
|
+
export declare const FILTER_PANEL_WIDTH = "24.2rem";
|
|
8
|
+
interface FilterMenuProps {
|
|
9
|
+
listFilters: ListFilters;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Toolbar "Filter" dropdown. Picking anything ADDS a badge (editing happens on
|
|
13
|
+
* the badge itself, see FilterBadges):
|
|
14
|
+
*
|
|
15
|
+
* - Type → keep-open checkbox list; the badge is created/updated live with the
|
|
16
|
+
* checked set (`is` by default, condition editable on the badge).
|
|
17
|
+
* - Creation date / Last modified → preset list (single pick, `within the
|
|
18
|
+
* last` by default) + "Select date range" (creation date only) opening the
|
|
19
|
+
* range calendar; a completed range adds an `is` range badge.
|
|
20
|
+
*
|
|
21
|
+
* Closing behaviour follows how many values a field can hold: a date is one
|
|
22
|
+
* value, so picking a preset (or committing a range) closes the menu; Type is a
|
|
23
|
+
* set, so it stays open until dismissed.
|
|
24
|
+
*/
|
|
25
|
+
export declare const FilterMenu: ({ listFilters }: FilterMenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Folder } from '../../../../../../shared/contracts/folders';
|
|
2
|
+
import type { DragFolderData } from '../../../types/dnd';
|
|
3
|
+
interface FolderActionsMenuProps {
|
|
4
|
+
folder: Folder;
|
|
5
|
+
/** Drag data for this folder, so the move dialog validates against its real parent. */
|
|
6
|
+
dragData: DragFolderData;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The "..." menu on a folder row/card. Always acts on that one folder, whatever
|
|
10
|
+
* the current multi-selection is (the bulk actions bar is the selection-scoped
|
|
11
|
+
* affordance). It reuses the shared move and delete dialogs, which mount only
|
|
12
|
+
* while open.
|
|
13
|
+
*
|
|
14
|
+
* A successful move or delete clears the whole selection: they only invalidate
|
|
15
|
+
* RTK tags, so without it a `folder:<id>` key for a folder that no longer lives
|
|
16
|
+
* where the selection thinks it does would linger. A rename leaves the id
|
|
17
|
+
* valid, so it deliberately keeps the selection.
|
|
18
|
+
*/
|
|
19
|
+
export declare const FolderActionsMenu: ({ folder, dragData }: FolderActionsMenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface FolderFormDialogBaseProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
/** Sent as `parent`. Create: the folder being created in. Rename: the folder's existing parent. */
|
|
5
|
+
parentFolderId: number | null;
|
|
6
|
+
}
|
|
7
|
+
type FolderFormDialogProps = FolderFormDialogBaseProps & ({
|
|
8
|
+
mode: 'create';
|
|
9
|
+
parentFolderName: string;
|
|
10
|
+
} | {
|
|
11
|
+
mode: 'rename';
|
|
12
|
+
folderId: number;
|
|
13
|
+
initialName: string;
|
|
14
|
+
});
|
|
15
|
+
export declare const FolderFormDialog: (props: FolderFormDialogProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
interface FolderTreeProps {
|
|
2
2
|
currentFolderId: number | null;
|
|
3
|
+
/**
|
|
4
|
+
* Set to `false` while a global asset search is active: the results span the
|
|
5
|
+
* whole library, so highlighting one folder would misrepresent them.
|
|
6
|
+
* */
|
|
7
|
+
showActiveFolder?: boolean;
|
|
3
8
|
onSelectFolder: (folderId: number | null) => void;
|
|
4
9
|
}
|
|
5
10
|
/**
|
|
@@ -7,13 +12,17 @@ interface FolderTreeProps {
|
|
|
7
12
|
* and renders:
|
|
8
13
|
*
|
|
9
14
|
* 1. A "Media library" title
|
|
10
|
-
* 2. A
|
|
11
|
-
* 3. A "
|
|
12
|
-
* 4.
|
|
15
|
+
* 2. A filter input that prunes the tree to matching destinations
|
|
16
|
+
* 3. A "Home" entry that clears the folder query param
|
|
17
|
+
* 4. A "FOLDERS" section header
|
|
18
|
+
* 5. The folder tree itself
|
|
19
|
+
*
|
|
20
|
+
* The filter is purely local: it never touches the URL and never affects the
|
|
21
|
+
* asset list, which has its own independent search in the content toolbar.
|
|
13
22
|
*
|
|
14
23
|
* Presentational with respect to routing — navigation is delegated to the parent
|
|
15
24
|
* via `onSelectFolder` so the URL stays the single source of truth (see
|
|
16
25
|
* `useFolderNavigation`).
|
|
17
26
|
*/
|
|
18
|
-
export declare const FolderTree: ({ currentFolderId, onSelectFolder }: FolderTreeProps) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare const FolderTree: ({ currentFolderId, showActiveFolder, onSelectFolder, }: FolderTreeProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
28
|
export {};
|
|
@@ -12,6 +12,12 @@ interface SortMenuProps {
|
|
|
12
12
|
* option keeps the menu open (`onSelect` preventDefault) so several facets can
|
|
13
13
|
* be tuned in one visit; clicking a checked facet clears it (the hook
|
|
14
14
|
* guarantees at least one sort rule stays active).
|
|
15
|
+
*
|
|
16
|
+
* Each section is single-select, so its items are radios: the checkmark icon is
|
|
17
|
+
* decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`
|
|
18
|
+
* exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element
|
|
19
|
+
* it renders through Radix's `asChild`, where they take precedence over Radix's
|
|
20
|
+
* own `role="menuitem"`.
|
|
15
21
|
*/
|
|
16
22
|
export declare const SortMenu: ({ sort, showFoldersGroup }: SortMenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
23
|
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads and writes the global asset search term held in `?_q=`.
|
|
3
|
+
*
|
|
4
|
+
* Debouncing is the input component's job (see `AssetsSearchInput`) — this hook
|
|
5
|
+
* is a thin URL accessor so every consumer reads the same source of truth.
|
|
6
|
+
*/
|
|
7
|
+
export declare const useAssetSearch: () => {
|
|
8
|
+
searchQuery: string;
|
|
9
|
+
isSearching: boolean;
|
|
10
|
+
setSearchQuery: (value: string) => void;
|
|
11
|
+
clearSearch: () => void;
|
|
12
|
+
};
|
|
@@ -32,8 +32,15 @@ export interface AssetSelection {
|
|
|
32
32
|
}
|
|
33
33
|
interface AssetSelectionProviderProps {
|
|
34
34
|
children: ReactNode;
|
|
35
|
+
/**
|
|
36
|
+
* When true, selection is inert: every mutator is a no-op and nothing ever
|
|
37
|
+
* reads as selected. Every bulk action is gated on `assets.update`, so a user
|
|
38
|
+
* without it has nothing to select for — the views also hide the checkboxes,
|
|
39
|
+
* and this makes the remaining paths (click-to-select, Space key) do nothing.
|
|
40
|
+
*/
|
|
41
|
+
disabled?: boolean;
|
|
35
42
|
}
|
|
36
|
-
export declare const AssetSelectionProvider: ({ children }: AssetSelectionProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<AssetSelection | null>>;
|
|
43
|
+
export declare const AssetSelectionProvider: ({ children, disabled, }: AssetSelectionProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<AssetSelection | null>>;
|
|
37
44
|
export declare const useAssetSelection: () => AssetSelection;
|
|
38
45
|
export declare const useAssetSelectionOptional: () => AssetSelection | null;
|
|
39
46
|
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Which assets have a long-running mutation in flight, so the list can show it
|
|
4
|
+
* on the item itself.
|
|
5
|
+
*
|
|
6
|
+
* The mutation stays where it is triggered — the row's "..." menu — but the
|
|
7
|
+
* feedback has to render on the row or card, which is an ancestor of it. The
|
|
8
|
+
* menu sits in a leaf `<td>` (table) / footer `Flex` (grid), so an overlay
|
|
9
|
+
* mounted there would cover the button and nothing else. Rather than hoist the
|
|
10
|
+
* mutation up into both `AssetRow` and `AssetCard` (duplicating it, and moving
|
|
11
|
+
* it away from the control that owns it), the busy flag travels up through
|
|
12
|
+
* context and the ancestor renders the overlay.
|
|
13
|
+
*
|
|
14
|
+
* Scoped per asset id rather than a single boolean: a replace on one row must
|
|
15
|
+
* not blank out every other row. Modelled on `isMovePending` in
|
|
16
|
+
* `AssetsDndProvider`, which does the same thing for drag-moves — that one is
|
|
17
|
+
* list-wide because a move genuinely blocks the whole list.
|
|
18
|
+
*/
|
|
19
|
+
export interface BusyAssets {
|
|
20
|
+
/** Whether this asset has a mutation in flight. */
|
|
21
|
+
isBusy: (id: number) => boolean;
|
|
22
|
+
/** The message to show while it is, or `null`. */
|
|
23
|
+
getBusyMessage: (id: number) => string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Marks the asset busy and returns the release function. Pair it with
|
|
26
|
+
* `try`/`finally` so the flag clears on failure too.
|
|
27
|
+
*/
|
|
28
|
+
markBusy: (id: number, message: string) => () => void;
|
|
29
|
+
}
|
|
30
|
+
export declare const BusyAssetsProvider: ({ children }: {
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
}) => import("react").FunctionComponentElement<import("react").ProviderProps<BusyAssets | null>>;
|
|
33
|
+
/**
|
|
34
|
+
* Optional by design: `AssetActionsMenu`, `AssetRow` and `AssetCard` are also
|
|
35
|
+
* rendered in tests and in the asset picker, outside this provider. Without it
|
|
36
|
+
* the mutation still runs, it just shows no row-level feedback.
|
|
37
|
+
*/
|
|
38
|
+
export declare const useBusyAssetsOptional: () => BusyAssets | null;
|