@strapi/upload 5.48.1 → 5.50.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/ai/components/AIAssetCard.js +13 -12
- package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
- package/dist/admin/ai/components/AIAssetCard.mjs +11 -11
- package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.js +3 -3
- package/dist/admin/ai/components/AIUploadModal.mjs +0 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.js +3 -4
- package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCard.mjs +4 -5
- package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js +0 -1
- package/dist/admin/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs +0 -1
- package/dist/admin/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js +0 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs +0 -1
- package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.js +6 -6
- package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs +4 -5
- package/dist/admin/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.js +3 -3
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs +0 -1
- package/dist/admin/components/AssetCard/VideoAssetCard.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/AssetDialog.js +3 -3
- package/dist/admin/components/AssetDialog/AssetDialog.mjs +0 -1
- package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js +0 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs +0 -1
- package/dist/admin/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +3 -3
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs +0 -1
- package/dist/admin/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js +3 -2
- package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +3 -3
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs +0 -1
- package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.mjs.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js +0 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.js.map +1 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs +0 -1
- package/dist/admin/components/AssetDialog/SelectedStep/SelectedStep.mjs.map +1 -1
- package/dist/admin/components/AssetGridList/Draggable.js +3 -2
- package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -3
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +0 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +5 -2
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +0 -1
- package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.js +0 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.js.map +1 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs +0 -1
- package/dist/admin/components/CopyLinkButton/CopyLinkButton.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +8 -5
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +0 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +10 -6
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs +4 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js +0 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs +0 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/CroppingActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +0 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +0 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +9 -6
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +3 -4
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +3 -3
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs +0 -1
- package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +8 -5
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs +0 -1
- package/dist/admin/components/EditFolderDialog/EditFolderDialog.mjs.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js +0 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.js.map +1 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs +0 -1
- package/dist/admin/components/EditFolderDialog/ModalHeader/ModalHeader.mjs.map +1 -1
- package/dist/admin/components/FilterPopover/FilterPopover.js +3 -2
- package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.js +3 -2
- package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js +5 -3
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs +2 -1
- package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +3 -4
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +4 -5
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +0 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs +0 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssetActions.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +5 -3
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +2 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +4 -4
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs +2 -3
- package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +4 -3
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/SelectTree/SelectTree.js +7 -3
- package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.js +0 -1
- package/dist/admin/components/SortPicker/SortPicker.js.map +1 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs +0 -1
- package/dist/admin/components/SortPicker/SortPicker.mjs.map +1 -1
- package/dist/admin/components/TableList/CellContent.js +5 -2
- package/dist/admin/components/TableList/CellContent.js.map +1 -1
- package/dist/admin/components/TableList/CellContent.mjs +0 -1
- package/dist/admin/components/TableList/CellContent.mjs.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.js +3 -4
- package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
- package/dist/admin/components/TableList/PreviewCell.mjs +4 -5
- package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
- package/dist/admin/components/TableList/TableList.js +0 -1
- package/dist/admin/components/TableList/TableList.js.map +1 -1
- package/dist/admin/components/TableList/TableList.mjs +0 -1
- package/dist/admin/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/components/TableList/TableRows.js +0 -1
- package/dist/admin/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/components/TableList/TableRows.mjs +0 -1
- package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +0 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs +0 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/AddAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +5 -5
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs +3 -4
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +3 -3
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +0 -1
- package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +3 -3
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs +0 -1
- package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.mjs.map +1 -1
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js +3 -2
- package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
- package/dist/admin/constants.js +4 -7
- package/dist/admin/constants.js.map +1 -1
- package/dist/admin/constants.mjs +4 -7
- package/dist/admin/constants.mjs.map +1 -1
- package/dist/admin/enums.js +14 -16
- package/dist/admin/enums.js.map +1 -1
- package/dist/admin/enums.mjs +13 -15
- package/dist/admin/enums.mjs.map +1 -1
- package/dist/admin/future/components/Drawer.js +4 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.js +29 -4
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +28 -4
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +5 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +2 -2
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +7 -6
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +4 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +2 -2
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +2 -2
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +3 -2
- package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +389 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +387 -0
- package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +3 -2
- package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js +4 -4
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs +4 -4
- package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +48 -2
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +48 -2
- package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/future/services/folders.js +28 -1
- package/dist/admin/future/services/folders.js.map +1 -1
- package/dist/admin/future/services/folders.mjs +28 -2
- package/dist/admin/future/services/folders.mjs.map +1 -1
- package/dist/admin/future/utils/files.js +5 -1
- package/dist/admin/future/utils/files.js.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.js +4 -4
- package/dist/admin/future/utils/getAssetIcon.js.map +1 -1
- package/dist/admin/future/utils/getAssetIcon.mjs +4 -4
- package/dist/admin/future/utils/getAssetIcon.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataJob.js +3 -3
- package/dist/admin/hooks/useAIMetadataJob.mjs +0 -1
- package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -1
- package/dist/admin/hooks/useAssets.js +3 -2
- package/dist/admin/hooks/useAssets.js.map +1 -1
- package/dist/admin/hooks/useBulkEdit.js +0 -1
- package/dist/admin/hooks/useBulkEdit.js.map +1 -1
- package/dist/admin/hooks/useBulkEdit.mjs +0 -1
- package/dist/admin/hooks/useBulkEdit.mjs.map +1 -1
- package/dist/admin/hooks/useBulkMove.js +0 -1
- package/dist/admin/hooks/useBulkMove.js.map +1 -1
- package/dist/admin/hooks/useBulkMove.mjs +0 -1
- package/dist/admin/hooks/useBulkMove.mjs.map +1 -1
- package/dist/admin/hooks/useBulkRemove.js +0 -1
- package/dist/admin/hooks/useBulkRemove.js.map +1 -1
- package/dist/admin/hooks/useBulkRemove.mjs +0 -1
- package/dist/admin/hooks/useBulkRemove.mjs.map +1 -1
- package/dist/admin/hooks/useCropImg.js +7 -3
- package/dist/admin/hooks/useCropImg.js.map +1 -1
- package/dist/admin/hooks/useEditAsset.js +3 -3
- package/dist/admin/hooks/useEditAsset.mjs +0 -1
- package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
- package/dist/admin/hooks/useFolder.js +0 -1
- package/dist/admin/hooks/useFolder.js.map +1 -1
- package/dist/admin/hooks/useFolder.mjs +0 -1
- package/dist/admin/hooks/useFolder.mjs.map +1 -1
- package/dist/admin/hooks/useFolderStructure.js +0 -1
- package/dist/admin/hooks/useFolderStructure.js.map +1 -1
- package/dist/admin/hooks/useFolderStructure.mjs +0 -1
- package/dist/admin/hooks/useFolderStructure.mjs.map +1 -1
- package/dist/admin/hooks/useFolders.js +3 -2
- package/dist/admin/hooks/useFolders.js.map +1 -1
- package/dist/admin/hooks/useModalQueryParams.js +3 -2
- package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
- package/dist/admin/hooks/useSelectionState.js +3 -2
- package/dist/admin/hooks/useSelectionState.js.map +1 -1
- package/dist/admin/hooks/useUpload.js +3 -2
- package/dist/admin/hooks/useUpload.js.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +0 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/App/App.js +3 -3
- package/dist/admin/pages/App/App.mjs +0 -1
- package/dist/admin/pages/App/App.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +7 -4
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +0 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js +0 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs +0 -1
- package/dist/admin/pages/App/ConfigureTheView/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.js +7 -2
- package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary.js +3 -3
- package/dist/admin/pages/App/MediaLibrary.mjs +0 -1
- package/dist/admin/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.js +0 -1
- package/dist/admin/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/pages/App/components/BulkActions.mjs +0 -1
- package/dist/admin/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/pages/App/components/BulkMoveButton.js +3 -2
- package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js +0 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.js.map +1 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs +0 -1
- package/dist/admin/pages/App/components/EmptyOrNoPermissions.mjs.map +1 -1
- package/dist/admin/pages/App/components/Filters.js +3 -3
- package/dist/admin/pages/App/components/Filters.mjs +0 -1
- package/dist/admin/pages/App/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/App/components/Header.js +0 -1
- package/dist/admin/pages/App/components/Header.js.map +1 -1
- package/dist/admin/pages/App/components/Header.mjs +0 -1
- package/dist/admin/pages/App/components/Header.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +7 -4
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +0 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/reducer.js +5 -1
- package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
- package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +11 -12
- package/dist/admin/src/components/EmptyAssets/EmptyAssets.d.ts +0 -1
- package/dist/admin/src/components/FolderCard/contexts/FolderCard.d.ts +2 -3
- package/dist/admin/src/components/MediaLibraryDialog/MediaLibraryDialog.d.ts +2 -1
- package/dist/admin/src/constants.d.ts +5 -4
- package/dist/admin/src/enums.d.ts +14 -12
- package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +19 -0
- package/dist/admin/src/future/pages/Assets/hooks/useFolderNavigation.d.ts +2 -0
- package/dist/admin/src/future/services/folders.d.ts +2 -2
- package/dist/admin/src/future/store/uploadProgress.d.ts +1 -1
- package/dist/admin/src/hooks/useCropImg.d.ts +2 -2
- package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
- package/dist/admin/src/hooks/useModalQueryParams.d.ts +5 -5
- package/dist/admin/src/hooks/usePersistentState.d.ts +0 -1
- package/dist/admin/src/hooks/useSettings.d.ts +5 -5
- package/dist/admin/src/hooks/useTracking.d.ts +1 -1
- package/dist/admin/src/pages/App/ConfigureTheView/state/actions.d.ts +1 -1
- package/dist/admin/src/pages/App/ConfigureTheView/state/init.d.ts +1 -1
- package/dist/admin/src/utils/getBreadcrumbDataML.d.ts +1 -1
- package/dist/admin/src/utils/getFolderParents.d.ts +3 -3
- package/dist/admin/src/utils/icons.d.ts +2 -1
- package/dist/admin/src/utils/rawFileToAsset.d.ts +1 -1
- package/dist/admin/src/utils/urlsToAssets.d.ts +2 -10
- package/dist/admin/translations/en.json.js +10 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +10 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +175 -0
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +175 -0
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/utils/formatBytes.js +5 -1
- package/dist/admin/utils/formatBytes.js.map +1 -1
- package/dist/admin/utils/icons.js +5 -5
- package/dist/admin/utils/icons.js.map +1 -1
- package/dist/admin/utils/icons.mjs +6 -6
- package/dist/admin/utils/icons.mjs.map +1 -1
- package/dist/admin/utils/typeFromMime.js +9 -9
- package/dist/admin/utils/typeFromMime.js.map +1 -1
- package/dist/admin/utils/typeFromMime.mjs +10 -10
- package/dist/admin/utils/typeFromMime.mjs.map +1 -1
- package/dist/admin/utils/urlYupSchema.js +3 -2
- package/dist/admin/utils/urlYupSchema.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.js +1 -2
- package/dist/admin/utils/urlsToAssets.js.map +1 -1
- package/dist/admin/utils/urlsToAssets.mjs +1 -2
- package/dist/admin/utils/urlsToAssets.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +11 -4
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/content-api.js +7 -2
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js +7 -3
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
- package/dist/server/middlewares/upload.js +7 -2
- package/dist/server/middlewares/upload.js.map +1 -1
- package/dist/server/register.js +9 -4
- package/dist/server/register.js.map +1 -1
- package/dist/server/routes/content-api.js +3 -2
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/validation/upload.js +3 -2
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/services/file.js +13 -6
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/image-manipulation.js +18 -12
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/provider.js +24 -0
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs +24 -0
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js +99 -32
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +69 -10
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +4 -12
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder.d.ts +2 -2
- package/dist/server/src/controllers/admin-settings.d.ts +2 -2
- package/dist/server/src/controllers/admin-upload.d.ts +3 -3
- package/dist/server/src/controllers/content-api.d.ts +2 -2
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +14 -23
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/folders.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/configureView.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/folder-file.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/folder-file.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/folder.d.ts +2 -2
- package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/view-configuration.d.ts +1 -1
- package/dist/server/src/graphql.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +37 -53
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/upload.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata-jobs.d.ts +1 -1
- package/dist/server/src/services/ai-metadata-jobs.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
- package/dist/server/src/services/file.d.ts +2 -2
- package/dist/server/src/services/file.d.ts.map +1 -1
- package/dist/server/src/services/folder.d.ts +1 -1
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +23 -30
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/services/provider.d.ts +2 -1
- package/dist/server/src/services/provider.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +4 -3
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/server/src/utils/cron.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
- package/dist/server/utils/mime-validation.js +11 -3
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs +12 -4
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/package.json +9 -9
- package/dist/admin/future/enums.js +0 -12
- package/dist/admin/future/enums.js.map +0 -1
- package/dist/admin/future/enums.mjs +0 -10
- package/dist/admin/future/enums.mjs.map +0 -1
- package/dist/admin/src/future/enums.d.ts +0 -6
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect, useCallback, useRef, useLayoutEffect } from 'react';
|
|
3
|
+
import { Typography, Box, Flex, Loader, IconButton, Tooltip } from '@strapi/design-system';
|
|
4
|
+
import { House, Folder, ChevronDown } from '@strapi/icons';
|
|
5
|
+
import { useIntl } from 'react-intl';
|
|
6
|
+
import { styled } from 'styled-components';
|
|
7
|
+
import { useGetFolderStructureQuery } from '../../../../services/folders.mjs';
|
|
8
|
+
import { getTranslationKey } from '../../../../utils/translations.mjs';
|
|
9
|
+
|
|
10
|
+
/* -------------------------------------------------------------------------------------------------
|
|
11
|
+
* RowButton — shared row styling aligned with admin SubNav.Link
|
|
12
|
+
* -----------------------------------------------------------------------------------------------*/ const RowButton = styled.button`
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
gap: ${({ theme })=>theme.spaces[2]};
|
|
16
|
+
width: 100%;
|
|
17
|
+
min-height: 3.2rem;
|
|
18
|
+
padding: ${({ theme })=>`${theme.spaces[1]} ${theme.spaces[2]}`};
|
|
19
|
+
border: 0;
|
|
20
|
+
background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : 'transparent'};
|
|
21
|
+
color: ${({ $isActive, theme })=>$isActive ? theme.colors.primary700 : theme.colors.neutral800};
|
|
22
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
text-align: left;
|
|
25
|
+
font: inherit;
|
|
26
|
+
|
|
27
|
+
&:hover {
|
|
28
|
+
background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : theme.colors.neutral100};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&:focus-visible {
|
|
32
|
+
outline: 2px solid ${({ theme })=>theme.colors.primary600};
|
|
33
|
+
outline-offset: -2px;
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
/* -------------------------------------------------------------------------------------------------
|
|
37
|
+
* useExpandedFolders — local expand/collapse state
|
|
38
|
+
* -----------------------------------------------------------------------------------------------*/ const findAncestorIds = (nodes, targetId, trail = [])=>{
|
|
39
|
+
for (const node of nodes){
|
|
40
|
+
if (node.id === targetId) {
|
|
41
|
+
return trail;
|
|
42
|
+
}
|
|
43
|
+
if (node.children?.length) {
|
|
44
|
+
const nextTrail = node.id != null ? [
|
|
45
|
+
...trail,
|
|
46
|
+
node.id
|
|
47
|
+
] : trail;
|
|
48
|
+
const found = findAncestorIds(node.children, targetId, nextTrail);
|
|
49
|
+
if (found !== null) {
|
|
50
|
+
return found;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
};
|
|
56
|
+
const useExpandedFolders = (folderStructure, currentFolderId)=>{
|
|
57
|
+
const [expandedIds, setExpandedIds] = useState(()=>new Set());
|
|
58
|
+
useEffect(()=>{
|
|
59
|
+
if (currentFolderId == null) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const ancestors = findAncestorIds(folderStructure, currentFolderId);
|
|
63
|
+
if (!ancestors || ancestors.length === 0) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
setExpandedIds((prev)=>{
|
|
67
|
+
const next = new Set(prev);
|
|
68
|
+
let changed = false;
|
|
69
|
+
for (const id of ancestors){
|
|
70
|
+
if (!next.has(id)) {
|
|
71
|
+
next.add(id);
|
|
72
|
+
changed = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return changed ? next : prev;
|
|
76
|
+
});
|
|
77
|
+
}, [
|
|
78
|
+
folderStructure,
|
|
79
|
+
currentFolderId
|
|
80
|
+
]);
|
|
81
|
+
const toggleExpanded = useCallback((id)=>{
|
|
82
|
+
setExpandedIds((prev)=>{
|
|
83
|
+
const next = new Set(prev);
|
|
84
|
+
if (next.has(id)) {
|
|
85
|
+
next.delete(id);
|
|
86
|
+
} else {
|
|
87
|
+
next.add(id);
|
|
88
|
+
}
|
|
89
|
+
return next;
|
|
90
|
+
});
|
|
91
|
+
}, []);
|
|
92
|
+
const isExpanded = useCallback((id)=>expandedIds.has(id), [
|
|
93
|
+
expandedIds
|
|
94
|
+
]);
|
|
95
|
+
return {
|
|
96
|
+
isExpanded,
|
|
97
|
+
toggleExpanded
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
/* -------------------------------------------------------------------------------------------------
|
|
101
|
+
* TruncatedFolderName — tooltip when the label is ellipsized
|
|
102
|
+
* -----------------------------------------------------------------------------------------------*/ const TruncatedFolderName = ({ name, isActive })=>{
|
|
103
|
+
const textRef = useRef(null);
|
|
104
|
+
const [isTruncated, setIsTruncated] = useState(false);
|
|
105
|
+
useLayoutEffect(()=>{
|
|
106
|
+
const el = textRef.current;
|
|
107
|
+
if (!el) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const checkTruncation = ()=>{
|
|
111
|
+
setIsTruncated(el.scrollWidth > el.clientWidth);
|
|
112
|
+
};
|
|
113
|
+
checkTruncation();
|
|
114
|
+
const observer = new ResizeObserver(checkTruncation);
|
|
115
|
+
observer.observe(el);
|
|
116
|
+
return ()=>observer.disconnect();
|
|
117
|
+
}, [
|
|
118
|
+
name
|
|
119
|
+
]);
|
|
120
|
+
const label = /*#__PURE__*/ jsx(Typography, {
|
|
121
|
+
ref: textRef,
|
|
122
|
+
variant: "omega",
|
|
123
|
+
fontWeight: isActive ? 'semiBold' : 'regular',
|
|
124
|
+
ellipsis: true,
|
|
125
|
+
children: name
|
|
126
|
+
});
|
|
127
|
+
if (isTruncated) {
|
|
128
|
+
return /*#__PURE__*/ jsx(Tooltip, {
|
|
129
|
+
label: name,
|
|
130
|
+
children: label
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return label;
|
|
134
|
+
};
|
|
135
|
+
/* -------------------------------------------------------------------------------------------------
|
|
136
|
+
* NavList — unstyled list for tree rows
|
|
137
|
+
* -----------------------------------------------------------------------------------------------*/ const NavList = styled.ul`
|
|
138
|
+
list-style: none;
|
|
139
|
+
margin: 0;
|
|
140
|
+
padding: 0;
|
|
141
|
+
`;
|
|
142
|
+
/* -------------------------------------------------------------------------------------------------
|
|
143
|
+
* FolderTreeItem — single tree row (internal)
|
|
144
|
+
* -----------------------------------------------------------------------------------------------*/ const INDENT_PER_LEVEL_REM = 1.6;
|
|
145
|
+
const RotatingChevron = styled(ChevronDown)`
|
|
146
|
+
transform: rotate(${({ $expanded })=>$expanded ? '0deg' : '-90deg'});
|
|
147
|
+
transition: transform 0.2s ease;
|
|
148
|
+
`;
|
|
149
|
+
const FolderTreeItem = ({ node, level, currentFolderId, isExpanded, onToggle, onSelect })=>{
|
|
150
|
+
const { formatMessage } = useIntl();
|
|
151
|
+
if (node.id == null) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const id = node.id;
|
|
155
|
+
const name = node.name ?? '';
|
|
156
|
+
const hasChildren = (node.children?.length ?? 0) > 0;
|
|
157
|
+
const isFolderExpanded = isExpanded(id);
|
|
158
|
+
const isActive = currentFolderId === id;
|
|
159
|
+
// TODO: full `role="tree"` + arrow-key treeview navigation before revamp GA
|
|
160
|
+
// if an accessibility audit requires it (CMS-133 v1 is button rows only).
|
|
161
|
+
return /*#__PURE__*/ jsxs("li", {
|
|
162
|
+
children: [
|
|
163
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
164
|
+
alignItems: "center",
|
|
165
|
+
paddingLeft: `${level * INDENT_PER_LEVEL_REM}rem`,
|
|
166
|
+
gap: 1,
|
|
167
|
+
children: [
|
|
168
|
+
/*#__PURE__*/ jsx(IconButton, {
|
|
169
|
+
label: formatMessage({
|
|
170
|
+
id: getTranslationKey(isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'),
|
|
171
|
+
defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}'
|
|
172
|
+
}, {
|
|
173
|
+
name
|
|
174
|
+
}),
|
|
175
|
+
onClick: (event)=>{
|
|
176
|
+
event.stopPropagation();
|
|
177
|
+
onToggle(id);
|
|
178
|
+
},
|
|
179
|
+
variant: "ghost",
|
|
180
|
+
withTooltip: false,
|
|
181
|
+
"aria-expanded": isFolderExpanded,
|
|
182
|
+
children: /*#__PURE__*/ jsx(RotatingChevron, {
|
|
183
|
+
$expanded: isFolderExpanded,
|
|
184
|
+
fill: "neutral500"
|
|
185
|
+
})
|
|
186
|
+
}),
|
|
187
|
+
/*#__PURE__*/ jsx(Box, {
|
|
188
|
+
flex: "1",
|
|
189
|
+
minWidth: 0,
|
|
190
|
+
children: /*#__PURE__*/ jsx(RowButton, {
|
|
191
|
+
type: "button",
|
|
192
|
+
$isActive: isActive,
|
|
193
|
+
"aria-current": isActive ? 'page' : undefined,
|
|
194
|
+
onClick: ()=>onSelect(id),
|
|
195
|
+
"data-testid": `folder-tree-node-${id}`,
|
|
196
|
+
"data-folder-id": id,
|
|
197
|
+
children: /*#__PURE__*/ jsx(TruncatedFolderName, {
|
|
198
|
+
name: name,
|
|
199
|
+
isActive: isActive
|
|
200
|
+
})
|
|
201
|
+
})
|
|
202
|
+
})
|
|
203
|
+
]
|
|
204
|
+
}),
|
|
205
|
+
hasChildren && isFolderExpanded && /*#__PURE__*/ jsx(NavList, {
|
|
206
|
+
children: node.children.map((child)=>/*#__PURE__*/ jsx(FolderTreeItem, {
|
|
207
|
+
node: child,
|
|
208
|
+
level: level + 1,
|
|
209
|
+
currentFolderId: currentFolderId,
|
|
210
|
+
isExpanded: isExpanded,
|
|
211
|
+
onToggle: onToggle,
|
|
212
|
+
onSelect: onSelect
|
|
213
|
+
}, child.id ?? child.name))
|
|
214
|
+
})
|
|
215
|
+
]
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
/* -------------------------------------------------------------------------------------------------
|
|
219
|
+
* FolderTree — public sidebar component
|
|
220
|
+
* -----------------------------------------------------------------------------------------------*/ const SidebarNav = styled(Flex)`
|
|
221
|
+
/* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */
|
|
222
|
+
width: 25.6rem;
|
|
223
|
+
height: 100%;
|
|
224
|
+
min-height: 100%;
|
|
225
|
+
background: ${({ theme })=>theme.colors.neutral0};
|
|
226
|
+
flex-shrink: 0;
|
|
227
|
+
flex-direction: column;
|
|
228
|
+
border-right: 1px solid ${({ theme })=>theme.colors.neutral150};
|
|
229
|
+
`;
|
|
230
|
+
const SidebarHeader = styled(Box)`
|
|
231
|
+
flex-shrink: 0;
|
|
232
|
+
border-bottom: 1px solid ${({ theme })=>theme.colors.neutral150};
|
|
233
|
+
`;
|
|
234
|
+
const SidebarBody = styled(Flex)`
|
|
235
|
+
flex: 1;
|
|
236
|
+
min-height: 0;
|
|
237
|
+
overflow-y: auto;
|
|
238
|
+
`;
|
|
239
|
+
/**
|
|
240
|
+
* Left-rail navigation for the Media Library. Fetches folder structure internally
|
|
241
|
+
* and renders:
|
|
242
|
+
*
|
|
243
|
+
* 1. A "Media library" title
|
|
244
|
+
* 2. A "Home" entry that clears the folder query param
|
|
245
|
+
* 3. A "FOLDERS" section header
|
|
246
|
+
* 4. The folder tree itself
|
|
247
|
+
*
|
|
248
|
+
* Presentational with respect to routing — navigation is delegated to the parent
|
|
249
|
+
* via `onSelectFolder` so the URL stays the single source of truth (see
|
|
250
|
+
* `useFolderNavigation`).
|
|
251
|
+
*/ const FolderTree = ({ currentFolderId, onSelectFolder })=>{
|
|
252
|
+
const { formatMessage } = useIntl();
|
|
253
|
+
const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();
|
|
254
|
+
const { isExpanded, toggleExpanded } = useExpandedFolders(folderStructure, currentFolderId);
|
|
255
|
+
const isHomeActive = currentFolderId == null;
|
|
256
|
+
return /*#__PURE__*/ jsxs(SidebarNav, {
|
|
257
|
+
direction: "column",
|
|
258
|
+
alignItems: "stretch",
|
|
259
|
+
tag: "nav",
|
|
260
|
+
"aria-label": formatMessage({
|
|
261
|
+
id: getTranslationKey('sidebar.tree.aria-label'),
|
|
262
|
+
defaultMessage: 'Media library folders'
|
|
263
|
+
}),
|
|
264
|
+
children: [
|
|
265
|
+
/*#__PURE__*/ jsx(SidebarHeader, {
|
|
266
|
+
paddingTop: 4,
|
|
267
|
+
paddingBottom: 4,
|
|
268
|
+
paddingLeft: 5,
|
|
269
|
+
paddingRight: 5,
|
|
270
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
271
|
+
variant: "beta",
|
|
272
|
+
tag: "h2",
|
|
273
|
+
children: formatMessage({
|
|
274
|
+
id: getTranslationKey('sidebar.title'),
|
|
275
|
+
defaultMessage: 'Media library'
|
|
276
|
+
})
|
|
277
|
+
})
|
|
278
|
+
}),
|
|
279
|
+
/*#__PURE__*/ jsxs(SidebarBody, {
|
|
280
|
+
direction: "column",
|
|
281
|
+
alignItems: "stretch",
|
|
282
|
+
gap: 1,
|
|
283
|
+
padding: 3,
|
|
284
|
+
children: [
|
|
285
|
+
/*#__PURE__*/ jsxs(RowButton, {
|
|
286
|
+
type: "button",
|
|
287
|
+
$isActive: isHomeActive,
|
|
288
|
+
"aria-current": isHomeActive ? 'page' : undefined,
|
|
289
|
+
onClick: ()=>onSelectFolder(null),
|
|
290
|
+
"data-testid": "folder-tree-home",
|
|
291
|
+
children: [
|
|
292
|
+
/*#__PURE__*/ jsx(House, {
|
|
293
|
+
"aria-hidden": true,
|
|
294
|
+
width: "1.6rem",
|
|
295
|
+
height: "1.6rem"
|
|
296
|
+
}),
|
|
297
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
298
|
+
variant: "omega",
|
|
299
|
+
fontWeight: isHomeActive ? 'semiBold' : 'regular',
|
|
300
|
+
children: formatMessage({
|
|
301
|
+
id: getTranslationKey('sidebar.home'),
|
|
302
|
+
defaultMessage: 'Home'
|
|
303
|
+
})
|
|
304
|
+
})
|
|
305
|
+
]
|
|
306
|
+
}),
|
|
307
|
+
/*#__PURE__*/ jsxs(Box, {
|
|
308
|
+
children: [
|
|
309
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
310
|
+
alignItems: "center",
|
|
311
|
+
gap: 1,
|
|
312
|
+
padding: 1,
|
|
313
|
+
children: [
|
|
314
|
+
/*#__PURE__*/ jsx(Folder, {
|
|
315
|
+
"aria-hidden": true,
|
|
316
|
+
width: "1.6rem",
|
|
317
|
+
height: "1.6rem",
|
|
318
|
+
fill: "neutral500"
|
|
319
|
+
}),
|
|
320
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
321
|
+
variant: "sigma",
|
|
322
|
+
textColor: "neutral600",
|
|
323
|
+
style: {
|
|
324
|
+
textTransform: 'uppercase'
|
|
325
|
+
},
|
|
326
|
+
children: formatMessage({
|
|
327
|
+
id: getTranslationKey('sidebar.folders'),
|
|
328
|
+
defaultMessage: 'Folders'
|
|
329
|
+
})
|
|
330
|
+
})
|
|
331
|
+
]
|
|
332
|
+
}),
|
|
333
|
+
isLoading ? // TODO: revisit loading state before revamp GA
|
|
334
|
+
/*#__PURE__*/ jsx(Flex, {
|
|
335
|
+
justifyContent: "center",
|
|
336
|
+
padding: 1,
|
|
337
|
+
paddingTop: 2,
|
|
338
|
+
children: /*#__PURE__*/ jsx(Loader, {
|
|
339
|
+
children: formatMessage({
|
|
340
|
+
id: getTranslationKey('sidebar.tree.loading'),
|
|
341
|
+
defaultMessage: 'Loading folders...'
|
|
342
|
+
})
|
|
343
|
+
})
|
|
344
|
+
}) : isError ? // TODO: revisit error state before revamp GA
|
|
345
|
+
/*#__PURE__*/ jsx(Box, {
|
|
346
|
+
padding: 1,
|
|
347
|
+
paddingTop: 2,
|
|
348
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
349
|
+
variant: "pi",
|
|
350
|
+
textColor: "danger600",
|
|
351
|
+
children: formatMessage({
|
|
352
|
+
id: getTranslationKey('sidebar.tree.error'),
|
|
353
|
+
defaultMessage: 'Could not load folders.'
|
|
354
|
+
})
|
|
355
|
+
})
|
|
356
|
+
}) : folderStructure.length === 0 ? // TODO: revisit empty state before revamp GA
|
|
357
|
+
/*#__PURE__*/ jsx(Box, {
|
|
358
|
+
padding: 1,
|
|
359
|
+
paddingTop: 2,
|
|
360
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
361
|
+
variant: "pi",
|
|
362
|
+
textColor: "neutral500",
|
|
363
|
+
children: formatMessage({
|
|
364
|
+
id: getTranslationKey('sidebar.tree.empty'),
|
|
365
|
+
defaultMessage: 'No folders yet'
|
|
366
|
+
})
|
|
367
|
+
})
|
|
368
|
+
}) : /*#__PURE__*/ jsx(NavList, {
|
|
369
|
+
children: folderStructure.map((node)=>/*#__PURE__*/ jsx(FolderTreeItem, {
|
|
370
|
+
node: node,
|
|
371
|
+
level: 0,
|
|
372
|
+
currentFolderId: currentFolderId,
|
|
373
|
+
isExpanded: isExpanded,
|
|
374
|
+
onToggle: toggleExpanded,
|
|
375
|
+
onSelect: onSelectFolder
|
|
376
|
+
}, node.id ?? node.name))
|
|
377
|
+
})
|
|
378
|
+
]
|
|
379
|
+
})
|
|
380
|
+
]
|
|
381
|
+
})
|
|
382
|
+
]
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
export { FolderTree };
|
|
387
|
+
//# sourceMappingURL=FolderTree.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { Box, Flex, IconButton, Loader, Tooltip, Typography } from '@strapi/design-system';\nimport { ChevronDown, Folder as FolderIcon, House } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * RowButton — shared row styling aligned with admin SubNav.Link\n * -----------------------------------------------------------------------------------------------*/\n\nconst RowButton = styled.button<{ $isActive: boolean }>`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n min-height: 3.2rem;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border: 0;\n background: ${({ $isActive, theme }) => ($isActive ? theme.colors.primary100 : 'transparent')};\n color: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary700 : theme.colors.neutral800};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: pointer;\n text-align: left;\n font: inherit;\n\n &:hover {\n background: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary100 : theme.colors.neutral100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * useExpandedFolders — local expand/collapse state\n * -----------------------------------------------------------------------------------------------*/\n\nconst findAncestorIds = (\n nodes: FolderNode[],\n targetId: number,\n trail: number[] = []\n): number[] | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return trail;\n }\n\n if (node.children?.length) {\n const nextTrail = node.id != null ? [...trail, node.id] : trail;\n const found = findAncestorIds(node.children, targetId, nextTrail);\n if (found !== null) {\n return found;\n }\n }\n }\n\n return null;\n};\n\nconst useExpandedFolders = (folderStructure: FolderNode[], currentFolderId: number | null) => {\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => new Set());\n\n useEffect(() => {\n if (currentFolderId == null) {\n return;\n }\n\n const ancestors = findAncestorIds(folderStructure, currentFolderId);\n if (!ancestors || ancestors.length === 0) {\n return;\n }\n\n setExpandedIds((prev) => {\n const next = new Set(prev);\n let changed = false;\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [folderStructure, currentFolderId]);\n\n const toggleExpanded = useCallback((id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const isExpanded = useCallback((id: number) => expandedIds.has(id), [expandedIds]);\n\n return { isExpanded, toggleExpanded };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TruncatedFolderName — tooltip when the label is ellipsized\n * -----------------------------------------------------------------------------------------------*/\n\nconst TruncatedFolderName = ({ name, isActive }: { name: string; isActive: boolean }) => {\n const textRef = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = textRef.current;\n if (!el) {\n return;\n }\n\n const checkTruncation = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth);\n };\n\n checkTruncation();\n\n const observer = new ResizeObserver(checkTruncation);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [name]);\n\n const label = (\n <Typography\n ref={textRef}\n variant=\"omega\"\n fontWeight={isActive ? 'semiBold' : 'regular'}\n ellipsis\n >\n {name}\n </Typography>\n );\n\n if (isTruncated) {\n return <Tooltip label={name}>{label}</Tooltip>;\n }\n\n return label;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\nconst RotatingChevron = styled(ChevronDown)<{ $expanded: boolean }>`\n transform: rotate(${({ $expanded }) => ($expanded ? '0deg' : '-90deg')});\n transition: transform 0.2s ease;\n`;\n\ninterface FolderTreeItemProps {\n node: FolderNode;\n level: number;\n currentFolderId: number | null;\n isExpanded: (id: number) => boolean;\n onToggle: (id: number) => void;\n onSelect: (folderId: number) => void;\n}\n\nconst FolderTreeItem = ({\n node,\n level,\n currentFolderId,\n isExpanded,\n onToggle,\n onSelect,\n}: FolderTreeItemProps) => {\n const { formatMessage } = useIntl();\n\n if (node.id == null) {\n return null;\n }\n\n const id = node.id;\n const name = node.name ?? '';\n const hasChildren = (node.children?.length ?? 0) > 0;\n const isFolderExpanded = isExpanded(id);\n const isActive = currentFolderId === id;\n\n // TODO: full `role=\"tree\"` + arrow-key treeview navigation before revamp GA\n // if an accessibility audit requires it (CMS-133 v1 is button rows only).\n return (\n <li>\n <Flex alignItems=\"center\" paddingLeft={`${level * INDENT_PER_LEVEL_REM}rem`} gap={1}>\n <IconButton\n label={formatMessage(\n {\n id: getTranslationKey(\n isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'\n ),\n defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}',\n },\n { name }\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={isFolderExpanded}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </IconButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n type=\"button\"\n $isActive={isActive}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onSelect(id)}\n data-testid={`folder-tree-node-${id}`}\n data-folder-id={id}\n >\n <TruncatedFolderName name={name} isActive={isActive} />\n </RowButton>\n </Box>\n </Flex>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {node.children.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n level={level + 1}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n ))}\n </NavList>\n )}\n </li>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTree — public sidebar component\n * -----------------------------------------------------------------------------------------------*/\n\nconst SidebarNav = styled(Flex)`\n /* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */\n width: 25.6rem;\n height: 100%;\n min-height: 100%;\n background: ${({ theme }) => theme.colors.neutral0};\n flex-shrink: 0;\n flex-direction: column;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarHeader = styled(Box)`\n flex-shrink: 0;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarBody = styled(Flex)`\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n`;\n\ninterface FolderTreeProps {\n currentFolderId: number | null;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Left-rail navigation for the Media Library. Fetches folder structure internally\n * and renders:\n *\n * 1. A \"Media library\" title\n * 2. A \"Home\" entry that clears the folder query param\n * 3. A \"FOLDERS\" section header\n * 4. The folder tree itself\n *\n * Presentational with respect to routing — navigation is delegated to the parent\n * via `onSelectFolder` so the URL stays the single source of truth (see\n * `useFolderNavigation`).\n */\nexport const FolderTree = ({ currentFolderId, onSelectFolder }: FolderTreeProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();\n const { isExpanded, toggleExpanded } = useExpandedFolders(folderStructure, currentFolderId);\n\n const isHomeActive = currentFolderId == null;\n\n return (\n <SidebarNav\n direction=\"column\"\n alignItems=\"stretch\"\n tag=\"nav\"\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SidebarHeader paddingTop={4} paddingBottom={4} paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n </Typography>\n </SidebarHeader>\n\n <SidebarBody direction=\"column\" alignItems=\"stretch\" gap={1} padding={3}>\n <RowButton\n type=\"button\"\n $isActive={isHomeActive}\n aria-current={isHomeActive ? 'page' : undefined}\n onClick={() => onSelectFolder(null)}\n data-testid=\"folder-tree-home\"\n >\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {formatMessage({\n id: getTranslationKey('sidebar.home'),\n defaultMessage: 'Home',\n })}\n </Typography>\n </RowButton>\n\n <Box>\n <Flex alignItems=\"center\" gap={1} padding={1}>\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n style={{ textTransform: 'uppercase' }}\n >\n {formatMessage({\n id: getTranslationKey('sidebar.folders'),\n defaultMessage: 'Folders',\n })}\n </Typography>\n </Flex>\n\n {isLoading ? (\n // TODO: revisit loading state before revamp GA\n <Flex justifyContent=\"center\" padding={1} paddingTop={2}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('sidebar.tree.loading'),\n defaultMessage: 'Loading folders...',\n })}\n </Loader>\n </Flex>\n ) : isError ? (\n // TODO: revisit error state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.error'),\n defaultMessage: 'Could not load folders.',\n })}\n </Typography>\n </Box>\n ) : folderStructure.length === 0 ? (\n // TODO: revisit empty state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.empty'),\n defaultMessage: 'No folders yet',\n })}\n </Typography>\n </Box>\n ) : (\n <NavList>\n {folderStructure.map((node) => (\n <FolderTreeItem\n key={node.id ?? node.name}\n node={node}\n level={0}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onSelect={onSelectFolder}\n />\n ))}\n </NavList>\n )}\n </Box>\n </SidebarBody>\n </SidebarNav>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","colors","primary100","primary700","neutral800","borderRadius","neutral100","primary600","findAncestorIds","nodes","targetId","trail","node","id","children","length","nextTrail","found","useExpandedFolders","folderStructure","currentFolderId","expandedIds","setExpandedIds","useState","Set","useEffect","ancestors","prev","next","changed","has","add","toggleExpanded","useCallback","delete","isExpanded","TruncatedFolderName","name","isActive","textRef","useRef","isTruncated","setIsTruncated","useLayoutEffect","el","current","checkTruncation","scrollWidth","clientWidth","observer","ResizeObserver","observe","disconnect","label","_jsx","Typography","ref","variant","fontWeight","ellipsis","Tooltip","NavList","ul","INDENT_PER_LEVEL_REM","RotatingChevron","ChevronDown","$expanded","FolderTreeItem","level","onToggle","onSelect","formatMessage","useIntl","hasChildren","isFolderExpanded","_jsxs","li","Flex","alignItems","paddingLeft","gap","IconButton","getTranslationKey","defaultMessage","onClick","event","stopPropagation","withTooltip","aria-expanded","fill","Box","flex","minWidth","type","aria-current","undefined","data-testid","data-folder-id","map","child","SidebarNav","neutral0","neutral150","SidebarHeader","SidebarBody","FolderTree","onSelectFolder","data","isLoading","isError","useGetFolderStructureQuery","isHomeActive","direction","tag","aria-label","paddingTop","paddingBottom","paddingRight","padding","House","aria-hidden","width","height","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
|
|
@@ -7,7 +7,8 @@ var reactIntl = require('react-intl');
|
|
|
7
7
|
var files = require('../../../utils/files.js');
|
|
8
8
|
var translations = require('../../../utils/translations.js');
|
|
9
9
|
|
|
10
|
-
function
|
|
10
|
+
function _interopNamespace(e) {
|
|
11
|
+
if (e && e.__esModule) return e;
|
|
11
12
|
var n = Object.create(null);
|
|
12
13
|
if (e) {
|
|
13
14
|
Object.keys(e).forEach(function (k) {
|
|
@@ -24,7 +25,7 @@ function _interopNamespaceDefault(e) {
|
|
|
24
25
|
return Object.freeze(n);
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
var React__namespace = /*#__PURE__*/
|
|
28
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
29
|
|
|
29
30
|
const ImportFromUrlDialog = ({ open, onClose, onUpload })=>{
|
|
30
31
|
const { formatMessage } = reactIntl.useIntl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportFromUrlDialog.js","sources":["../../../../../../admin/src/future/pages/Assets/components/ImportFromUrlDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { validateUrls } from '../../../utils/files';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface ImportFromUrlDialogProps {\n open: boolean;\n onClose: () => void;\n onUpload: (urls: string[]) => Promise<void>;\n}\n\nexport const ImportFromUrlDialog = ({ open, onClose, onUpload }: ImportFromUrlDialogProps) => {\n const { formatMessage } = useIntl();\n const [urls, setUrls] = React.useState('');\n const [error, setError] = React.useState<string | null>(null);\n\n const handleClose = () => {\n setUrls('');\n setError(null);\n onClose();\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate URLs\n const { urls: validUrls, error: validationError } = validateUrls(urls);\n if (validationError) {\n setError(validationError);\n return;\n }\n\n setError(null);\n\n // Close dialog and let the mutation handle fetching and uploading\n handleClose();\n\n // Pass URLs to mutation which handles fetching and upload progress\n await onUpload(validUrls);\n };\n\n return (\n <Modal.Root open={open} onOpenChange={(isOpen) => !isOpen && handleClose()}>\n <Modal.Content>\n <form onSubmit={handleSubmit}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('modal.url.title'),\n defaultMessage: 'Import from URL',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Field.Root\n error={error || undefined}\n hint={formatMessage({\n id: getTranslationKey('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('input.url.label'),\n defaultMessage: 'URL(s)',\n })}\n </Field.Label>\n <Textarea\n name=\"urls\"\n minHeight=\"unset\"\n rows={Math.min(urls.split('\\n').length, 7)}\n maxHeight=\"10.5rem\"\n placeholder={formatMessage({\n id: getTranslationKey('input.url.placeholder'),\n defaultMessage: 'Empty',\n })}\n value={urls}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setUrls(e.target.value);\n setError(null);\n }}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"tertiary\" onClick={handleClose}>\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <Button type=\"submit\">\n {formatMessage({\n id: getTranslationKey('modal.url.upload'),\n defaultMessage: 'Upload',\n })}\n </Button>\n </Modal.Footer>\n </form>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["ImportFromUrlDialog","open","onClose","onUpload","formatMessage","useIntl","urls","setUrls","React","useState","error","setError","handleClose","handleSubmit","e","preventDefault","validUrls","validationError","validateUrls","_jsx","Modal","Root","onOpenChange","isOpen","Content","_jsxs","form","onSubmit","Header","Title","id","getTranslationKey","defaultMessage","Body","Field","undefined","hint","Label","Textarea","name","minHeight","rows","Math","min","split","length","maxHeight","placeholder","value","onChange","target","Hint","Error","Footer","Button","variant","onClick","type"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ImportFromUrlDialog.js","sources":["../../../../../../admin/src/future/pages/Assets/components/ImportFromUrlDialog.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { validateUrls } from '../../../utils/files';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface ImportFromUrlDialogProps {\n open: boolean;\n onClose: () => void;\n onUpload: (urls: string[]) => Promise<void>;\n}\n\nexport const ImportFromUrlDialog = ({ open, onClose, onUpload }: ImportFromUrlDialogProps) => {\n const { formatMessage } = useIntl();\n const [urls, setUrls] = React.useState('');\n const [error, setError] = React.useState<string | null>(null);\n\n const handleClose = () => {\n setUrls('');\n setError(null);\n onClose();\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate URLs\n const { urls: validUrls, error: validationError } = validateUrls(urls);\n if (validationError) {\n setError(validationError);\n return;\n }\n\n setError(null);\n\n // Close dialog and let the mutation handle fetching and uploading\n handleClose();\n\n // Pass URLs to mutation which handles fetching and upload progress\n await onUpload(validUrls);\n };\n\n return (\n <Modal.Root open={open} onOpenChange={(isOpen) => !isOpen && handleClose()}>\n <Modal.Content>\n <form onSubmit={handleSubmit}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('modal.url.title'),\n defaultMessage: 'Import from URL',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Field.Root\n error={error || undefined}\n hint={formatMessage({\n id: getTranslationKey('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('input.url.label'),\n defaultMessage: 'URL(s)',\n })}\n </Field.Label>\n <Textarea\n name=\"urls\"\n minHeight=\"unset\"\n rows={Math.min(urls.split('\\n').length, 7)}\n maxHeight=\"10.5rem\"\n placeholder={formatMessage({\n id: getTranslationKey('input.url.placeholder'),\n defaultMessage: 'Empty',\n })}\n value={urls}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setUrls(e.target.value);\n setError(null);\n }}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Button variant=\"tertiary\" onClick={handleClose}>\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <Button type=\"submit\">\n {formatMessage({\n id: getTranslationKey('modal.url.upload'),\n defaultMessage: 'Upload',\n })}\n </Button>\n </Modal.Footer>\n </form>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["ImportFromUrlDialog","open","onClose","onUpload","formatMessage","useIntl","urls","setUrls","React","useState","error","setError","handleClose","handleSubmit","e","preventDefault","validUrls","validationError","validateUrls","_jsx","Modal","Root","onOpenChange","isOpen","Content","_jsxs","form","onSubmit","Header","Title","id","getTranslationKey","defaultMessage","Body","Field","undefined","hint","Label","Textarea","name","minHeight","rows","Math","min","split","length","maxHeight","placeholder","value","onChange","target","Hint","Error","Footer","Button","variant","onClick","type"],"mappings":"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"}
|
|
@@ -34,15 +34,15 @@ const useFolderInfo = (currentFolderId)=>{
|
|
|
34
34
|
itemCount: rootAssetsData?.pagination?.total ?? 0
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
if (isLoading) {
|
|
37
|
+
if (isLoading || !currentFolder) {
|
|
38
38
|
return {
|
|
39
|
-
title:
|
|
39
|
+
title: '',
|
|
40
40
|
itemCount: 0
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
return {
|
|
44
|
-
title: currentFolder
|
|
45
|
-
itemCount: currentFolder
|
|
44
|
+
title: currentFolder.name,
|
|
45
|
+
itemCount: currentFolder.files?.count ?? 0
|
|
46
46
|
};
|
|
47
47
|
};
|
|
48
48
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFolderInfo.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderInfo.ts"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\nimport { useGetFolderQuery } from '../../../services/folders';\nimport { getTranslationKey } from '../../../utils/translations';\n\nexport interface FolderInfo {\n title: string;\n itemCount: number;\n}\n\nexport const useFolderInfo = (currentFolderId: number | null): FolderInfo => {\n const { formatMessage } = useIntl();\n const { data: currentFolder, isLoading } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const { data: rootAssetsData, isLoading: isRootAssetsLoading } = useGetAssetsQuery(\n { folder: null, pageSize: 1 },\n { skip: currentFolderId !== null }\n );\n\n const homeLabel = formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n });\n\n if (currentFolderId === null) {\n if (isRootAssetsLoading) {\n return { title: homeLabel, itemCount: 0 };\n }\n\n return { title: homeLabel, itemCount: rootAssetsData?.pagination?.total ?? 0 };\n }\n\n if (isLoading) {\n return { title:
|
|
1
|
+
{"version":3,"file":"useFolderInfo.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderInfo.ts"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\nimport { useGetFolderQuery } from '../../../services/folders';\nimport { getTranslationKey } from '../../../utils/translations';\n\nexport interface FolderInfo {\n title: string;\n itemCount: number;\n}\n\nexport const useFolderInfo = (currentFolderId: number | null): FolderInfo => {\n const { formatMessage } = useIntl();\n const { data: currentFolder, isLoading } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const { data: rootAssetsData, isLoading: isRootAssetsLoading } = useGetAssetsQuery(\n { folder: null, pageSize: 1 },\n { skip: currentFolderId !== null }\n );\n\n const homeLabel = formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n });\n\n if (currentFolderId === null) {\n if (isRootAssetsLoading) {\n return { title: homeLabel, itemCount: 0 };\n }\n\n return { title: homeLabel, itemCount: rootAssetsData?.pagination?.total ?? 0 };\n }\n\n if (isLoading || !currentFolder) {\n return { title: '', itemCount: 0 };\n }\n\n return {\n title: currentFolder.name,\n itemCount: currentFolder.files?.count ?? 0,\n };\n};\n"],"names":["useFolderInfo","currentFolderId","formatMessage","useIntl","data","currentFolder","isLoading","useGetFolderQuery","id","skip","rootAssetsData","isRootAssetsLoading","useGetAssetsQuery","folder","pageSize","homeLabel","getTranslationKey","defaultMessage","title","itemCount","pagination","total","name","files","count"],"mappings":";;;;;;;AAWO,MAAMA,gBAAgB,CAACC,eAAAA,GAAAA;IAC5B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,IAAAA,EAAMC,aAAa,EAAEC,SAAS,EAAE,GAAGC,yBAAAA,CACzC;QAAEC,EAAAA,EAAIP;KAAiB,EACvB;AAAEQ,QAAAA,IAAAA,EAAMR,eAAAA,KAAoB;AAAK,KAAA,CAAA;IAEnC,MAAM,EAAEG,MAAMM,cAAc,EAAEJ,WAAWK,mBAAmB,EAAE,GAAGC,wBAAAA,CAC/D;QAAEC,MAAAA,EAAQ,IAAA;QAAMC,QAAAA,EAAU;KAAE,EAC5B;AAAEL,QAAAA,IAAAA,EAAMR,eAAAA,KAAoB;AAAK,KAAA,CAAA;AAGnC,IAAA,MAAMc,YAAYb,aAAAA,CAAc;AAC9BM,QAAAA,EAAAA,EAAIQ,8BAAAA,CAAkB,aAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;AAEA,IAAA,IAAIhB,oBAAoB,IAAA,EAAM;AAC5B,QAAA,IAAIU,mBAAAA,EAAqB;YACvB,OAAO;gBAAEO,KAAAA,EAAOH,SAAAA;gBAAWI,SAAAA,EAAW;AAAE,aAAA;AAC1C,QAAA;QAEA,OAAO;YAAED,KAAAA,EAAOH,SAAAA;YAAWI,SAAAA,EAAWT,cAAAA,EAAgBU,YAAYC,KAAAA,IAAS;AAAE,SAAA;AAC/E,IAAA;IAEA,IAAIf,SAAAA,IAAa,CAACD,aAAAA,EAAe;QAC/B,OAAO;YAAEa,KAAAA,EAAO,EAAA;YAAIC,SAAAA,EAAW;AAAE,SAAA;AACnC,IAAA;IAEA,OAAO;AACLD,QAAAA,KAAAA,EAAOb,cAAciB,IAAI;QACzBH,SAAAA,EAAWd,aAAAA,CAAckB,KAAK,EAAEC,KAAAA,IAAS;AAC3C,KAAA;AACF;;;;"}
|
|
@@ -32,15 +32,15 @@ const useFolderInfo = (currentFolderId)=>{
|
|
|
32
32
|
itemCount: rootAssetsData?.pagination?.total ?? 0
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
if (isLoading) {
|
|
35
|
+
if (isLoading || !currentFolder) {
|
|
36
36
|
return {
|
|
37
|
-
title:
|
|
37
|
+
title: '',
|
|
38
38
|
itemCount: 0
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
return {
|
|
42
|
-
title: currentFolder
|
|
43
|
-
itemCount: currentFolder
|
|
42
|
+
title: currentFolder.name,
|
|
43
|
+
itemCount: currentFolder.files?.count ?? 0
|
|
44
44
|
};
|
|
45
45
|
};
|
|
46
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFolderInfo.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderInfo.ts"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\nimport { useGetFolderQuery } from '../../../services/folders';\nimport { getTranslationKey } from '../../../utils/translations';\n\nexport interface FolderInfo {\n title: string;\n itemCount: number;\n}\n\nexport const useFolderInfo = (currentFolderId: number | null): FolderInfo => {\n const { formatMessage } = useIntl();\n const { data: currentFolder, isLoading } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const { data: rootAssetsData, isLoading: isRootAssetsLoading } = useGetAssetsQuery(\n { folder: null, pageSize: 1 },\n { skip: currentFolderId !== null }\n );\n\n const homeLabel = formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n });\n\n if (currentFolderId === null) {\n if (isRootAssetsLoading) {\n return { title: homeLabel, itemCount: 0 };\n }\n\n return { title: homeLabel, itemCount: rootAssetsData?.pagination?.total ?? 0 };\n }\n\n if (isLoading) {\n return { title:
|
|
1
|
+
{"version":3,"file":"useFolderInfo.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderInfo.ts"],"sourcesContent":["import { useIntl } from 'react-intl';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\nimport { useGetFolderQuery } from '../../../services/folders';\nimport { getTranslationKey } from '../../../utils/translations';\n\nexport interface FolderInfo {\n title: string;\n itemCount: number;\n}\n\nexport const useFolderInfo = (currentFolderId: number | null): FolderInfo => {\n const { formatMessage } = useIntl();\n const { data: currentFolder, isLoading } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const { data: rootAssetsData, isLoading: isRootAssetsLoading } = useGetAssetsQuery(\n { folder: null, pageSize: 1 },\n { skip: currentFolderId !== null }\n );\n\n const homeLabel = formatMessage({\n id: getTranslationKey('plugin.home'),\n defaultMessage: 'Home',\n });\n\n if (currentFolderId === null) {\n if (isRootAssetsLoading) {\n return { title: homeLabel, itemCount: 0 };\n }\n\n return { title: homeLabel, itemCount: rootAssetsData?.pagination?.total ?? 0 };\n }\n\n if (isLoading || !currentFolder) {\n return { title: '', itemCount: 0 };\n }\n\n return {\n title: currentFolder.name,\n itemCount: currentFolder.files?.count ?? 0,\n };\n};\n"],"names":["useFolderInfo","currentFolderId","formatMessage","useIntl","data","currentFolder","isLoading","useGetFolderQuery","id","skip","rootAssetsData","isRootAssetsLoading","useGetAssetsQuery","folder","pageSize","homeLabel","getTranslationKey","defaultMessage","title","itemCount","pagination","total","name","files","count"],"mappings":";;;;;AAWO,MAAMA,gBAAgB,CAACC,eAAAA,GAAAA;IAC5B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,IAAAA,EAAMC,aAAa,EAAEC,SAAS,EAAE,GAAGC,iBAAAA,CACzC;QAAEC,EAAAA,EAAIP;KAAiB,EACvB;AAAEQ,QAAAA,IAAAA,EAAMR,eAAAA,KAAoB;AAAK,KAAA,CAAA;IAEnC,MAAM,EAAEG,MAAMM,cAAc,EAAEJ,WAAWK,mBAAmB,EAAE,GAAGC,iBAAAA,CAC/D;QAAEC,MAAAA,EAAQ,IAAA;QAAMC,QAAAA,EAAU;KAAE,EAC5B;AAAEL,QAAAA,IAAAA,EAAMR,eAAAA,KAAoB;AAAK,KAAA,CAAA;AAGnC,IAAA,MAAMc,YAAYb,aAAAA,CAAc;AAC9BM,QAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,aAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;AAEA,IAAA,IAAIhB,oBAAoB,IAAA,EAAM;AAC5B,QAAA,IAAIU,mBAAAA,EAAqB;YACvB,OAAO;gBAAEO,KAAAA,EAAOH,SAAAA;gBAAWI,SAAAA,EAAW;AAAE,aAAA;AAC1C,QAAA;QAEA,OAAO;YAAED,KAAAA,EAAOH,SAAAA;YAAWI,SAAAA,EAAWT,cAAAA,EAAgBU,YAAYC,KAAAA,IAAS;AAAE,SAAA;AAC/E,IAAA;IAEA,IAAIf,SAAAA,IAAa,CAACD,aAAAA,EAAe;QAC/B,OAAO;YAAEa,KAAAA,EAAO,EAAA;YAAIC,SAAAA,EAAW;AAAE,SAAA;AACnC,IAAA;IAEA,OAAO;AACLD,QAAAA,KAAAA,EAAOb,cAAciB,IAAI;QACzBH,SAAAA,EAAWd,aAAAA,CAAckB,KAAK,EAAEC,KAAAA,IAAS;AAC3C,KAAA;AACF;;;;"}
|
|
@@ -1,18 +1,64 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var React = require('react');
|
|
3
4
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
4
5
|
|
|
6
|
+
const parseFolderIdFromQuery = (folder)=>{
|
|
7
|
+
if (!folder) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const id = Number(folder);
|
|
11
|
+
return Number.isFinite(id) ? id : null;
|
|
12
|
+
};
|
|
5
13
|
const useFolderNavigation = ()=>{
|
|
6
14
|
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
|
7
|
-
const currentFolderId = query?.folder
|
|
15
|
+
const currentFolderId = parseFolderIdFromQuery(query?.folder);
|
|
8
16
|
const navigateToFolder = (folder)=>{
|
|
9
17
|
setQuery({
|
|
10
18
|
folder: String(folder.id)
|
|
11
19
|
});
|
|
12
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Move to the Media Library root by removing the `folder` query param.
|
|
23
|
+
* `setQuery(_, 'remove')` deletes the keys present on the first argument
|
|
24
|
+
* (value is ignored), so any other query state (filters, pagination, etc.)
|
|
25
|
+
* is preserved.
|
|
26
|
+
*/ const navigateToRoot = React.useCallback(()=>{
|
|
27
|
+
setQuery({
|
|
28
|
+
folder: ''
|
|
29
|
+
}, 'remove');
|
|
30
|
+
}, [
|
|
31
|
+
setQuery
|
|
32
|
+
]);
|
|
33
|
+
// Malformed ?folder= values (e.g. abc) parse as null; strip the param from the URL.
|
|
34
|
+
// Deleted/missing folders (404) are handled in AssetsPage — that needs a fetch.
|
|
35
|
+
React.useEffect(()=>{
|
|
36
|
+
if (query?.folder && currentFolderId === null) {
|
|
37
|
+
navigateToRoot();
|
|
38
|
+
}
|
|
39
|
+
}, [
|
|
40
|
+
query?.folder,
|
|
41
|
+
currentFolderId,
|
|
42
|
+
navigateToRoot
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Convenience for the FolderTree sidebar: a single entry point that handles
|
|
46
|
+
* both "go home" and "go to folder X" without forcing the caller to know
|
|
47
|
+
* whether to call navigateToFolder or navigateToRoot.
|
|
48
|
+
*/ const navigateToFolderId = (folderId)=>{
|
|
49
|
+
if (folderId == null) {
|
|
50
|
+
navigateToRoot();
|
|
51
|
+
} else {
|
|
52
|
+
setQuery({
|
|
53
|
+
folder: String(folderId)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
13
57
|
return {
|
|
14
58
|
currentFolderId,
|
|
15
|
-
navigateToFolder
|
|
59
|
+
navigateToFolder,
|
|
60
|
+
navigateToRoot,
|
|
61
|
+
navigateToFolderId
|
|
16
62
|
};
|
|
17
63
|
};
|
|
18
64
|
|