@strapi/upload 5.55.1 → 5.57.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/hooks/useAIMetadataAvailability.js +14 -0
- package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -0
- package/dist/admin/hooks/useAIMetadataAvailability.mjs +12 -0
- package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -0
- package/dist/admin/hooks/useAIMetadataEnabled.js +7 -5
- package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -5
- package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +4 -10
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +5 -10
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.js +14 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.js.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs +12 -0
- package/dist/admin/legacy/hooks/useAIMetadataAvailability.mjs.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.js +23 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.js.map +1 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs +21 -0
- package/dist/admin/legacy/hooks/useAIMetadataEnabled.mjs.map +1 -0
- package/dist/admin/legacy/hooks/useTracking.js +5 -3
- package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
- package/dist/admin/legacy/hooks/useTracking.mjs +5 -3
- package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.js +6 -5
- package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs +6 -5
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +24 -12
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
- package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.js +4 -2
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.js.map +1 -1
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs +4 -2
- package/dist/admin/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
- package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
- package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +10 -3
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +10 -3
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/hooks/useAIMetadataAvailability.d.ts +5 -0
- package/dist/admin/src/hooks/useAIMetadataEnabled.d.ts +5 -3
- package/dist/admin/src/hooks/useTracking.d.ts +0 -7
- package/dist/admin/src/legacy/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +2 -2
- package/dist/admin/src/legacy/hooks/useAIMetadataAvailability.d.ts +5 -0
- package/dist/admin/src/legacy/hooks/useAIMetadataEnabled.d.ts +12 -0
- package/dist/admin/src/legacy/hooks/useSettings.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/ActionsMenuContent.d.ts +2 -2
- package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
- package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
- package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
- package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
- package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
- package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
- package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
- package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
- package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
- package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
- package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
- package/dist/admin/translations/en.json.js +9 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +9 -3
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/mediaLibraryVersion.js +24 -0
- package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
- package/dist/server/bootstrap.js +7 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +7 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +2 -2
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +2 -2
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder-file.js +51 -4
- package/dist/server/controllers/admin-folder-file.js.map +1 -1
- package/dist/server/controllers/admin-folder-file.mjs +52 -5
- package/dist/server/controllers/admin-folder-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder.js +5 -5
- package/dist/server/controllers/admin-folder.js.map +1 -1
- package/dist/server/controllers/admin-folder.mjs +5 -5
- package/dist/server/controllers/admin-folder.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +2 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +2 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +30 -7
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +30 -7
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js +4 -4
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js +3 -4
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs +3 -4
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js +1 -2
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs +1 -2
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/utils.js +1 -2
- package/dist/server/controllers/validation/admin/utils.js.map +1 -1
- package/dist/server/controllers/validation/admin/utils.mjs +1 -2
- package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
- package/dist/server/errors.js +12 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/errors.mjs +10 -0
- package/dist/server/errors.mjs.map +1 -0
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
- package/dist/server/routes/content-api.js +3 -3
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +3 -3
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/validation/upload.js +8 -0
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/routes/validation/upload.mjs +8 -0
- package/dist/server/routes/validation/upload.mjs.map +1 -1
- package/dist/server/services/ai-metadata-provider.js +83 -0
- package/dist/server/services/ai-metadata-provider.js.map +1 -0
- package/dist/server/services/ai-metadata-provider.mjs +61 -0
- package/dist/server/services/ai-metadata-provider.mjs.map +1 -0
- package/dist/server/services/ai-metadata-strapi-managed.js +48 -0
- package/dist/server/services/ai-metadata-strapi-managed.js.map +1 -0
- package/dist/server/services/ai-metadata-strapi-managed.mjs +46 -0
- package/dist/server/services/ai-metadata-strapi-managed.mjs.map +1 -0
- package/dist/server/services/ai-metadata.js +5 -58
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +6 -39
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js +3 -3
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs +3 -3
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/extensions/utils.js +19 -15
- package/dist/server/services/extensions/utils.js.map +1 -1
- package/dist/server/services/extensions/utils.mjs +19 -15
- package/dist/server/services/extensions/utils.mjs.map +1 -1
- package/dist/server/services/file.js +2 -2
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +1 -1
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/folder.js +9 -6
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +9 -6
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/metrics.js +1 -1
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +1 -1
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/provider.js +3 -4
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs +3 -4
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js +5 -6
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +4 -5
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +2 -2
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +2 -2
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/folder.d.ts.map +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/errors.d.ts +6 -0
- package/dist/server/src/errors.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +6 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts +3 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/routes/validation/upload.d.ts +4 -0
- package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata-provider.d.ts +26 -0
- package/dist/server/src/services/ai-metadata-provider.d.ts.map +1 -0
- package/dist/server/src/services/ai-metadata-strapi-managed.d.ts +7 -0
- package/dist/server/src/services/ai-metadata-strapi-managed.d.ts.map +1 -0
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +33 -1
- package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
- package/dist/server/src/services/folder.d.ts +5 -2
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +6 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/provider.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/utils/images.d.ts +2 -2
- package/dist/server/src/utils/images.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/images.js +6 -7
- package/dist/server/utils/images.js.map +1 -1
- package/dist/server/utils/images.mjs +6 -7
- package/dist/server/utils/images.mjs.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/contracts/settings.d.ts +6 -0
- package/package.json +11 -11
- package/dist/admin/legacy/hooks/useAiAvailability.js +0 -22
- package/dist/admin/legacy/hooks/useAiAvailability.js.map +0 -1
- package/dist/admin/legacy/hooks/useAiAvailability.mjs +0 -20
- package/dist/admin/legacy/hooks/useAiAvailability.mjs.map +0 -1
- package/dist/admin/src/legacy/hooks/useAiAvailability.d.ts +0 -4
|
@@ -1,142 +1,48 @@
|
|
|
1
|
-
import { jsxs, Fragment
|
|
2
|
-
import { useState, useMemo } from 'react';
|
|
3
|
-
import { useClipboard, useNotification } from '@strapi/admin/strapi-admin';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
2
|
import { Menu, IconButton } from '@strapi/design-system';
|
|
5
|
-
import { More
|
|
3
|
+
import { More } from '@strapi/icons';
|
|
6
4
|
import { useIntl } from 'react-intl';
|
|
7
5
|
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
8
|
-
import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
|
|
9
|
-
import { folderKey } from '../utils/selection.mjs';
|
|
10
6
|
import { ActionsMenuContent } from './ActionsMenuContent.mjs';
|
|
11
|
-
import {
|
|
12
|
-
import { DeleteItemsDialog } from './DeleteItemsDialog.mjs';
|
|
13
|
-
import { FolderFormDialog } from './FolderFormDialog.mjs';
|
|
7
|
+
import { FolderActions } from './FolderActions.mjs';
|
|
14
8
|
|
|
15
9
|
/**
|
|
16
10
|
* The "..." menu on a folder row/card. Always acts on that one folder, whatever
|
|
17
|
-
* the current multi-selection is (the bulk actions bar
|
|
18
|
-
*
|
|
19
|
-
* while open.
|
|
11
|
+
* the current multi-selection is (the bulk actions bar and the right-click menu
|
|
12
|
+
* are the selection-scoped affordances).
|
|
20
13
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* `folder:<id>` key for a folder that no longer lives where the selection thinks
|
|
24
|
-
* it does would linger. A rename leaves the id valid and the folder in place, so
|
|
25
|
-
* it touches the selection not at all.
|
|
14
|
+
* The actions themselves live in `FolderActions`, shared with
|
|
15
|
+
* `FolderContextMenu`. This component is only the trigger.
|
|
26
16
|
*/ const FolderActionsMenu = ({ folder, dragData })=>{
|
|
27
17
|
const { formatMessage } = useIntl();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const [isMoveOpen, setIsMoveOpen] = useState(false);
|
|
33
|
-
const [isDeleteOpen, setIsDeleteOpen] = useState(false);
|
|
34
|
-
// Stable identity: the move dialog memoizes its destination walk on it.
|
|
35
|
-
const moveItems = useMemo(()=>[
|
|
36
|
-
dragData
|
|
37
|
-
], [
|
|
38
|
-
dragData
|
|
39
|
-
]);
|
|
40
|
-
// Built from window.location so the link inherits whatever path the library is
|
|
41
|
-
// mounted at. Every other query param (search, sort, open drawer) is dropped —
|
|
42
|
-
// this is a clean deep-link to the folder.
|
|
43
|
-
const handleCopyLink = async ()=>{
|
|
44
|
-
const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;
|
|
45
|
-
const didCopy = await copy(url);
|
|
46
|
-
toggleNotification({
|
|
47
|
-
type: didCopy ? 'success' : 'danger',
|
|
48
|
-
message: formatMessage(didCopy ? {
|
|
49
|
-
id: getTranslationKey('list.folder.actions.copy-link.success'),
|
|
50
|
-
defaultMessage: 'Folder link copied.'
|
|
51
|
-
} : {
|
|
52
|
-
id: getTranslationKey('list.folder.actions.copy-link.error'),
|
|
53
|
-
defaultMessage: 'Failed to copy the folder link.'
|
|
54
|
-
})
|
|
55
|
-
});
|
|
56
|
-
};
|
|
57
|
-
return /*#__PURE__*/ jsxs(Fragment, {
|
|
58
|
-
children: [
|
|
59
|
-
/*#__PURE__*/ jsxs(Menu.Root, {
|
|
60
|
-
modal: false,
|
|
18
|
+
return /*#__PURE__*/ jsx(FolderActions, {
|
|
19
|
+
folder: folder,
|
|
20
|
+
dragData: dragData,
|
|
21
|
+
children: ({ items, dialogs })=>/*#__PURE__*/ jsxs(Fragment, {
|
|
61
22
|
children: [
|
|
62
|
-
/*#__PURE__*/
|
|
63
|
-
|
|
64
|
-
icon: /*#__PURE__*/ jsx(More, {}),
|
|
65
|
-
variant: "ghost",
|
|
66
|
-
label: formatMessage({
|
|
67
|
-
id: getTranslationKey('control-card.more-actions'),
|
|
68
|
-
defaultMessage: 'More actions'
|
|
69
|
-
})
|
|
70
|
-
}),
|
|
71
|
-
/*#__PURE__*/ jsxs(ActionsMenuContent, {
|
|
72
|
-
popoverPlacement: "bottom-end",
|
|
73
|
-
zIndex: 2,
|
|
74
|
-
minWidth: "22rem",
|
|
23
|
+
/*#__PURE__*/ jsxs(Menu.Root, {
|
|
24
|
+
modal: false,
|
|
75
25
|
children: [
|
|
76
|
-
/*#__PURE__*/ jsx(Menu.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}),
|
|
84
|
-
/*#__PURE__*/ jsx(Menu.Separator, {}),
|
|
85
|
-
/*#__PURE__*/ jsx(Menu.Item, {
|
|
86
|
-
startIcon: /*#__PURE__*/ jsx(Pencil, {}),
|
|
87
|
-
onSelect: ()=>setIsRenameOpen(true),
|
|
88
|
-
children: formatMessage({
|
|
89
|
-
id: getTranslationKey('list.folder.actions.rename'),
|
|
90
|
-
defaultMessage: 'Rename folder'
|
|
26
|
+
/*#__PURE__*/ jsx(Menu.Trigger, {
|
|
27
|
+
tag: IconButton,
|
|
28
|
+
icon: /*#__PURE__*/ jsx(More, {}),
|
|
29
|
+
variant: "ghost",
|
|
30
|
+
label: formatMessage({
|
|
31
|
+
id: getTranslationKey('control-card.more-actions'),
|
|
32
|
+
defaultMessage: 'More actions'
|
|
91
33
|
})
|
|
92
34
|
}),
|
|
93
|
-
/*#__PURE__*/ jsx(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
defaultMessage: 'Move to folder'
|
|
99
|
-
})
|
|
100
|
-
}),
|
|
101
|
-
/*#__PURE__*/ jsx(Menu.Item, {
|
|
102
|
-
startIcon: /*#__PURE__*/ jsx(Trash, {}),
|
|
103
|
-
variant: "danger",
|
|
104
|
-
onSelect: ()=>setIsDeleteOpen(true),
|
|
105
|
-
children: formatMessage({
|
|
106
|
-
id: getTranslationKey('list.folder.actions.delete'),
|
|
107
|
-
defaultMessage: 'Delete folder'
|
|
108
|
-
})
|
|
35
|
+
/*#__PURE__*/ jsx(ActionsMenuContent, {
|
|
36
|
+
popoverPlacement: "bottom-end",
|
|
37
|
+
zIndex: 2,
|
|
38
|
+
minWidth: "22rem",
|
|
39
|
+
children: items
|
|
109
40
|
})
|
|
110
41
|
]
|
|
111
|
-
})
|
|
42
|
+
}),
|
|
43
|
+
dialogs
|
|
112
44
|
]
|
|
113
|
-
}),
|
|
114
|
-
isRenameOpen && /*#__PURE__*/ jsx(FolderFormDialog, {
|
|
115
|
-
open: true,
|
|
116
|
-
mode: "rename",
|
|
117
|
-
folderId: folder.id,
|
|
118
|
-
initialName: folder.name,
|
|
119
|
-
parentFolderId: dragData.parentId,
|
|
120
|
-
onClose: ()=>setIsRenameOpen(false)
|
|
121
|
-
}),
|
|
122
|
-
isMoveOpen && /*#__PURE__*/ jsx(BulkMoveDialog, {
|
|
123
|
-
open: true,
|
|
124
|
-
onClose: ()=>setIsMoveOpen(false),
|
|
125
|
-
items: moveItems,
|
|
126
|
-
onSuccess: ()=>deselect(folderKey(folder.id))
|
|
127
|
-
}),
|
|
128
|
-
isDeleteOpen && /*#__PURE__*/ jsx(DeleteItemsDialog, {
|
|
129
|
-
open: true,
|
|
130
|
-
onClose: ()=>setIsDeleteOpen(false),
|
|
131
|
-
target: {
|
|
132
|
-
fileIds: [],
|
|
133
|
-
folderIds: [
|
|
134
|
-
folder.id
|
|
135
|
-
]
|
|
136
|
-
},
|
|
137
|
-
onSuccess: ()=>deselect(folderKey(folder.id))
|
|
138
45
|
})
|
|
139
|
-
]
|
|
140
46
|
});
|
|
141
47
|
};
|
|
142
48
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FolderActionsMenu.mjs","sources":["../../../../../admin/src/pages/Assets/components/FolderActionsMenu.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { useClipboard, useNotification } from '@strapi/admin/strapi-admin';\nimport { IconButton, Menu } from '@strapi/design-system';\nimport { ArrowRight, Link, More, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { folderKey } from '../utils/selection';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { BulkMoveDialog } from './BulkMoveDialog';\nimport { DeleteItemsDialog } from './DeleteItemsDialog';\nimport { FolderFormDialog } from './FolderFormDialog';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsMenuProps {\n folder: Folder;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n}\n\n/**\n * The \"...\" menu on a folder row/card. Always acts on that one folder, whatever\n * the current multi-selection is (the bulk actions bar is the selection-scoped\n * affordance). It reuses the shared move and delete dialogs, which mount only\n * while open.\n *\n * A successful move or delete deselects this one folder and leaves the rest of\n * the selection intact: they only invalidate RTK tags, so without it a\n * `folder:<id>` key for a folder that no longer lives where the selection thinks\n * it does would linger. A rename leaves the id valid and the folder in place, so\n * it touches the selection not at all.\n */\nexport const FolderActionsMenu = ({ folder, dragData }: FolderActionsMenuProps) => {\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n const { toggleNotification } = useNotification();\n const { deselect } = useAssetSelection();\n const [isRenameOpen, setIsRenameOpen] = useState(false);\n const [isMoveOpen, setIsMoveOpen] = useState(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState(false);\n\n // Stable identity: the move dialog memoizes its destination walk on it.\n const moveItems = useMemo(() => [dragData], [dragData]);\n\n // Built from window.location so the link inherits whatever path the library is\n // mounted at. Every other query param (search, sort, open drawer) is dropped —\n // this is a clean deep-link to the folder.\n const handleCopyLink = async () => {\n const url = `${window.location.origin}${window.location.pathname}?folder=${folder.id}`;\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('list.folder.actions.copy-link.success'),\n defaultMessage: 'Folder link copied.',\n }\n : {\n id: getTranslationKey('list.folder.actions.copy-link.error'),\n defaultMessage: 'Failed to copy the folder link.',\n }\n ),\n });\n };\n\n return (\n <>\n {/* See AssetActionsMenu: non-modal so clicking another row's trigger\n closes this menu and opens that one in a single click. */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* See ActionsMenuContent: the design system's 15rem default clamps the\n menu against a hidden scrollbar, so items can be silently cut off\n near the viewport edge. This one is shorter, but kept in sync. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n <Menu.Item startIcon={<Link />} onSelect={handleCopyLink}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.copy-link'),\n defaultMessage: 'Copy link to folder',\n })}\n </Menu.Item>\n <Menu.Separator />\n {/* TODO: gate Rename, Move and Delete on `assets.canUpdate` CMS-387 */}\n <Menu.Item startIcon={<Pencil />} onSelect={() => setIsRenameOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.rename'),\n defaultMessage: 'Rename folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<ArrowRight />} onSelect={() => setIsMoveOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.move'),\n defaultMessage: 'Move to folder',\n })}\n </Menu.Item>\n <Menu.Item startIcon={<Trash />} variant=\"danger\" onSelect={() => setIsDeleteOpen(true)}>\n {formatMessage({\n id: getTranslationKey('list.folder.actions.delete'),\n defaultMessage: 'Delete folder',\n })}\n </Menu.Item>\n </ActionsMenuContent>\n </Menu.Root>\n {/* These dialogs live inside the row, so a background refetch that drops\n the row would take an open dialog with it. Nothing invalidates until\n the mutation resolves, and the dialog closes in the same tick, so the\n flows themselves can't trigger it. */}\n {isRenameOpen && (\n <FolderFormDialog\n open\n mode=\"rename\"\n folderId={folder.id}\n initialName={folder.name}\n parentFolderId={dragData.parentId}\n onClose={() => setIsRenameOpen(false)}\n />\n )}\n {isMoveOpen && (\n <BulkMoveDialog\n open\n onClose={() => setIsMoveOpen(false)}\n items={moveItems}\n onSuccess={() => deselect(folderKey(folder.id))}\n />\n )}\n {isDeleteOpen && (\n <DeleteItemsDialog\n open\n onClose={() => setIsDeleteOpen(false)}\n target={{ fileIds: [], folderIds: [folder.id] }}\n onSuccess={() => deselect(folderKey(folder.id))}\n />\n )}\n </>\n );\n};\n"],"names":["FolderActionsMenu","folder","dragData","formatMessage","useIntl","copy","useClipboard","toggleNotification","useNotification","deselect","useAssetSelection","isRenameOpen","setIsRenameOpen","useState","isMoveOpen","setIsMoveOpen","isDeleteOpen","setIsDeleteOpen","moveItems","useMemo","handleCopyLink","url","window","location","origin","pathname","id","didCopy","type","message","getTranslationKey","defaultMessage","_jsxs","_Fragment","Menu","Root","modal","_jsx","Trigger","tag","IconButton","icon","More","variant","label","ActionsMenuContent","popoverPlacement","zIndex","minWidth","Item","startIcon","Link","onSelect","Separator","Pencil","ArrowRight","Trash","FolderFormDialog","open","mode","folderId","initialName","name","parentFolderId","parentId","onClose","BulkMoveDialog","items","onSuccess","folderKey","DeleteItemsDialog","target","fileIds","folderIds"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FolderActionsMenu.mjs","sources":["../../../../../admin/src/pages/Assets/components/FolderActionsMenu.tsx"],"sourcesContent":["import { IconButton, Menu } from '@strapi/design-system';\nimport { More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\nimport { FolderActions } from './FolderActions';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderActionsMenuProps {\n folder: Folder;\n /** Drag data for this folder, so the move dialog validates against its real parent. */\n dragData: DragFolderData;\n}\n\n/**\n * The \"...\" menu on a folder row/card. Always acts on that one folder, whatever\n * the current multi-selection is (the bulk actions bar and the right-click menu\n * are the selection-scoped affordances).\n *\n * The actions themselves live in `FolderActions`, shared with\n * `FolderContextMenu`. This component is only the trigger.\n */\nexport const FolderActionsMenu = ({ folder, dragData }: FolderActionsMenuProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <FolderActions folder={folder} dragData={dragData}>\n {({ items, dialogs }) => (\n <>\n {/* See AssetActionsMenu: non-modal so clicking another row's trigger\n closes this menu and opens that one in a single click. */}\n <Menu.Root modal={false}>\n <Menu.Trigger\n tag={IconButton}\n icon={<More />}\n variant=\"ghost\"\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n />\n {/* See ActionsMenuContent: the design system's 15rem default clamps the\n menu against a hidden scrollbar, so items can be silently cut off\n near the viewport edge. This one is shorter, but kept in sync. */}\n <ActionsMenuContent popoverPlacement=\"bottom-end\" zIndex={2} minWidth=\"22rem\">\n {items}\n </ActionsMenuContent>\n </Menu.Root>\n {dialogs}\n </>\n )}\n </FolderActions>\n );\n};\n"],"names":["FolderActionsMenu","folder","dragData","formatMessage","useIntl","_jsx","FolderActions","items","dialogs","_jsxs","_Fragment","Menu","Root","modal","Trigger","tag","IconButton","icon","More","variant","label","id","getTranslationKey","defaultMessage","ActionsMenuContent","popoverPlacement","zIndex","minWidth"],"mappings":";;;;;;;;AAkBA;;;;;;;UAQaA,iBAAAA,GAAoB,CAAC,EAAEC,MAAM,EAAEC,QAAQ,EAA0B,GAAA;IAC5E,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,qBACEC,GAAA,CAACC,aAAAA,EAAAA;QAAcL,MAAAA,EAAQA,MAAAA;QAAQC,QAAAA,EAAUA,QAAAA;AACtC,QAAA,QAAA,EAAA,CAAC,EAAEK,KAAK,EAAEC,OAAO,EAAE,iBAClBC,IAAA,CAAAC,QAAA,EAAA;;AAGE,kCAAAD,IAAA,CAACE,KAAKC,IAAI,EAAA;wBAACC,KAAAA,EAAO,KAAA;;AAChB,0CAAAR,GAAA,CAACM,KAAKG,OAAO,EAAA;gCACXC,GAAAA,EAAKC,UAAAA;AACLC,gCAAAA,IAAAA,gBAAMZ,GAAA,CAACa,IAAAA,EAAAA,EAAAA,CAAAA;gCACPC,OAAAA,EAAQ,OAAA;AACRC,gCAAAA,KAAAA,EAAOjB,aAAAA,CAAc;AACnBkB,oCAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2BAAA,CAAA;oCACtBC,cAAAA,EAAgB;AAClB,iCAAA;;0CAKFlB,GAAA,CAACmB,kBAAAA,EAAAA;gCAAmBC,gBAAAA,EAAiB,YAAA;gCAAaC,MAAAA,EAAQ,CAAA;gCAAGC,QAAAA,EAAS,OAAA;AACnEpB,gCAAAA,QAAAA,EAAAA;;;;AAGJC,oBAAAA;;;;AAKX;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var reactIntl = require('react-intl');
|
|
6
|
+
var translations = require('../../../utils/translations.js');
|
|
7
|
+
var CursorAnchoredMenu = require('./CursorAnchoredMenu.js');
|
|
8
|
+
var FolderActions = require('./FolderActions.js');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The right-click twin of `FolderActionsMenu`: same actions, opened at the
|
|
12
|
+
* cursor. Mirrors `AssetContextMenu`, including keeping "the menu is shut" and
|
|
13
|
+
* "this is unmounted" as separate things — a dialog opened from an item is
|
|
14
|
+
* rendered here and would go with an early unmount.
|
|
15
|
+
*/ const FolderContextMenu = ({ folder, dragData, showRename, position, returnFocusTo, onClose })=>{
|
|
16
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
17
|
+
const [isMenuOpen, setIsMenuOpen] = React.useState(true);
|
|
18
|
+
return /*#__PURE__*/ jsxRuntime.jsx(FolderActions.FolderActions, {
|
|
19
|
+
folder: folder,
|
|
20
|
+
dragData: dragData,
|
|
21
|
+
showRename: showRename,
|
|
22
|
+
children: ({ items, dialogs, isBusy })=>/*#__PURE__*/ jsxRuntime.jsx(FolderContextMenuBody, {
|
|
23
|
+
isBusy: isBusy,
|
|
24
|
+
isMenuOpen: isMenuOpen,
|
|
25
|
+
onMenuClose: ()=>setIsMenuOpen(false),
|
|
26
|
+
onClose: onClose,
|
|
27
|
+
position: position,
|
|
28
|
+
returnFocusTo: returnFocusTo,
|
|
29
|
+
label: formatMessage({
|
|
30
|
+
id: translations.getTranslationKey('list.folder.context-menu.label'),
|
|
31
|
+
defaultMessage: 'Folder actions'
|
|
32
|
+
}),
|
|
33
|
+
items: items,
|
|
34
|
+
dialogs: dialogs
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Split out because the "nothing left on screen" effect can't run inside the
|
|
40
|
+
* render prop above — hooks don't belong in a callback.
|
|
41
|
+
*/ const FolderContextMenuBody = ({ isBusy, isMenuOpen, onMenuClose, onClose, position, returnFocusTo, label, items, dialogs })=>{
|
|
42
|
+
React.useEffect(()=>{
|
|
43
|
+
if (!isMenuOpen && !isBusy) {
|
|
44
|
+
onClose();
|
|
45
|
+
}
|
|
46
|
+
}, [
|
|
47
|
+
isMenuOpen,
|
|
48
|
+
isBusy,
|
|
49
|
+
onClose
|
|
50
|
+
]);
|
|
51
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
52
|
+
children: [
|
|
53
|
+
/*#__PURE__*/ jsxRuntime.jsx(CursorAnchoredMenu.CursorAnchoredMenu, {
|
|
54
|
+
position: position,
|
|
55
|
+
open: isMenuOpen,
|
|
56
|
+
label: label,
|
|
57
|
+
returnFocusTo: returnFocusTo,
|
|
58
|
+
onClose: onMenuClose,
|
|
59
|
+
children: items
|
|
60
|
+
}),
|
|
61
|
+
dialogs
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
exports.FolderContextMenu = FolderContextMenu;
|
|
67
|
+
//# sourceMappingURL=FolderContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderContextMenu.js","sources":["../../../../../admin/src/pages/Assets/components/FolderContextMenu.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { CursorAnchoredMenu, type CursorPosition } from './CursorAnchoredMenu';\nimport { FolderActions } from './FolderActions';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderContextMenuProps {\n folder: Pick<Folder, 'id' | 'name'>;\n dragData: DragFolderData;\n /** Passed through — the folder tree offers the menu without Rename. */\n showRename?: boolean;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n /** Mounted only while it has something on screen, so the parent drops it on this. */\n onClose: () => void;\n}\n\n/**\n * The right-click twin of `FolderActionsMenu`: same actions, opened at the\n * cursor. Mirrors `AssetContextMenu`, including keeping \"the menu is shut\" and\n * \"this is unmounted\" as separate things — a dialog opened from an item is\n * rendered here and would go with an early unmount.\n */\nexport const FolderContextMenu = ({\n folder,\n dragData,\n showRename,\n position,\n returnFocusTo,\n onClose,\n}: FolderContextMenuProps) => {\n const { formatMessage } = useIntl();\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n\n return (\n <FolderActions folder={folder} dragData={dragData} showRename={showRename}>\n {({ items, dialogs, isBusy }) => (\n <FolderContextMenuBody\n isBusy={isBusy}\n isMenuOpen={isMenuOpen}\n onMenuClose={() => setIsMenuOpen(false)}\n onClose={onClose}\n position={position}\n returnFocusTo={returnFocusTo}\n label={formatMessage({\n id: getTranslationKey('list.folder.context-menu.label'),\n defaultMessage: 'Folder actions',\n })}\n items={items}\n dialogs={dialogs}\n />\n )}\n </FolderActions>\n );\n};\n\ninterface FolderContextMenuBodyProps {\n isBusy: boolean;\n isMenuOpen: boolean;\n onMenuClose: () => void;\n onClose: () => void;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n label: string;\n items: ReactNode;\n dialogs: ReactNode;\n}\n\n/**\n * Split out because the \"nothing left on screen\" effect can't run inside the\n * render prop above — hooks don't belong in a callback.\n */\nconst FolderContextMenuBody = ({\n isBusy,\n isMenuOpen,\n onMenuClose,\n onClose,\n position,\n returnFocusTo,\n label,\n items,\n dialogs,\n}: FolderContextMenuBodyProps) => {\n useEffect(() => {\n if (!isMenuOpen && !isBusy) {\n onClose();\n }\n }, [isMenuOpen, isBusy, onClose]);\n\n return (\n <>\n <CursorAnchoredMenu\n position={position}\n open={isMenuOpen}\n label={label}\n returnFocusTo={returnFocusTo}\n onClose={onMenuClose}\n >\n {items}\n </CursorAnchoredMenu>\n {dialogs}\n </>\n );\n};\n"],"names":["FolderContextMenu","folder","dragData","showRename","position","returnFocusTo","onClose","formatMessage","useIntl","isMenuOpen","setIsMenuOpen","useState","_jsx","FolderActions","items","dialogs","isBusy","FolderContextMenuBody","onMenuClose","label","id","getTranslationKey","defaultMessage","useEffect","_jsxs","_Fragment","CursorAnchoredMenu","open"],"mappings":";;;;;;;;;AAuBA;;;;;AAKC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,QAAQ,EACRC,aAAa,EACbC,OAAO,EACgB,GAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,cAAAA,CAAS,IAAA,CAAA;AAE7C,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;QAAcZ,MAAAA,EAAQA,MAAAA;QAAQC,QAAAA,EAAUA,QAAAA;QAAUC,UAAAA,EAAYA,UAAAA;kBAC5D,CAAC,EAAEW,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAE,iBAC1BJ,cAAA,CAACK,qBAAAA,EAAAA;gBACCD,MAAAA,EAAQA,MAAAA;gBACRP,UAAAA,EAAYA,UAAAA;AACZS,gBAAAA,WAAAA,EAAa,IAAMR,aAAAA,CAAc,KAAA,CAAA;gBACjCJ,OAAAA,EAASA,OAAAA;gBACTF,QAAAA,EAAUA,QAAAA;gBACVC,aAAAA,EAAeA,aAAAA;AACfc,gBAAAA,KAAAA,EAAOZ,aAAAA,CAAc;AACnBa,oBAAAA,EAAAA,EAAIC,8BAAAA,CAAkB,gCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAR,KAAAA,EAAOA,KAAAA;gBACPC,OAAAA,EAASA;;;AAKnB;AAcA;;;IAIA,MAAME,wBAAwB,CAAC,EAC7BD,MAAM,EACNP,UAAU,EACVS,WAAW,EACXZ,OAAO,EACPF,QAAQ,EACRC,aAAa,EACbc,KAAK,EACLL,KAAK,EACLC,OAAO,EACoB,GAAA;IAC3BQ,eAAAA,CAAU,IAAA;QACR,IAAI,CAACd,UAAAA,IAAc,CAACO,MAAAA,EAAQ;AAC1BV,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACG,QAAAA,UAAAA;AAAYO,QAAAA,MAAAA;AAAQV,QAAAA;AAAQ,KAAA,CAAA;IAEhC,qBACEkB,eAAA,CAAAC,mBAAA,EAAA;;0BACEb,cAAA,CAACc,qCAAAA,EAAAA;gBACCtB,QAAAA,EAAUA,QAAAA;gBACVuB,IAAAA,EAAMlB,UAAAA;gBACNU,KAAAA,EAAOA,KAAAA;gBACPd,aAAAA,EAAeA,aAAAA;gBACfC,OAAAA,EAASY,WAAAA;AAERJ,gBAAAA,QAAAA,EAAAA;;AAEFC,YAAAA;;;AAGP,CAAA;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
4
|
+
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
5
|
+
import { CursorAnchoredMenu } from './CursorAnchoredMenu.mjs';
|
|
6
|
+
import { FolderActions } from './FolderActions.mjs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The right-click twin of `FolderActionsMenu`: same actions, opened at the
|
|
10
|
+
* cursor. Mirrors `AssetContextMenu`, including keeping "the menu is shut" and
|
|
11
|
+
* "this is unmounted" as separate things — a dialog opened from an item is
|
|
12
|
+
* rendered here and would go with an early unmount.
|
|
13
|
+
*/ const FolderContextMenu = ({ folder, dragData, showRename, position, returnFocusTo, onClose })=>{
|
|
14
|
+
const { formatMessage } = useIntl();
|
|
15
|
+
const [isMenuOpen, setIsMenuOpen] = useState(true);
|
|
16
|
+
return /*#__PURE__*/ jsx(FolderActions, {
|
|
17
|
+
folder: folder,
|
|
18
|
+
dragData: dragData,
|
|
19
|
+
showRename: showRename,
|
|
20
|
+
children: ({ items, dialogs, isBusy })=>/*#__PURE__*/ jsx(FolderContextMenuBody, {
|
|
21
|
+
isBusy: isBusy,
|
|
22
|
+
isMenuOpen: isMenuOpen,
|
|
23
|
+
onMenuClose: ()=>setIsMenuOpen(false),
|
|
24
|
+
onClose: onClose,
|
|
25
|
+
position: position,
|
|
26
|
+
returnFocusTo: returnFocusTo,
|
|
27
|
+
label: formatMessage({
|
|
28
|
+
id: getTranslationKey('list.folder.context-menu.label'),
|
|
29
|
+
defaultMessage: 'Folder actions'
|
|
30
|
+
}),
|
|
31
|
+
items: items,
|
|
32
|
+
dialogs: dialogs
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Split out because the "nothing left on screen" effect can't run inside the
|
|
38
|
+
* render prop above — hooks don't belong in a callback.
|
|
39
|
+
*/ const FolderContextMenuBody = ({ isBusy, isMenuOpen, onMenuClose, onClose, position, returnFocusTo, label, items, dialogs })=>{
|
|
40
|
+
useEffect(()=>{
|
|
41
|
+
if (!isMenuOpen && !isBusy) {
|
|
42
|
+
onClose();
|
|
43
|
+
}
|
|
44
|
+
}, [
|
|
45
|
+
isMenuOpen,
|
|
46
|
+
isBusy,
|
|
47
|
+
onClose
|
|
48
|
+
]);
|
|
49
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
50
|
+
children: [
|
|
51
|
+
/*#__PURE__*/ jsx(CursorAnchoredMenu, {
|
|
52
|
+
position: position,
|
|
53
|
+
open: isMenuOpen,
|
|
54
|
+
label: label,
|
|
55
|
+
returnFocusTo: returnFocusTo,
|
|
56
|
+
onClose: onMenuClose,
|
|
57
|
+
children: items
|
|
58
|
+
}),
|
|
59
|
+
dialogs
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export { FolderContextMenu };
|
|
65
|
+
//# sourceMappingURL=FolderContextMenu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderContextMenu.mjs","sources":["../../../../../admin/src/pages/Assets/components/FolderContextMenu.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport { CursorAnchoredMenu, type CursorPosition } from './CursorAnchoredMenu';\nimport { FolderActions } from './FolderActions';\n\nimport type { Folder } from '../../../../../shared/contracts/folders';\nimport type { DragFolderData } from '../../../types/dnd';\n\ninterface FolderContextMenuProps {\n folder: Pick<Folder, 'id' | 'name'>;\n dragData: DragFolderData;\n /** Passed through — the folder tree offers the menu without Rename. */\n showRename?: boolean;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n /** Mounted only while it has something on screen, so the parent drops it on this. */\n onClose: () => void;\n}\n\n/**\n * The right-click twin of `FolderActionsMenu`: same actions, opened at the\n * cursor. Mirrors `AssetContextMenu`, including keeping \"the menu is shut\" and\n * \"this is unmounted\" as separate things — a dialog opened from an item is\n * rendered here and would go with an early unmount.\n */\nexport const FolderContextMenu = ({\n folder,\n dragData,\n showRename,\n position,\n returnFocusTo,\n onClose,\n}: FolderContextMenuProps) => {\n const { formatMessage } = useIntl();\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n\n return (\n <FolderActions folder={folder} dragData={dragData} showRename={showRename}>\n {({ items, dialogs, isBusy }) => (\n <FolderContextMenuBody\n isBusy={isBusy}\n isMenuOpen={isMenuOpen}\n onMenuClose={() => setIsMenuOpen(false)}\n onClose={onClose}\n position={position}\n returnFocusTo={returnFocusTo}\n label={formatMessage({\n id: getTranslationKey('list.folder.context-menu.label'),\n defaultMessage: 'Folder actions',\n })}\n items={items}\n dialogs={dialogs}\n />\n )}\n </FolderActions>\n );\n};\n\ninterface FolderContextMenuBodyProps {\n isBusy: boolean;\n isMenuOpen: boolean;\n onMenuClose: () => void;\n onClose: () => void;\n position: CursorPosition;\n returnFocusTo: HTMLElement | null;\n label: string;\n items: ReactNode;\n dialogs: ReactNode;\n}\n\n/**\n * Split out because the \"nothing left on screen\" effect can't run inside the\n * render prop above — hooks don't belong in a callback.\n */\nconst FolderContextMenuBody = ({\n isBusy,\n isMenuOpen,\n onMenuClose,\n onClose,\n position,\n returnFocusTo,\n label,\n items,\n dialogs,\n}: FolderContextMenuBodyProps) => {\n useEffect(() => {\n if (!isMenuOpen && !isBusy) {\n onClose();\n }\n }, [isMenuOpen, isBusy, onClose]);\n\n return (\n <>\n <CursorAnchoredMenu\n position={position}\n open={isMenuOpen}\n label={label}\n returnFocusTo={returnFocusTo}\n onClose={onMenuClose}\n >\n {items}\n </CursorAnchoredMenu>\n {dialogs}\n </>\n );\n};\n"],"names":["FolderContextMenu","folder","dragData","showRename","position","returnFocusTo","onClose","formatMessage","useIntl","isMenuOpen","setIsMenuOpen","useState","_jsx","FolderActions","items","dialogs","isBusy","FolderContextMenuBody","onMenuClose","label","id","getTranslationKey","defaultMessage","useEffect","_jsxs","_Fragment","CursorAnchoredMenu","open"],"mappings":";;;;;;;AAuBA;;;;;AAKC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,QAAQ,EACRC,aAAa,EACbC,OAAO,EACgB,GAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,QAAAA,CAAS,IAAA,CAAA;AAE7C,IAAA,qBACEC,GAAA,CAACC,aAAAA,EAAAA;QAAcZ,MAAAA,EAAQA,MAAAA;QAAQC,QAAAA,EAAUA,QAAAA;QAAUC,UAAAA,EAAYA,UAAAA;kBAC5D,CAAC,EAAEW,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAE,iBAC1BJ,GAAA,CAACK,qBAAAA,EAAAA;gBACCD,MAAAA,EAAQA,MAAAA;gBACRP,UAAAA,EAAYA,UAAAA;AACZS,gBAAAA,WAAAA,EAAa,IAAMR,aAAAA,CAAc,KAAA,CAAA;gBACjCJ,OAAAA,EAASA,OAAAA;gBACTF,QAAAA,EAAUA,QAAAA;gBACVC,aAAAA,EAAeA,aAAAA;AACfc,gBAAAA,KAAAA,EAAOZ,aAAAA,CAAc;AACnBa,oBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,gCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAR,KAAAA,EAAOA,KAAAA;gBACPC,OAAAA,EAASA;;;AAKnB;AAcA;;;IAIA,MAAME,wBAAwB,CAAC,EAC7BD,MAAM,EACNP,UAAU,EACVS,WAAW,EACXZ,OAAO,EACPF,QAAQ,EACRC,aAAa,EACbc,KAAK,EACLL,KAAK,EACLC,OAAO,EACoB,GAAA;IAC3BQ,SAAAA,CAAU,IAAA;QACR,IAAI,CAACd,UAAAA,IAAc,CAACO,MAAAA,EAAQ;AAC1BV,YAAAA,OAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACG,QAAAA,UAAAA;AAAYO,QAAAA,MAAAA;AAAQV,QAAAA;AAAQ,KAAA,CAAA;IAEhC,qBACEkB,IAAA,CAAAC,QAAA,EAAA;;0BACEb,GAAA,CAACc,kBAAAA,EAAAA;gBACCtB,QAAAA,EAAUA,QAAAA;gBACVuB,IAAAA,EAAMlB,UAAAA;gBACNU,KAAAA,EAAOA,KAAAA;gBACPd,aAAAA,EAAeA,aAAAA;gBACfC,OAAAA,EAASY,WAAAA;AAERJ,gBAAAA,QAAAA,EAAAA;;AAEFC,YAAAA;;;AAGP,CAAA;;;;"}
|