@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsTable.mjs","sources":["../../../../../admin/src/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsDesktop } from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Flex,\n Loader,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Tooltip,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { TruncatedText } from '../../../components/TruncatedText';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { isEventFromWithin } from '../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS, TABLE_HEADERS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { type MixedItem } from '../utils/mergeMixedList';\nimport { buildRenderedKeys } from '../utils/renderedKeys';\nimport { assetKey, folderKey, getSelectAllState, type ItemKey } from '../utils/selection';\n\nimport { AssetActionsMenu } from './AssetActionsMenu';\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\nimport { FolderActionsMenu } from './FolderActionsMenu';\n\nimport type { File } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n\n /* An auto layout lets every column but the name size itself to its content,\n so the dates never wrap. The name cell is what absorbs the leftover and\n ellipsizes — see NameTd. */\n table-layout: auto;\n\n & td:last-child,\n & th:last-child {\n width: 5.6rem;\n white-space: nowrap;\n }\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\n/**\n * Column sizing, applied to the header and body cells alike.\n *\n * `hug` shrinks a column to its content: `width: 1%` is a floor the content\n * overrides, and `nowrap` stops a date breaking across lines.\n *\n * `flex` claims everything left over. `width: 100%` asks for all of it and\n * `max-width: 0` is what allows the cell to be narrower than its content, which\n * is what lets the name inside ellipsize instead of widening the table.\n */\nconst hugColumn = css`\n width: 1%;\n white-space: nowrap;\n`;\n\nconst flexColumn = css`\n width: 100%;\n max-width: 0;\n overflow: hidden;\n`;\n\nconst StyledTh = styled(RawTh)<{ $flex?: boolean }>`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n\n ${({ $flex }) => ($flex ? flexColumn : hugColumn)}\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\n/** The name column: takes whatever the others leave and ellipsizes. */\nconst NameTd = styled(StyledTd)`\n ${flexColumn}\n`;\n\n/** Every other column: as wide as its content, never wrapping. */\nconst HugTd = styled(StyledTd)`\n ${hugColumn}\n`;\n\nconst StyledTr = styled.tr<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isBusy?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n height: 48px;\n user-select: none;\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget }) => {\n if ($isMovePending || $isBusy) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging, $isBusy }) => ($isDragging || $isBusy ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\n// Leading checkbox column. Fixed narrow width so it holds its own column under\n// the mobile fixed table-layout (a 1% width would collapse and let the name\n// cell's preview overlap the control).\nconst CheckboxTd = styled(StyledTd)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\nconst CheckboxTh = styled(StyledTh)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\n// Flags an asset whose caption or alternative text is empty — mirrors the\n// per-field warning shown in the details drawer. Pushed to the far end of the\n// name cell (shrink 0 so a long name never crowds it out).\nconst MetadataWarning = styled(WarningCircle)`\n flex-shrink: 0;\n width: 1.6rem;\n height: 1.6rem;\n\n path {\n fill: ${({ theme }) => theme.colors.warning500};\n }\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the row.\nconst NameButton = styled.button`\n display: inline-flex;\n max-width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\n// Shields the row from its own controls (checkbox, \"...\" trigger) without\n// severing propagation for the menu's portaled content — those events are React\n// children of the cell but not DOM descendants, and Radix needs them to reach\n// `document` to dismiss its layers.\nconst stopRowEvent = (e: React.SyntheticEvent) => {\n if (isEventFromWithin(e)) {\n e.stopPropagation();\n }\n};\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={20} height={20} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetRow = ({ asset, orderedItemKeys, onAssetItemClick }: AssetRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n\n // Caption and alternative text apply to every file type — same \"empty =\n // falsy\" rule as the drawer's per-field warning.\n const isMetadataMissing = !asset.caption || !asset.alternativeText;\n const metadataMissingLabel = formatMessage({\n id: getTranslationKey('list.table.row.metadata-missing'),\n defaultMessage: 'This asset is missing metadata (caption or alternative text).',\n });\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n //\n // The containment guard on this and the handler below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // opening the details drawer or toggling the selection.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Desktop: Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledTr\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n // Right-clicking an item is not the background gesture: the row keeps the\n // browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n onDragStart={(e) => e.preventDefault()}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {/* No checkbox without the update permission (nothing selectable can be\n acted on). Shown at every viewport width otherwise. */}\n {canUpdate && (\n <CheckboxTd {...ASSET_ITEM_CONTROL_PROPS} onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={selected}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <NameTd>\n <Flex alignItems=\"center\" justifyContent=\"space-between\" gap={2} minWidth={0}>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n {/* The row is dimmed and inert while busy; the spinner in place of the\n thumbnail is what says so positively. Its label carries the reason\n to screen readers — the row itself has no other announcement. */}\n {busyMessage !== null ? (\n <Flex justifyContent=\"center\" width=\"3.2rem\" height=\"3.2rem\">\n <Loader small>{busyMessage}</Loader>\n </Flex>\n ) : (\n <AssetPreviewCell asset={asset} />\n )}\n <Flex direction=\"column\" alignItems=\"flex-start\" minWidth={0}>\n <NameButton type=\"button\" onClick={handleNameClick}>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {asset.name}\n </TruncatedText>\n </NameButton>\n {!isDesktop && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n {isMetadataMissing && (\n <Tooltip label={metadataMissingLabel}>\n <MetadataWarning aria-label={metadataMissingLabel} role=\"img\" />\n </Tooltip>\n )}\n </Flex>\n </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </HugTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would open the details drawer). */}\n <StyledTd\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopRowEvent}\n onKeyDown={stopRowEvent}\n onPointerDown={stopRowEvent}\n >\n <Flex justifyContent=\"flex-end\">\n <AssetActionsMenu asset={asset} dragData={dragData} />\n </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\nconst FolderTr = styled(StyledTr)`\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n`;\n\ninterface FolderRowProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderRow = ({ folder, orderedItemKeys }: FolderRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n dragData,\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n\n // Folders share the selection mechanism with assets. Only the plain-click\n // semantic differs: it navigates into the folder instead of selecting it.\n //\n // The containment guard on this and the handlers below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // navigating into the folder or starting a drag.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n // Enter navigates into the folder, Space toggles selection (same as assets).\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <FolderTr\n ref={(node) => {\n setDragRef(node);\n setDropRef(node);\n }}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n tabIndex={0}\n role=\"row\"\n // Right-clicking an item is not the background gesture: the row keeps the\n // browser's own menu. See MainAreaContextMenu.\n data-native-context-menu\n onDragStart={(e: React.DragEvent) => {\n if (isEventFromWithin(e)) {\n e.preventDefault();\n }\n }}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={isSelected(key)}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <NameTd>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral600\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <FolderIcon width={20} height={20} />\n </Flex>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {folder.name}\n </TruncatedText>\n </Flex>\n </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </HugTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would navigate into the folder). */}\n <StyledTd onClick={stopRowEvent} onKeyDown={stopRowEvent} onPointerDown={stopRowEvent}>\n <Flex justifyContent=\"flex-end\">\n <FolderActionsMenu folder={folder} dragData={dragData} />\n </Flex>\n </StyledTd>\n </FolderTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n folders?: Folder[];\n /**\n * When set (\"Folders: Mixed with files\"), rows render in this interleaved\n * order instead of folders-first. Range selection follows the same order.\n */\n mixedItems?: MixedItem[] | null;\n /** Keys of the rendered rows, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = [],\n mixedItems = null,\n renderedKeys,\n onAssetItemClick,\n}: AssetsTableProps) => {\n const isDesktop = useIsDesktop();\n const { formatMessage } = useIntl();\n const { selectedKeys, selectAll, clear } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { trackUsage } = useTracking();\n\n // Below the desktop breakpoint only the name (and actions) column is kept —\n // the date/size columns don't fit; size moves under the name as a subtitle.\n const visibleHeaders = isDesktop\n ? TABLE_HEADERS\n : TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions');\n\n // The checkbox column is a dedicated structural column (not part of\n // TABLE_HEADERS). Hidden only without the update permission — every bulk\n // action needs `assets.update`, so a read-only user has nothing to select for.\n const showCheckboxColumn = canUpdate;\n const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);\n\n const totalRows = folders.length + assets.length;\n\n // Render order — folders first by default, or the interleaved mixed order.\n // Range selection follows it.\n const orderedItemKeys: ItemKey[] =\n renderedKeys ?? buildRenderedKeys({ folders, assets, mixedItems });\n const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, orderedItemKeys);\n\n const handleSelectAll = () => {\n if (allSelected) {\n clear();\n } else {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(orderedItemKeys);\n }\n };\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty table renders nothing at all, not headers over an empty body.\n if (totalRows === 0) {\n return null;\n }\n\n return (\n <StyledTable colCount={colCount} rowCount={(mixedItems ? mixedItems.length : totalRows) + 1}>\n <StyledThead>\n <RawTr>\n {showCheckboxColumn && (\n <CheckboxTh>\n <Flex>\n <Checkbox\n checked={isIndeterminate ? 'indeterminate' : allSelected}\n disabled={orderedItemKeys.length === 0}\n onCheckedChange={handleSelectAll}\n aria-label={formatMessage({\n id: getTranslationKey('list.table.header.select-all'),\n defaultMessage: 'Select all',\n })}\n />\n </Flex>\n </CheckboxTh>\n )}\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name} $flex={header.name === 'name'}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name} $flex={header.name === 'name'}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {mixedItems?.map((item) =>\n item.kind === 'folder' ? (\n <FolderRow\n key={`folder-${item.folder.id}`}\n folder={item.folder}\n orderedItemKeys={orderedItemKeys}\n />\n ) : (\n <AssetRow\n key={item.asset.id}\n asset={item.asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n )\n )}\n {!mixedItems &&\n folders.map((folder) => (\n <FolderRow\n key={`folder-${folder.id}`}\n folder={folder}\n orderedItemKeys={orderedItemKeys}\n />\n ))}\n {!mixedItems &&\n assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n ))}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","hugColumn","css","flexColumn","StyledTh","RawTh","spaces","$flex","StyledTd","RawTd","NameTd","HugTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isBusy","$isInvalidDropTarget","$isDragging","$isValidDropTarget","primary600","CheckboxTd","CheckboxTh","MetadataWarning","WarningCircle","warning500","NameButton","button","stopRowEvent","e","isEventFromWithin","stopPropagation","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","orderedItemKeys","onAssetItemClick","isDesktop","useIsDesktop","formatDate","formatMessage","useIntl","isMovePending","useAssetsDndOptional","attributes","listeners","setNodeRef","isDragging","dragData","useFileDraggable","isSelected","toggle","selectRange","useAssetSelection","canUpdate","useMediaLibraryPermissions","busyMessage","useBusyAssetsOptional","getBusyMessage","id","key","assetKey","selected","isMetadataMissing","caption","alternativeText","metadataMissingLabel","getTranslationKey","defaultMessage","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","ASSET_DETAILS_TRIGGER_PROPS","tabIndex","role","data-native-context-menu","onDragStart","onClick","onKeyDown","onPointerDown","ASSET_ITEM_CONTROL_PROPS","Checkbox","checked","aria-label","name","gap","minWidth","Loader","small","direction","type","TruncatedText","textColor","fontWeight","Typography","variant","size","formatBytes","Tooltip","label","_Fragment","createdAt","Date","dateStyle","updatedAt","AssetActionsMenu","FolderTr","FolderRow","folder","navigateToFolder","useFolderNavigation","draggable","setDragRef","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","folderKey","node","FolderIcon","FolderActionsMenu","AssetsTable","assets","folders","mixedItems","renderedKeys","selectedKeys","selectAll","clear","trackUsage","useTracking","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","buildRenderedKeys","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","item","kind"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAMA,WAAAA,GAAcC,MAAAA,CAAOC,QAAAA,CAAS;;;;oBAIhB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;;;;;;;;;;;AAc7D,CAAC;AAED,MAAMC,WAAAA,GAAcL,MAAAA,CAAOM,QAAAA,CAAS;cACtB,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACI,UAAU,CAAC;;;6BAG1B,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAEtE,CAAC;AAED;;;;;;;;;IAUA,MAAMI,SAAAA,GAAYC,GAAG;;;AAGrB,CAAC;AAED,MAAMC,UAAAA,GAAaD,GAAG;;;;AAItB,CAAC;AAED,MAAME,QAAAA,GAAWX,MAAAA,CAAOY,KAAAA,CAA2B;;aAEtC,EAAE,CAAC,EAAEV,KAAK,EAAE,GAAKA,KAAAA,CAAMW,MAAM,CAAC,CAAA,CAAE,CAAC;;;AAG5C,EAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAMA,KAAAA,GAAQJ,aAAaF,SAAAA;AACzC,CAAC;AAED,MAAMO,QAAAA,GAAWf,MAAAA,CAAOgB,KAAAA,CAAM;aACjB,EAAE,CAAC,EAAEd,KAAK,EAAE,GAAKA,KAAAA,CAAMW,MAAM,CAAC,CAAA,CAAE,CAAC;2BACnB,EAAE,CAAC,EAAEX,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AACpE,CAAC;AAED,wEACA,MAAMa,MAAAA,GAASjB,MAAAA,CAAOe,SAAS;AAC7B,EAAA,EAAEL,UAAAA;AACJ,CAAC;AAED,mEACA,MAAMQ,KAAAA,GAAQlB,MAAAA,CAAOe,SAAS;AAC5B,EAAA,EAAEP,SAAAA;AACJ,CAAC;AAED,MAAMW,QAAAA,GAAWnB,MAAAA,CAAOoB,EAOtB;;;AAGY,cAAA,EAAE,CAAC,EAAElB,KAAK,EAAEmB,WAAW,EAAE,GACnCA,WAAAA,GAAcnB,KAAAA,CAAMC,MAAM,CAACmB,UAAU,GAAGpB,MAAMC,MAAM,CAACoB,QAAQ,CAAC;AACxD,UAAA,EAAE,CAAC,EAAEC,cAAc,EAAEC,OAAO,EAAEC,oBAAoB,EAAE,GAAA;AAC1D,IAAA,IAAIF,kBAAkBC,OAAAA,EAAS;QAC7B,OAAO,MAAA;AACT,IAAA;AAEA,IAAA,OAAOC,uBAAuB,aAAA,GAAgB,SAAA;AAChD,CAAA,CAAE;WACO,EAAE,CAAC,EAAEC,WAAW,EAAEF,OAAO,EAAE,GAAME,WAAAA,IAAeF,OAAAA,GAAU,GAAA,GAAM,CAAA,CAAG;kBAC5D,EAAE,CAAC,EAAED,cAAc,EAAEC,OAAO,EAAE,GAAMD,cAAAA,IAAkBC,OAAAA,GAAU,MAAA,GAAS,MAAA,CAAQ;;EAEjG,EAAE,CAAC,EAAEG,kBAAkB,EAAE1B,KAAK,EAAE,GAC9B0B,kBAAAA,IACAnB,GAAG;AACW,kBAAA,EAAEP,KAAAA,CAAMC,MAAM,CAACmB,UAAU,CAAC;AAClB,0BAAA,EAAEpB,KAAAA,CAAMC,MAAM,CAAC0B,UAAU,CAAC;;AAEhD,IAAA,CAAC;;;gBAGW,EAAE,CAAC,EAAE3B,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACmB,UAAU,CAAC;;;;uBAIlC,EAAE,CAAC,EAAEpB,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC0B,UAAU,CAAC;;;;;AAK5D,IAAA,EAAEd,QAAAA,CAAS;;;;AAIf,CAAC;AAED;AACA;AACA;AACA,MAAMe,UAAAA,GAAa9B,MAAAA,CAAOe,QAAAA,CAAS;;;AAGnC,CAAC;AAED,MAAMgB,UAAAA,GAAa/B,MAAAA,CAAOW,QAAAA,CAAS;;;AAGnC,CAAC;AAED;AACA;AACA;AACA,MAAMqB,eAAAA,GAAkBhC,MAAAA,CAAOiC,aAAAA,CAAc;;;;;;UAMnC,EAAE,CAAC,EAAE/B,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC+B,UAAU,CAAC;;AAEnD,CAAC;AAED;AACA;AACA,MAAMC,UAAAA,GAAanC,MAAAA,CAAOoC,MAAM;;;;;;;;;;;;;uBAaT,EAAE,CAAC,EAAElC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC0B,UAAU,CAAC;;;;AAIhE,CAAC;AAED;AACA;AACA;AACA;AACA,MAAMQ,eAAe,CAACC,CAAAA,GAAAA;AACpB,IAAA,IAAIC,kBAAkBD,CAAAA,CAAAA,EAAI;AACxBA,QAAAA,CAAAA,CAAEE,eAAe,EAAA;AACnB,IAAA;AACF,CAAA;AAMA,MAAMC,gBAAAA,GAAmB,CAAC,EAAEC,KAAK,EAAyB,GAAA;AACxD,IAAA,MAAM,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGF,KAAAA;IAEtB,MAAMG,OAAAA,GAAUC,aAAaF,IAAAA,EAAMD,GAAAA,CAAAA;AAEnC,IAAA,qBACEI,GAAA,CAACC,IAAAA,EAAAA;QACCC,cAAAA,EAAe,QAAA;QACfC,UAAAA,EAAW,QAAA;QACXC,YAAAA,EAAa,KAAA;QACbC,KAAAA,EAAM,YAAA;QACNC,KAAAA,EAAM,QAAA;QACNC,MAAAA,EAAO,QAAA;QACPC,MAAAA,EAAQ,CAAA;AAER,QAAA,QAAA,gBAAAR,GAAA,CAACF,OAAAA,EAAAA;YAAQQ,KAAAA,EAAO,EAAA;YAAIC,MAAAA,EAAQ;;;AAGlC,CAAA;AAQA,MAAME,QAAAA,GAAW,CAAC,EAAEd,KAAK,EAAEe,eAAe,EAAEC,gBAAgB,EAAiB,GAAA;AAC3E,IAAA,MAAMC,SAAAA,GAAYC,YAAAA,EAAAA;AAClB,IAAA,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AACtC,IAAA,MAAM,EAAEC,aAAa,EAAE,GAAGC,oBAAAA,EAAAA,IAA0B;QAAED,aAAAA,EAAe;AAAM,KAAA;AAC3E,IAAA,MAAM,EAAEE,UAAU,EAAEC,SAAS,EAAEC,UAAU,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGC,gBAAAA,CAAiB7B,KAAAA,CAAAA;AACrF,IAAA,MAAM,EAAE8B,UAAU,EAAEC,MAAM,EAAEC,WAAW,EAAE,GAAGC,iBAAAA,EAAAA;IAC5C,MAAM,EAAEC,SAAS,EAAE,GAAGC,0BAAAA,EAAAA;AACtB,IAAA,MAAMC,WAAAA,GAAcC,qBAAAA,EAAAA,EAAyBC,cAAAA,CAAetC,KAAAA,CAAMuC,EAAE,CAAA,IAAK,IAAA;IAEzE,MAAMC,GAAAA,GAAMC,QAAAA,CAASzC,KAAAA,CAAMuC,EAAE,CAAA;AAC7B,IAAA,MAAMG,WAAWZ,UAAAA,CAAWU,GAAAA,CAAAA;;;AAI5B,IAAA,MAAMG,oBAAoB,CAAC3C,KAAAA,CAAM4C,OAAO,IAAI,CAAC5C,MAAM6C,eAAe;AAClE,IAAA,MAAMC,uBAAuB1B,aAAAA,CAAc;AACzCmB,QAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,iCAAA,CAAA;QACtBC,cAAAA,EAAgB;AAClB,KAAA,CAAA;;;;;;;;AASA,IAAA,MAAMC,iBAAiB,CAACrD,CAAAA,GAAAA;QACtB,IAAI,CAACC,kBAAkBD,CAAAA,CAAAA,EAAI;AACzB,YAAA;AACF,QAAA;QAEA,IAAIA,CAAAA,CAAEsD,QAAQ,EAAE;AACdlB,YAAAA,WAAAA,CAAYjB,eAAAA,EAAiByB,GAAAA,CAAAA;AAC/B,QAAA,CAAA,MAAO,IAAI5C,CAAAA,CAAEuD,OAAO,IAAIvD,CAAAA,CAAEwD,OAAO,EAAE;YACjCrB,MAAAA,CAAOS,GAAAA,CAAAA;QACT,CAAA,MAAO;AACLxB,YAAAA,gBAAAA,CAAiBhB,MAAMuC,EAAE,CAAA;AAC3B,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,MAAMc,gBAAgB,CAACzD,CAAAA,GAAAA;QACrB,IAAI,CAACC,kBAAkBD,CAAAA,CAAAA,EAAI;AACzB,YAAA;AACF,QAAA;QAEA,IAAIA,CAAAA,CAAE4C,GAAG,KAAK,OAAA,EAAS;AACrB5C,YAAAA,CAAAA,CAAE0D,cAAc,EAAA;AAChBtC,YAAAA,gBAAAA,CAAiBhB,MAAMuC,EAAE,CAAA;AAC3B,QAAA,CAAA,MAAO,IAAI3C,CAAAA,CAAE4C,GAAG,KAAK,GAAA,EAAK;AACxB5C,YAAAA,CAAAA,CAAE0D,cAAc,EAAA;YAChBvB,MAAAA,CAAOS,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMe,kBAAkB,CAAC3D,CAAAA,GAAAA;AACvBA,QAAAA,CAAAA,CAAEE,eAAe,EAAA;AACjBkB,QAAAA,gBAAAA,CAAiBhB,MAAMuC,EAAE,CAAA;AAC3B,IAAA,CAAA;AAEA,IAAA,MAAMiB,sBAAsB,CAAC5D,CAAAA,GAAAA;AAC3BA,QAAAA,CAAAA,CAAEE,eAAe,EAAA;QACjB,IAAIF,CAAAA,CAAEsD,QAAQ,EAAE;AACdlB,YAAAA,WAAAA,CAAYjB,eAAAA,EAAiByB,GAAAA,CAAAA;QAC/B,CAAA,MAAO;YACLT,MAAAA,CAAOS,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEiB,IAAA,CAAChF,QAAAA,EAAAA;QACCiF,GAAAA,EAAKhC,UAAAA;AACJ,QAAA,GAAGF,UAAU;AACb,QAAA,GAAGC,SAAS;AACZ,QAAA,GAAGkC,2BAA2B;QAC/B1E,WAAAA,EAAa0C,UAAAA;QACb7C,cAAAA,EAAgBwC,aAAAA;AAChBvC,QAAAA,OAAAA,EAASqD,WAAAA,KAAgB,IAAA;QACzBzD,WAAAA,EAAa+D,QAAAA;QACbkB,QAAAA,EAAU,CAAA;QACVC,IAAAA,EAAK,KAAA;;;QAGLC,0BAAwB,EAAA,IAAA;QACxBC,WAAAA,EAAa,CAACnE,CAAAA,GAAMA,CAAAA,CAAE0D,cAAc,EAAA;QACpCU,OAAAA,EAASf,cAAAA;QACTgB,SAAAA,EAAWZ,aAAAA;AACXa,QAAAA,aAAAA,EAAe,CAACtE,CAAAA,GAAAA;AACd,YAAA,IAAIC,kBAAkBD,CAAAA,CAAAA,EAAI;AACxB6B,gBAAAA,SAAAA,EAAWyC,aAAAA,GAAgBtE,CAAAA,CAAAA;AAC7B,YAAA;AACF,QAAA,CAAA;;AAICsC,YAAAA,SAAAA,kBACC7B,GAAA,CAACjB,UAAAA,EAAAA;AAAY,gBAAA,GAAG+E,wBAAwB;gBAAEH,OAAAA,EAASrE,YAAAA;gBAAcsE,SAAAA,EAAWtE,YAAAA;AAC1E,gBAAA,QAAA,gBAAAU,GAAA,CAACC,IAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAD,GAAA,CAAC+D,QAAAA,EAAAA;wBACCC,OAAAA,EAAS3B,QAAAA;wBACTsB,OAAAA,EAASR,mBAAAA;AACTc,wBAAAA,YAAAA,EAAYlD,aAAAA,CACV;AACEmB,4BAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,uBAAA,CAAA;4BACtBC,cAAAA,EAAgB;yBAClB,EACA;AAAEuB,4BAAAA,IAAAA,EAAMvE,MAAMuE;AAAK,yBAAA;;;;0BAM7BlE,GAAA,CAAC9B,MAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAkF,IAAA,CAACnD,IAAAA,EAAAA;oBAAKE,UAAAA,EAAW,QAAA;oBAASD,cAAAA,EAAe,eAAA;oBAAgBiE,GAAAA,EAAK,CAAA;oBAAGC,QAAAA,EAAU,CAAA;;sCACzEhB,IAAA,CAACnD,IAAAA,EAAAA;4BAAKkE,GAAAA,EAAK,CAAA;4BAAGhE,UAAAA,EAAW,QAAA;4BAASiE,QAAAA,EAAU,CAAA;;AAIzCrC,gCAAAA,WAAAA,KAAgB,qBACf/B,GAAA,CAACC,IAAAA,EAAAA;oCAAKC,cAAAA,EAAe,QAAA;oCAASI,KAAAA,EAAM,QAAA;oCAASC,MAAAA,EAAO,QAAA;AAClD,oCAAA,QAAA,gBAAAP,GAAA,CAACqE,MAAAA,EAAAA;wCAAOC,KAAK,EAAA,IAAA;AAAEvC,wCAAAA,QAAAA,EAAAA;;mDAGjB/B,GAAA,CAACN,gBAAAA,EAAAA;oCAAiBC,KAAAA,EAAOA;;8CAE3ByD,IAAA,CAACnD,IAAAA,EAAAA;oCAAKsE,SAAAA,EAAU,QAAA;oCAASpE,UAAAA,EAAW,YAAA;oCAAaiE,QAAAA,EAAU,CAAA;;sDACzDpE,GAAA,CAACZ,UAAAA,EAAAA;4CAAWoF,IAAAA,EAAK,QAAA;4CAASb,OAAAA,EAAST,eAAAA;AACjC,4CAAA,QAAA,gBAAAlD,GAAA,CAACyE,aAAAA,EAAAA;gDAAcC,SAAAA,EAAU,YAAA;gDAAaC,UAAAA,EAAW,UAAA;AAC9ChF,gDAAAA,QAAAA,EAAAA,KAAAA,CAAMuE;;;AAGV,wCAAA,CAACtD,2BACAZ,GAAA,CAAC4E,UAAAA,EAAAA;4CAAWF,SAAAA,EAAU,YAAA;4CAAaG,OAAAA,EAAQ,IAAA;AACxClF,4CAAAA,QAAAA,EAAAA,KAAAA,CAAMmF,IAAI,GAAGC,WAAAA,CAAYpF,KAAAA,CAAMmF,IAAI,EAAE,CAAA,CAAA,GAAK;;;;;;AAKlDxC,wBAAAA,iBAAAA,kBACCtC,GAAA,CAACgF,OAAAA,EAAAA;4BAAQC,KAAAA,EAAOxC,oBAAAA;AACd,4BAAA,QAAA,gBAAAzC,GAAA,CAACf,eAAAA,EAAAA;gCAAgBgF,YAAAA,EAAYxB,oBAAAA;gCAAsBe,IAAAA,EAAK;;;;;;YAK/D5C,SAAAA,kBACCwC,IAAA,CAAA8B,QAAA,EAAA;;kCACElF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AACnB/E,4BAAAA,QAAAA,EAAAA,KAAAA,CAAMwF,SAAS,GAAGrE,UAAAA,CAAW,IAAIsE,IAAAA,CAAKzF,KAAAA,CAAMwF,SAAS,CAAA,EAAG;gCAAEE,SAAAA,EAAW;6BAAO,CAAA,GAAK;;;kCAGtFrF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AACnB/E,4BAAAA,QAAAA,EAAAA,KAAAA,CAAM2F,SAAS,GAAGxE,UAAAA,CAAW,IAAIsE,IAAAA,CAAKzF,KAAAA,CAAM2F,SAAS,CAAA,EAAG;gCAAED,SAAAA,EAAW;6BAAO,CAAA,GAAK;;;kCAGtFrF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AACnB/E,4BAAAA,QAAAA,EAAAA,KAAAA,CAAMmF,IAAI,GAAGC,WAAAA,CAAYpF,KAAAA,CAAMmF,IAAI,EAAE,CAAA,CAAA,GAAK;;;;;0BAOnD9E,GAAA,CAAChC,QAAAA,EAAAA;AACE,gBAAA,GAAG8F,wBAAwB;gBAC5BH,OAAAA,EAASrE,YAAAA;gBACTsE,SAAAA,EAAWtE,YAAAA;gBACXuE,aAAAA,EAAevE,YAAAA;AAEf,gBAAA,QAAA,gBAAAU,GAAA,CAACC,IAAAA,EAAAA;oBAAKC,cAAAA,EAAe,UAAA;AACnB,oBAAA,QAAA,gBAAAF,GAAA,CAACuF,gBAAAA,EAAAA;wBAAiB5F,KAAAA,EAAOA,KAAAA;wBAAO4B,QAAAA,EAAUA;;;;;;AAKpD,CAAA;AAEA,MAAMiE,QAAAA,GAAWvI,MAAAA,CAAOmB,QAAAA,CAAS;;gBAEjB,EAAE,CAAC,EAAEjB,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACmB,UAAU,CAAC;;AAEzD,CAAC;AAOD,MAAMkH,YAAY,CAAC,EAAEC,MAAM,EAAEhF,eAAe,EAAkB,GAAA;AAC5D,IAAA,MAAME,SAAAA,GAAYC,YAAAA,EAAAA;AAClB,IAAA,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IACtC,MAAM,EAAE2E,gBAAgB,EAAE,GAAGC,mBAAAA,EAAAA;AAC7B,IAAA,MAAM,EAAEnE,UAAU,EAAEC,MAAM,EAAEC,WAAW,EAAE,GAAGC,iBAAAA,EAAAA;IAC5C,MAAM,EAAEC,SAAS,EAAE,GAAGC,0BAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEb,aAAa,EAAE,GAAGC,oBAAAA,EAAAA,IAA0B;QAAED,aAAAA,EAAe;AAAM,KAAA;IAC3E,MAAM,EACJM,QAAQ,EACRsE,SAAAA,EAAW,EAAE1E,UAAU,EAAEC,SAAS,EAAEC,UAAAA,EAAYyE,UAAU,EAAExE,UAAU,EAAE,EACxEyE,SAAAA,EAAW,EAAE1E,UAAAA,EAAY2E,UAAU,EAAE,EACrCC,sBAAsB,EACtBC,qBAAqB,EACtB,GAAGC,2BAAAA,CAA4BT,MAAAA,CAAAA;IAEhC,MAAMvD,GAAAA,GAAMiE,SAAAA,CAAUV,MAAAA,CAAOxD,EAAE,CAAA;;;;;;;AAQ/B,IAAA,MAAMU,iBAAiB,CAACrD,CAAAA,GAAAA;QACtB,IAAI,CAACC,kBAAkBD,CAAAA,CAAAA,EAAI;AACzB,YAAA;AACF,QAAA;QAEA,IAAIA,CAAAA,CAAEsD,QAAQ,EAAE;AACdlB,YAAAA,WAAAA,CAAYjB,eAAAA,EAAiByB,GAAAA,CAAAA;AAC/B,QAAA,CAAA,MAAO,IAAI5C,CAAAA,CAAEuD,OAAO,IAAIvD,CAAAA,CAAEwD,OAAO,EAAE;YACjCrB,MAAAA,CAAOS,GAAAA,CAAAA;QACT,CAAA,MAAO;YACLwD,gBAAAA,CAAiBD,MAAAA,CAAAA;AACnB,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,MAAM1C,gBAAgB,CAACzD,CAAAA,GAAAA;QACrB,IAAI,CAACC,kBAAkBD,CAAAA,CAAAA,EAAI;AACzB,YAAA;AACF,QAAA;QAEA,IAAIA,CAAAA,CAAE4C,GAAG,KAAK,OAAA,EAAS;AACrB5C,YAAAA,CAAAA,CAAE0D,cAAc,EAAA;YAChB0C,gBAAAA,CAAiBD,MAAAA,CAAAA;AACnB,QAAA,CAAA,MAAO,IAAInG,CAAAA,CAAE4C,GAAG,KAAK,GAAA,EAAK;AACxB5C,YAAAA,CAAAA,CAAE0D,cAAc,EAAA;YAChBvB,MAAAA,CAAOS,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMgB,sBAAsB,CAAC5D,CAAAA,GAAAA;AAC3BA,QAAAA,CAAAA,CAAEE,eAAe,EAAA;QACjB,IAAIF,CAAAA,CAAEsD,QAAQ,EAAE;AACdlB,YAAAA,WAAAA,CAAYjB,eAAAA,EAAiByB,GAAAA,CAAAA;QAC/B,CAAA,MAAO;YACLT,MAAAA,CAAOS,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEiB,IAAA,CAACoC,QAAAA,EAAAA;AACCnC,QAAAA,GAAAA,EAAK,CAACgD,IAAAA,GAAAA;YACJP,UAAAA,CAAWO,IAAAA,CAAAA;YACXL,UAAAA,CAAWK,IAAAA,CAAAA;AACb,QAAA,CAAA;AACC,QAAA,GAAGlF,UAAU;AACb,QAAA,GAAGC,SAAS;QACbxC,WAAAA,EAAa0C,UAAAA;QACb7C,cAAAA,EAAgBwC,aAAAA;QAChBpC,kBAAAA,EAAoBoH,sBAAAA;QACpBtH,oBAAAA,EAAsBuH,qBAAAA;AACtB5H,QAAAA,WAAAA,EAAamD,UAAAA,CAAWU,GAAAA,CAAAA;QACxBoB,QAAAA,EAAU,CAAA;QACVC,IAAAA,EAAK,KAAA;;;QAGLC,0BAAwB,EAAA,IAAA;AACxBC,QAAAA,WAAAA,EAAa,CAACnE,CAAAA,GAAAA;AACZ,YAAA,IAAIC,kBAAkBD,CAAAA,CAAAA,EAAI;AACxBA,gBAAAA,CAAAA,CAAE0D,cAAc,EAAA;AAClB,YAAA;AACF,QAAA,CAAA;QACAU,OAAAA,EAASf,cAAAA;QACTgB,SAAAA,EAAWZ,aAAAA;AACXa,QAAAA,aAAAA,EAAe,CAACtE,CAAAA,GAAAA;AACd,YAAA,IAAIC,kBAAkBD,CAAAA,CAAAA,EAAI;AACxB6B,gBAAAA,SAAAA,EAAWyC,aAAAA,GAAgBtE,CAAAA,CAAAA;AAC7B,YAAA;AACF,QAAA,CAAA;;AAECsC,YAAAA,SAAAA,kBACC7B,GAAA,CAACjB,UAAAA,EAAAA;gBAAW4E,OAAAA,EAASrE,YAAAA;gBAAcsE,SAAAA,EAAWtE,YAAAA;AAC5C,gBAAA,QAAA,gBAAAU,GAAA,CAACC,IAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAD,GAAA,CAAC+D,QAAAA,EAAAA;AACCC,wBAAAA,OAAAA,EAASvC,UAAAA,CAAWU,GAAAA,CAAAA;wBACpBwB,OAAAA,EAASR,mBAAAA;AACTc,wBAAAA,YAAAA,EAAYlD,aAAAA,CACV;AACEmB,4BAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,uBAAA,CAAA;4BACtBC,cAAAA,EAAgB;yBAClB,EACA;AAAEuB,4BAAAA,IAAAA,EAAMwB,OAAOxB;AAAK,yBAAA;;;;0BAM9BlE,GAAA,CAAC9B,MAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAkF,IAAA,CAACnD,IAAAA,EAAAA;oBAAKkE,GAAAA,EAAK,CAAA;oBAAGhE,UAAAA,EAAW,QAAA;oBAASiE,QAAAA,EAAU,CAAA;;sCAC1CpE,GAAA,CAACC,IAAAA,EAAAA;4BACCC,cAAAA,EAAe,QAAA;4BACfC,UAAAA,EAAW,QAAA;4BACXC,YAAAA,EAAa,KAAA;4BACbC,KAAAA,EAAM,YAAA;4BACNC,KAAAA,EAAM,QAAA;4BACNC,MAAAA,EAAO,QAAA;4BACPC,MAAAA,EAAQ,CAAA;AAER,4BAAA,QAAA,gBAAAR,GAAA,CAACsG,MAAAA,EAAAA;gCAAWhG,KAAAA,EAAO,EAAA;gCAAIC,MAAAA,EAAQ;;;sCAEjCP,GAAA,CAACyE,aAAAA,EAAAA;4BAAcC,SAAAA,EAAU,YAAA;4BAAaC,UAAAA,EAAW,UAAA;AAC9Ce,4BAAAA,QAAAA,EAAAA,MAAAA,CAAOxB;;;;;YAIbtD,SAAAA,kBACCwC,IAAA,CAAA8B,QAAA,EAAA;;kCACElF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AACnBgB,4BAAAA,QAAAA,EAAAA,MAAAA,CAAOP,SAAS,GACbrE,UAAAA,CAAW,IAAIsE,IAAAA,CAAKM,MAAAA,CAAOP,SAAS,CAAA,EAAG;gCAAEE,SAAAA,EAAW;6BAAO,CAAA,GAC3D;;;kCAGRrF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AACnBgB,4BAAAA,QAAAA,EAAAA,MAAAA,CAAOJ,SAAS,GACbxE,UAAAA,CAAW,IAAIsE,IAAAA,CAAKM,MAAAA,CAAOJ,SAAS,CAAA,EAAG;gCAAED,SAAAA,EAAW;6BAAO,CAAA,GAC3D;;;kCAGRrF,GAAA,CAAC7B,KAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAA6B,GAAA,CAAC4E,UAAAA,EAAAA;4BAAWF,SAAAA,EAAU,YAAA;AAAa,4BAAA,QAAA,EAAA;;;;;0BAMzC1E,GAAA,CAAChC,QAAAA,EAAAA;gBAAS2F,OAAAA,EAASrE,YAAAA;gBAAcsE,SAAAA,EAAWtE,YAAAA;gBAAcuE,aAAAA,EAAevE,YAAAA;AACvE,gBAAA,QAAA,gBAAAU,GAAA,CAACC,IAAAA,EAAAA;oBAAKC,cAAAA,EAAe,UAAA;AACnB,oBAAA,QAAA,gBAAAF,GAAA,CAACuG,iBAAAA,EAAAA;wBAAkBb,MAAAA,EAAQA,MAAAA;wBAAQnE,QAAAA,EAAUA;;;;;;AAKvD,CAAA;AAeO,MAAMiF,WAAAA,GAAc,CAAC,EAC1BC,MAAM,EACNC,OAAAA,GAAU,EAAE,EACZC,aAAa,IAAI,EACjBC,YAAY,EACZjG,gBAAgB,EACC,GAAA;AACjB,IAAA,MAAMC,SAAAA,GAAYC,YAAAA,EAAAA;IAClB,MAAM,EAAEE,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAE6F,YAAY,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGnF,iBAAAA,EAAAA;IAC3C,MAAM,EAAEC,SAAS,EAAE,GAAGC,0BAAAA,EAAAA;IACtB,MAAM,EAAEkF,UAAU,EAAE,GAAGC,WAAAA,EAAAA;;;AAIvB,IAAA,MAAMC,cAAAA,GAAiBtG,SAAAA,GACnBuG,aAAAA,GACAA,aAAAA,CAAcC,MAAM,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEnD,IAAI,KAAK,MAAA,IAAUmD,CAAAA,CAAEnD,IAAI,KAAK,SAAA,CAAA;;;;AAKhE,IAAA,MAAMoD,kBAAAA,GAAqBzF,SAAAA;AAC3B,IAAA,MAAM0F,WAAWL,cAAAA,CAAeM,MAAM,IAAIF,kBAAAA,GAAqB,IAAI,CAAA,CAAA;AAEnE,IAAA,MAAMG,SAAAA,GAAYf,OAAAA,CAAQc,MAAM,GAAGf,OAAOe,MAAM;;;IAIhD,MAAM9G,eAAAA,GACJkG,gBAAgBc,iBAAAA,CAAkB;AAAEhB,QAAAA,OAAAA;AAASD,QAAAA,MAAAA;AAAQE,QAAAA;AAAW,KAAA,CAAA;AAClE,IAAA,MAAM,EAAEgB,WAAW,EAAEC,eAAe,EAAE,GAAGC,kBAAkBhB,YAAAA,EAAcnG,eAAAA,CAAAA;AAEzE,IAAA,MAAMoH,eAAAA,GAAkB,IAAA;AACtB,QAAA,IAAIH,WAAAA,EAAa;AACfZ,YAAAA,KAAAA,EAAAA;QACF,CAAA,MAAO;YACLC,UAAAA,CAAW,kCAAA,CAAA;YACXF,SAAAA,CAAUpG,eAAAA,CAAAA;AACZ,QAAA;AACF,IAAA,CAAA;;;AAIA,IAAA,IAAI+G,cAAc,CAAA,EAAG;QACnB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,qBACErE,IAAA,CAACpG,WAAAA,EAAAA;QAAYuK,QAAAA,EAAUA,QAAAA;AAAUQ,QAAAA,QAAAA,EAAU,CAACpB,UAAAA,GAAaA,WAAWa,MAAM,GAAGC,SAAQ,IAAK,CAAA;;0BACxFzH,GAAA,CAAC1C,WAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAA8F,IAAA,CAAC4E,KAAAA,EAAAA;;AACEV,wBAAAA,kBAAAA,kBACCtH,GAAA,CAAChB,UAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAAgB,GAAA,CAACC,IAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAD,GAAA,CAAC+D,QAAAA,EAAAA;AACCC,oCAAAA,OAAAA,EAAS4D,kBAAkB,eAAA,GAAkBD,WAAAA;oCAC7CM,QAAAA,EAAUvH,eAAAA,CAAgB8G,MAAM,KAAK,CAAA;oCACrCU,eAAAA,EAAiBJ,eAAAA;AACjB7D,oCAAAA,YAAAA,EAAYlD,aAAAA,CAAc;AACxBmB,wCAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,8BAAA,CAAA;wCACtBC,cAAAA,EAAgB;AAClB,qCAAA;;;;wBAKPuE,cAAAA,CAAeiB,GAAG,CAAC,CAACC,MAAAA,GAAAA;4BACnB,MAAMC,gBAAAA,GAAmBtH,aAAAA,CAAcqH,MAAAA,CAAOnD,KAAK,CAAA;AACnD,4BAAA,MAAMqD,gBAAAA,GAAmB,kBAAA,IAAsBF,MAAAA,IAAUA,MAAAA,CAAOE,gBAAgB;AAEhF,4BAAA,IAAIA,gBAAAA,EAAkB;AACpB,gCAAA,qBACEtI,GAAA,CAACpC,QAAAA,EAAAA;oCAA2BG,KAAAA,EAAOqK,MAAAA,CAAOlE,IAAI,KAAK,MAAA;AACjD,oCAAA,QAAA,gBAAAlE,GAAA,CAACuI,cAAAA,EAAAA;kDACExH,aAAAA,CAAc;AACbmB,4CAAAA,EAAAA,EAAIQ,iBAAAA,CAAkB,sBAAA,CAAA;4CACtBC,cAAAA,EAAgB;AAClB,yCAAA;;AALWyF,iCAAAA,EAAAA,MAAAA,CAAOlE,IAAI,CAAA;AAS9B,4BAAA;AAEA,4BAAA,qBACElE,GAAA,CAACpC,QAAAA,EAAAA;gCAA2BG,KAAAA,EAAOqK,MAAAA,CAAOlE,IAAI,KAAK,MAAA;AACjD,gCAAA,QAAA,gBAAAlE,GAAA,CAAC4E,UAAAA,EAAAA;oCAAWF,SAAAA,EAAU,YAAA;oCAAaG,OAAAA,EAAQ,OAAA;AACxCwD,oCAAAA,QAAAA,EAAAA;;AAFUD,6BAAAA,EAAAA,MAAAA,CAAOlE,IAAI,CAAA;AAM9B,wBAAA,CAAA;;;;0BAGJd,IAAA,CAACoF,QAAAA,EAAAA;;AACE7B,oBAAAA,UAAAA,EAAYwB,IAAI,CAACM,IAAAA,GAChBA,KAAKC,IAAI,KAAK,yBACZ1I,GAAA,CAACyF,SAAAA,EAAAA;AAECC,4BAAAA,MAAAA,EAAQ+C,KAAK/C,MAAM;4BACnBhF,eAAAA,EAAiBA;2BAFZ,CAAC,OAAO,EAAE+H,IAAAA,CAAK/C,MAAM,CAACxD,EAAE,CAAA,CAAE,kBAKjClC,GAAA,CAACS,QAAAA,EAAAA;AAECd,4BAAAA,KAAAA,EAAO8I,KAAK9I,KAAK;4BACjBe,eAAAA,EAAiBA,eAAAA;4BACjBC,gBAAAA,EAAkBA;2BAHb8H,IAAAA,CAAK9I,KAAK,CAACuC,EAAE,CAAA,CAAA;AAOvB,oBAAA,CAACyE,cACAD,OAAAA,CAAQyB,GAAG,CAAC,CAACzC,uBACX1F,GAAA,CAACyF,SAAAA,EAAAA;4BAECC,MAAAA,EAAQA,MAAAA;4BACRhF,eAAAA,EAAiBA;AAFZ,yBAAA,EAAA,CAAC,OAAO,EAAEgF,MAAAA,CAAOxD,EAAE,CAAA,CAAE,CAAA,CAAA;AAK/B,oBAAA,CAACyE,cACAF,MAAAA,CAAO0B,GAAG,CAAC,CAACxI,sBACVK,GAAA,CAACS,QAAAA,EAAAA;4BAECd,KAAAA,EAAOA,KAAAA;4BACPe,eAAAA,EAAiBA,eAAAA;4BACjBC,gBAAAA,EAAkBA;AAHbhB,yBAAAA,EAAAA,KAAAA,CAAMuC,EAAE,CAAA;;;;;AAS3B;;;;"}
|
|
1
|
+
{"version":3,"file":"AssetsTable.mjs","sources":["../../../../../admin/src/pages/Assets/components/AssetsTable.tsx"],"sourcesContent":["import { useIsDesktop } from '@strapi/admin/strapi-admin';\nimport {\n Checkbox,\n Flex,\n Loader,\n RawTable,\n RawTbody,\n RawTd,\n RawTh,\n RawThead,\n RawTr,\n Tooltip,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { TruncatedText } from '../../../components/TruncatedText';\nimport { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { formatBytes } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { isEventFromWithin } from '../../../utils/isEventFromWithin';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { ASSET_DETAILS_TRIGGER_PROPS, ASSET_ITEM_CONTROL_PROPS, TABLE_HEADERS } from '../constants';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useBusyAssetsOptional } from '../hooks/useBusyAssets';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\nimport { type MixedItem } from '../utils/mergeMixedList';\nimport { buildRenderedKeys } from '../utils/renderedKeys';\nimport { assetKey, folderKey, getSelectAllState, type ItemKey } from '../utils/selection';\n\nimport { AssetActionsMenu } from './AssetActionsMenu';\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\nimport { FolderActionsMenu } from './FolderActionsMenu';\nimport { useItemContextMenuTrigger } from './ItemContextMenu';\n\nimport type { File } from '../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../shared/contracts/folders';\n\nconst StyledTable = styled(RawTable)`\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: 4px;\n overflow: hidden;\n\n /* An auto layout lets every column but the name size itself to its content,\n so the dates never wrap. The name cell is what absorbs the leftover and\n ellipsizes — see NameTd. */\n table-layout: auto;\n\n & td:last-child,\n & th:last-child {\n width: 5.6rem;\n white-space: nowrap;\n }\n`;\n\nconst StyledThead = styled(RawThead)`\n background: ${({ theme }) => theme.colors.neutral100};\n\n tr {\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n`;\n\n/**\n * Column sizing, applied to the header and body cells alike.\n *\n * `hug` shrinks a column to its content: `width: 1%` is a floor the content\n * overrides, and `nowrap` stops a date breaking across lines.\n *\n * `flex` claims everything left over. `width: 100%` asks for all of it and\n * `max-width: 0` is what allows the cell to be narrower than its content, which\n * is what lets the name inside ellipsize instead of widening the table.\n */\nconst hugColumn = css`\n width: 1%;\n white-space: nowrap;\n`;\n\nconst flexColumn = css`\n width: 100%;\n max-width: 0;\n overflow: hidden;\n`;\n\nconst StyledTh = styled(RawTh)<{ $flex?: boolean }>`\n height: 40px;\n padding: 0 ${({ theme }) => theme.spaces[4]};\n text-align: left;\n\n ${({ $flex }) => ($flex ? flexColumn : hugColumn)}\n`;\n\nconst StyledTd = styled(RawTd)`\n padding: 0 ${({ theme }) => theme.spaces[4]};\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\n/** The name column: takes whatever the others leave and ellipsizes. */\nconst NameTd = styled(StyledTd)`\n ${flexColumn}\n`;\n\n/** Every other column: as wide as its content, never wrapping. */\nconst HugTd = styled(StyledTd)`\n ${hugColumn}\n`;\n\nconst StyledTr = styled.tr<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isBusy?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n $isSelected?: boolean;\n}>`\n height: 48px;\n user-select: none;\n background: ${({ theme, $isSelected }) =>\n $isSelected ? theme.colors.primary100 : theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isBusy, $isInvalidDropTarget }) => {\n if ($isMovePending || $isBusy) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging, $isBusy }) => ($isDragging || $isBusy ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending, $isBusy }) => ($isMovePending || $isBusy ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n\n &:last-child {\n ${StyledTd} {\n border-bottom: 0;\n }\n }\n`;\n\n// Leading checkbox column. Fixed narrow width so it holds its own column under\n// the mobile fixed table-layout (a 1% width would collapse and let the name\n// cell's preview overlap the control).\nconst CheckboxTd = styled(StyledTd)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\nconst CheckboxTh = styled(StyledTh)`\n width: 5.6rem;\n white-space: nowrap;\n`;\n\n// Flags an asset whose caption or alternative text is empty — mirrors the\n// per-field warning shown in the details drawer. Pushed to the far end of the\n// name cell (shrink 0 so a long name never crowds it out).\nconst MetadataWarning = styled(WarningCircle)`\n flex-shrink: 0;\n width: 1.6rem;\n height: 1.6rem;\n\n path {\n fill: ${({ theme }) => theme.colors.warning500};\n }\n`;\n\n// The asset filename is its own interactive element: clicking it opens the\n// details drawer instead of selecting the row.\nconst NameButton = styled.button`\n display: inline-flex;\n max-width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n margin: 0;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n border-radius: 2px;\n }\n`;\n\n// Shields the row from its own controls (checkbox, \"...\" trigger) without\n// severing propagation for the menu's portaled content — those events are React\n// children of the cell but not DOM descendants, and Radix needs them to reach\n// `document` to dismiss its layers.\nconst stopRowEvent = (e: React.SyntheticEvent) => {\n if (isEventFromWithin(e)) {\n e.stopPropagation();\n }\n};\n\ninterface AssetPreviewCellProps {\n asset: File;\n}\n\nconst AssetPreviewCell = ({ asset }: AssetPreviewCellProps) => {\n const { ext, mime } = asset;\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral500\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <DocIcon width={20} height={20} />\n </Flex>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n orderedItemKeys: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetRow = ({ asset, orderedItemKeys, onAssetItemClick }: AssetRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging, dragData } = useFileDraggable(asset);\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const busyMessage = useBusyAssetsOptional()?.getBusyMessage(asset.id) ?? null;\n const openContextMenu = useItemContextMenuTrigger();\n\n const key = assetKey(asset.id);\n const selected = isSelected(key);\n\n // Caption and alternative text apply to every file type — same \"empty =\n // falsy\" rule as the drawer's per-field warning.\n const isMetadataMissing = !asset.caption || !asset.alternativeText;\n const metadataMissingLabel = formatMessage({\n id: getTranslationKey('list.table.row.metadata-missing'),\n defaultMessage: 'This asset is missing metadata (caption or alternative text).',\n });\n\n // Plain click opens the asset details; pointer selection lives on the\n // checkbox only. Modifier clicks keep the selection semantics: shift selects\n // a range, cmd/ctrl toggles.\n //\n // The containment guard on this and the handler below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // opening the details drawer or toggling the selection.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n onAssetItemClick(asset.id);\n }\n };\n\n // Desktop: Space toggles selection (additive), Enter opens the details drawer.\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleNameClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAssetItemClick(asset.id);\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <StyledTr\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n {...ASSET_DETAILS_TRIGGER_PROPS}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isBusy={busyMessage !== null}\n $isSelected={selected}\n tabIndex={0}\n role=\"row\"\n // Right-click opens this asset's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'asset', asset, dragData });\n }\n }}\n onDragStart={(e) => e.preventDefault()}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {/* No checkbox without the update permission (nothing selectable can be\n acted on). Shown at every viewport width otherwise. */}\n {canUpdate && (\n <CheckboxTd {...ASSET_ITEM_CONTROL_PROPS} onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={selected}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: asset.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <NameTd>\n <Flex alignItems=\"center\" justifyContent=\"space-between\" gap={2} minWidth={0}>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n {/* The row is dimmed and inert while busy; the spinner in place of the\n thumbnail is what says so positively. Its label carries the reason\n to screen readers — the row itself has no other announcement. */}\n {busyMessage !== null ? (\n <Flex justifyContent=\"center\" width=\"3.2rem\" height=\"3.2rem\">\n <Loader small>{busyMessage}</Loader>\n </Flex>\n ) : (\n <AssetPreviewCell asset={asset} />\n )}\n <Flex direction=\"column\" alignItems=\"flex-start\" minWidth={0}>\n <NameButton type=\"button\" onClick={handleNameClick}>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {asset.name}\n </TruncatedText>\n </NameButton>\n {!isDesktop && (\n <Typography textColor=\"neutral600\" variant=\"pi\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n )}\n </Flex>\n </Flex>\n {isMetadataMissing && (\n <Tooltip label={metadataMissingLabel}>\n <MetadataWarning aria-label={metadataMissingLabel} role=\"img\" />\n </Tooltip>\n )}\n </Flex>\n </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.createdAt ? formatDate(new Date(asset.createdAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.updatedAt ? formatDate(new Date(asset.updatedAt), { dateStyle: 'long' }) : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {asset.size ? formatBytes(asset.size, 1) : '-'}\n </Typography>\n </HugTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would open the details drawer). */}\n <StyledTd\n {...ASSET_ITEM_CONTROL_PROPS}\n onClick={stopRowEvent}\n onKeyDown={stopRowEvent}\n onPointerDown={stopRowEvent}\n >\n <Flex justifyContent=\"flex-end\">\n <AssetActionsMenu asset={asset} dragData={dragData} />\n </Flex>\n </StyledTd>\n </StyledTr>\n );\n};\n\nconst FolderTr = styled(StyledTr)`\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n`;\n\ninterface FolderRowProps {\n folder: Folder;\n orderedItemKeys: ItemKey[];\n}\n\nconst FolderRow = ({ folder, orderedItemKeys }: FolderRowProps) => {\n const isDesktop = useIsDesktop();\n const { formatDate, formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isSelected, toggle, selectRange } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const openContextMenu = useItemContextMenuTrigger();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n dragData,\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const key = folderKey(folder.id);\n\n // Folders share the selection mechanism with assets. Only the plain-click\n // semantic differs: it navigates into the folder instead of selecting it.\n //\n // The containment guard on this and the handlers below is what keeps the\n // actions menu's portaled dialogs — React children of this row — from\n // navigating into the folder or starting a drag.\n const handleRowClick = (e: React.MouseEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else if (e.metaKey || e.ctrlKey) {\n toggle(key);\n } else {\n navigateToFolder(folder);\n }\n };\n\n // Enter navigates into the folder, Space toggles selection (same as assets).\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isEventFromWithin(e)) {\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n navigateToFolder(folder);\n } else if (e.key === ' ') {\n e.preventDefault();\n toggle(key);\n }\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey) {\n selectRange(orderedItemKeys, key);\n } else {\n toggle(key);\n }\n };\n\n return (\n <FolderTr\n ref={(node) => {\n setDragRef(node);\n setDropRef(node);\n }}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n $isSelected={isSelected(key)}\n tabIndex={0}\n role=\"row\"\n // Right-click opens this folder's own actions, or the selection's when it\n // is part of one. Still marked as \"not the background gesture\" so\n // MainAreaContextMenu's create menu stays out of it.\n data-native-context-menu\n onContextMenu={(e: React.MouseEvent) => {\n if (isEventFromWithin(e)) {\n openContextMenu?.(e, key, { kind: 'folder', folder, dragData });\n }\n }}\n onDragStart={(e: React.DragEvent) => {\n if (isEventFromWithin(e)) {\n e.preventDefault();\n }\n }}\n onClick={handleRowClick}\n onKeyDown={handleKeyDown}\n onPointerDown={(e: React.PointerEvent) => {\n if (isEventFromWithin(e)) {\n listeners?.onPointerDown?.(e);\n }\n }}\n >\n {canUpdate && (\n <CheckboxTd onClick={stopRowEvent} onKeyDown={stopRowEvent}>\n <Flex>\n <Checkbox\n checked={isSelected(key)}\n onClick={handleCheckboxClick}\n aria-label={formatMessage(\n {\n id: getTranslationKey('list.table.row.select'),\n defaultMessage: 'Select {name}',\n },\n { name: folder.name }\n )}\n />\n </Flex>\n </CheckboxTd>\n )}\n <NameTd>\n <Flex gap={3} alignItems=\"center\" minWidth={0}>\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n color=\"neutral600\"\n width=\"3.2rem\"\n height=\"3.2rem\"\n shrink={0}\n >\n <FolderIcon width={20} height={20} />\n </Flex>\n <TruncatedText textColor=\"neutral800\" fontWeight=\"semiBold\">\n {folder.name}\n </TruncatedText>\n </Flex>\n </NameTd>\n {isDesktop && (\n <>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.createdAt\n ? formatDate(new Date(folder.createdAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">\n {folder.updatedAt\n ? formatDate(new Date(folder.updatedAt), { dateStyle: 'long' })\n : '-'}\n </Typography>\n </HugTd>\n <HugTd>\n <Typography textColor=\"neutral600\">-</Typography>\n </HugTd>\n </>\n )}\n {/* The row owns click, Enter and Space; none of them should reach it from\n the menu trigger (Enter would navigate into the folder). */}\n <StyledTd onClick={stopRowEvent} onKeyDown={stopRowEvent} onPointerDown={stopRowEvent}>\n <Flex justifyContent=\"flex-end\">\n <FolderActionsMenu folder={folder} dragData={dragData} />\n </Flex>\n </StyledTd>\n </FolderTr>\n );\n};\n\ninterface AssetsTableProps {\n assets: File[];\n folders?: Folder[];\n /**\n * When set (\"Folders: Mixed with files\"), rows render in this interleaved\n * order instead of folders-first. Range selection follows the same order.\n */\n mixedItems?: MixedItem[] | null;\n /** Keys of the rendered rows, in render order. Owned by the view. */\n renderedKeys?: ItemKey[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsTable = ({\n assets,\n folders = [],\n mixedItems = null,\n renderedKeys,\n onAssetItemClick,\n}: AssetsTableProps) => {\n const isDesktop = useIsDesktop();\n const { formatMessage } = useIntl();\n const { selectedKeys, selectAll, clear } = useAssetSelection();\n const { canUpdate } = useMediaLibraryPermissions();\n const { trackUsage } = useTracking();\n\n // Below the desktop breakpoint only the name (and actions) column is kept —\n // the date/size columns don't fit; size moves under the name as a subtitle.\n const visibleHeaders = isDesktop\n ? TABLE_HEADERS\n : TABLE_HEADERS.filter((h) => h.name === 'name' || h.name === 'actions');\n\n // The checkbox column is a dedicated structural column (not part of\n // TABLE_HEADERS). Hidden only without the update permission — every bulk\n // action needs `assets.update`, so a read-only user has nothing to select for.\n const showCheckboxColumn = canUpdate;\n const colCount = visibleHeaders.length + (showCheckboxColumn ? 1 : 0);\n\n const totalRows = folders.length + assets.length;\n\n // Render order — folders first by default, or the interleaved mixed order.\n // Range selection follows it.\n const orderedItemKeys: ItemKey[] =\n renderedKeys ?? buildRenderedKeys({ folders, assets, mixedItems });\n const { allSelected, isIndeterminate } = getSelectAllState(selectedKeys, orderedItemKeys);\n\n const handleSelectAll = () => {\n if (allSelected) {\n clear();\n } else {\n trackUsage('didSelectAllMediaLibraryElements');\n selectAll(orderedItemKeys);\n }\n };\n\n // The empty state is owned by the page (`AssetsView` renders `EmptyState`) — an\n // empty table renders nothing at all, not headers over an empty body.\n if (totalRows === 0) {\n return null;\n }\n\n return (\n <StyledTable colCount={colCount} rowCount={(mixedItems ? mixedItems.length : totalRows) + 1}>\n <StyledThead>\n <RawTr>\n {showCheckboxColumn && (\n <CheckboxTh>\n <Flex>\n <Checkbox\n checked={isIndeterminate ? 'indeterminate' : allSelected}\n disabled={orderedItemKeys.length === 0}\n onCheckedChange={handleSelectAll}\n aria-label={formatMessage({\n id: getTranslationKey('list.table.header.select-all'),\n defaultMessage: 'Select all',\n })}\n />\n </Flex>\n </CheckboxTh>\n )}\n {visibleHeaders.map((header) => {\n const tableHeaderLabel = formatMessage(header.label);\n const isVisuallyHidden = 'isVisuallyHidden' in header && header.isVisuallyHidden;\n\n if (isVisuallyHidden) {\n return (\n <StyledTh key={header.name} $flex={header.name === 'name'}>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslationKey('table.header.actions'),\n defaultMessage: 'actions',\n })}\n </VisuallyHidden>\n </StyledTh>\n );\n }\n\n return (\n <StyledTh key={header.name} $flex={header.name === 'name'}>\n <Typography textColor=\"neutral600\" variant=\"sigma\">\n {tableHeaderLabel}\n </Typography>\n </StyledTh>\n );\n })}\n </RawTr>\n </StyledThead>\n <RawTbody>\n {mixedItems?.map((item) =>\n item.kind === 'folder' ? (\n <FolderRow\n key={`folder-${item.folder.id}`}\n folder={item.folder}\n orderedItemKeys={orderedItemKeys}\n />\n ) : (\n <AssetRow\n key={item.asset.id}\n asset={item.asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n )\n )}\n {!mixedItems &&\n folders.map((folder) => (\n <FolderRow\n key={`folder-${folder.id}`}\n folder={folder}\n orderedItemKeys={orderedItemKeys}\n />\n ))}\n {!mixedItems &&\n assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n orderedItemKeys={orderedItemKeys}\n onAssetItemClick={onAssetItemClick}\n />\n ))}\n </RawTbody>\n </StyledTable>\n );\n};\n"],"names":["StyledTable","styled","RawTable","theme","colors","neutral150","StyledThead","RawThead","neutral100","hugColumn","css","flexColumn","StyledTh","RawTh","spaces","$flex","StyledTd","RawTd","NameTd","HugTd","StyledTr","tr","$isSelected","primary100","neutral0","$isMovePending","$isBusy","$isInvalidDropTarget","$isDragging","$isValidDropTarget","primary600","CheckboxTd","CheckboxTh","MetadataWarning","WarningCircle","warning500","NameButton","button","stopRowEvent","e","isEventFromWithin","stopPropagation","AssetPreviewCell","asset","ext","mime","DocIcon","getAssetIcon","_jsx","Flex","justifyContent","alignItems","borderRadius","color","width","height","shrink","AssetRow","orderedItemKeys","onAssetItemClick","isDesktop","useIsDesktop","formatDate","formatMessage","useIntl","isMovePending","useAssetsDndOptional","attributes","listeners","setNodeRef","isDragging","dragData","useFileDraggable","isSelected","toggle","selectRange","useAssetSelection","canUpdate","useMediaLibraryPermissions","busyMessage","useBusyAssetsOptional","getBusyMessage","id","openContextMenu","useItemContextMenuTrigger","key","assetKey","selected","isMetadataMissing","caption","alternativeText","metadataMissingLabel","getTranslationKey","defaultMessage","handleRowClick","shiftKey","metaKey","ctrlKey","handleKeyDown","preventDefault","handleNameClick","handleCheckboxClick","_jsxs","ref","ASSET_DETAILS_TRIGGER_PROPS","tabIndex","role","data-native-context-menu","onContextMenu","kind","onDragStart","onClick","onKeyDown","onPointerDown","ASSET_ITEM_CONTROL_PROPS","Checkbox","checked","aria-label","name","gap","minWidth","Loader","small","direction","type","TruncatedText","textColor","fontWeight","Typography","variant","size","formatBytes","Tooltip","label","_Fragment","createdAt","Date","dateStyle","updatedAt","AssetActionsMenu","FolderTr","FolderRow","folder","navigateToFolder","useFolderNavigation","draggable","setDragRef","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","folderKey","node","FolderIcon","FolderActionsMenu","AssetsTable","assets","folders","mixedItems","renderedKeys","selectedKeys","selectAll","clear","trackUsage","useTracking","visibleHeaders","TABLE_HEADERS","filter","h","showCheckboxColumn","colCount","length","totalRows","buildRenderedKeys","allSelected","isIndeterminate","getSelectAllState","handleSelectAll","rowCount","RawTr","disabled","onCheckedChange","map","header","tableHeaderLabel","isVisuallyHidden","VisuallyHidden","RawTbody","item"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var designSystem = require('@strapi/design-system');
|
|
5
|
+
var ActionsMenuContent = require('./ActionsMenuContent.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The menu is anchored to a zero-sized element parked at the cursor, because
|
|
9
|
+
* the design system's `Menu` is a dropdown: it positions its content against a
|
|
10
|
+
* trigger, and a right-click has none.
|
|
11
|
+
*
|
|
12
|
+
* Inline styles rather than a `styled` wrapper — the trigger renders a design
|
|
13
|
+
* system `Button`, and losing the specificity race with its own class would put
|
|
14
|
+
* a stray button on the page.
|
|
15
|
+
*/ const CURSOR_ANCHOR_STYLE = {
|
|
16
|
+
position: 'fixed',
|
|
17
|
+
width: 0,
|
|
18
|
+
height: 0,
|
|
19
|
+
minWidth: 0,
|
|
20
|
+
minHeight: 0,
|
|
21
|
+
padding: 0,
|
|
22
|
+
border: 0,
|
|
23
|
+
opacity: 0,
|
|
24
|
+
overflow: 'hidden',
|
|
25
|
+
pointerEvents: 'none'
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A menu opened at the cursor by a right-click, rather than from a trigger the
|
|
29
|
+
* user can see.
|
|
30
|
+
*
|
|
31
|
+
* Extracted from `MainAreaContextMenu`, which opened the background create menu
|
|
32
|
+
* this way first; the item menus reuse it so the anchoring trick exists once.
|
|
33
|
+
*/ const CursorAnchoredMenu = ({ position, open, label, returnFocusTo, onClose, children })=>{
|
|
34
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
|
|
35
|
+
modal: false,
|
|
36
|
+
open: open,
|
|
37
|
+
onOpenChange: (nextOpen)=>{
|
|
38
|
+
if (!nextOpen) {
|
|
39
|
+
onClose();
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
children: [
|
|
43
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Trigger, {
|
|
44
|
+
tabIndex: -1,
|
|
45
|
+
// No visible content, so the name has to come from `aria-label` — the
|
|
46
|
+
// trigger's `label` prop renders as button text, which would defeat the
|
|
47
|
+
// point of an invisible anchor.
|
|
48
|
+
endIcon: null,
|
|
49
|
+
"aria-label": label,
|
|
50
|
+
style: {
|
|
51
|
+
...CURSOR_ANCHOR_STYLE,
|
|
52
|
+
top: position.y,
|
|
53
|
+
left: position.x
|
|
54
|
+
}
|
|
55
|
+
}),
|
|
56
|
+
/*#__PURE__*/ jsxRuntime.jsx(ActionsMenuContent.ActionsMenuContent, {
|
|
57
|
+
popoverPlacement: "bottom-start",
|
|
58
|
+
zIndex: 2,
|
|
59
|
+
minWidth: "22rem",
|
|
60
|
+
// The anchor is invisible and sits wherever the cursor was, so handing
|
|
61
|
+
// focus back to it on close would be a focus ring nobody can see. Focus
|
|
62
|
+
// is left alone when a click outside already moved it somewhere else.
|
|
63
|
+
onCloseAutoFocus: (event)=>{
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
const isFocusLost = document.activeElement === null || document.activeElement === document.body;
|
|
66
|
+
if (isFocusLost && returnFocusTo?.isConnected) {
|
|
67
|
+
returnFocusTo.focus();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
children: children
|
|
71
|
+
})
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
exports.CursorAnchoredMenu = CursorAnchoredMenu;
|
|
77
|
+
//# sourceMappingURL=CursorAnchoredMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorAnchoredMenu.js","sources":["../../../../../admin/src/pages/Assets/components/CursorAnchoredMenu.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nimport { Menu } from '@strapi/design-system';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\n\n/**\n * The menu is anchored to a zero-sized element parked at the cursor, because\n * the design system's `Menu` is a dropdown: it positions its content against a\n * trigger, and a right-click has none.\n *\n * Inline styles rather than a `styled` wrapper — the trigger renders a design\n * system `Button`, and losing the specificity race with its own class would put\n * a stray button on the page.\n */\nconst CURSOR_ANCHOR_STYLE: CSSProperties = {\n position: 'fixed',\n width: 0,\n height: 0,\n minWidth: 0,\n minHeight: 0,\n padding: 0,\n border: 0,\n opacity: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n};\n\nexport interface CursorPosition {\n x: number;\n y: number;\n}\n\ninterface CursorAnchoredMenuProps {\n position: CursorPosition;\n /**\n * Controlled, because a caller may need the menu shut while staying mounted —\n * picking an item that opens a dialog is exactly that case.\n */\n open: boolean;\n /** Names the menu for assistive tech — Radix points `aria-labelledby` at the anchor. */\n label: string;\n /** Where focus goes back on close — the element that was right-clicked. */\n returnFocusTo?: HTMLElement | null;\n /**\n * Asked to close. Callers that opened a dialog from an item must defer\n * unmounting until the dialog is done, or the dialog goes with them.\n */\n onClose: () => void;\n children: ReactNode;\n}\n\n/**\n * A menu opened at the cursor by a right-click, rather than from a trigger the\n * user can see.\n *\n * Extracted from `MainAreaContextMenu`, which opened the background create menu\n * this way first; the item menus reuse it so the anchoring trick exists once.\n */\nexport const CursorAnchoredMenu = ({\n position,\n open,\n label,\n returnFocusTo,\n onClose,\n children,\n}: CursorAnchoredMenuProps) => {\n return (\n <Menu.Root\n modal={false}\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <Menu.Trigger\n tabIndex={-1}\n // No visible content, so the name has to come from `aria-label` — the\n // trigger's `label` prop renders as button text, which would defeat the\n // point of an invisible anchor.\n endIcon={null}\n aria-label={label}\n style={{ ...CURSOR_ANCHOR_STYLE, top: position.y, left: position.x }}\n />\n <ActionsMenuContent\n popoverPlacement=\"bottom-start\"\n zIndex={2}\n minWidth=\"22rem\"\n // The anchor is invisible and sits wherever the cursor was, so handing\n // focus back to it on close would be a focus ring nobody can see. Focus\n // is left alone when a click outside already moved it somewhere else.\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n\n const isFocusLost =\n document.activeElement === null || document.activeElement === document.body;\n\n if (isFocusLost && returnFocusTo?.isConnected) {\n returnFocusTo.focus();\n }\n }}\n >\n {children}\n </ActionsMenuContent>\n </Menu.Root>\n );\n};\n"],"names":["CURSOR_ANCHOR_STYLE","position","width","height","minWidth","minHeight","padding","border","opacity","overflow","pointerEvents","CursorAnchoredMenu","open","label","returnFocusTo","onClose","children","_jsxs","Menu","Root","modal","onOpenChange","nextOpen","_jsx","Trigger","tabIndex","endIcon","aria-label","style","top","y","left","x","ActionsMenuContent","popoverPlacement","zIndex","onCloseAutoFocus","event","preventDefault","isFocusLost","document","activeElement","body","isConnected","focus"],"mappings":";;;;;;AAMA;;;;;;;;AAQC,IACD,MAAMA,mBAAAA,GAAqC;IACzCC,QAAAA,EAAU,OAAA;IACVC,KAAAA,EAAO,CAAA;IACPC,MAAAA,EAAQ,CAAA;IACRC,QAAAA,EAAU,CAAA;IACVC,SAAAA,EAAW,CAAA;IACXC,OAAAA,EAAS,CAAA;IACTC,MAAAA,EAAQ,CAAA;IACRC,OAAAA,EAAS,CAAA;IACTC,QAAAA,EAAU,QAAA;IACVC,aAAAA,EAAe;AACjB,CAAA;AA0BA;;;;;;AAMC,IACM,MAAMC,kBAAAA,GAAqB,CAAC,EACjCV,QAAQ,EACRW,IAAI,EACJC,KAAK,EACLC,aAAa,EACbC,OAAO,EACPC,QAAQ,EACgB,GAAA;IACxB,qBACEC,eAAA,CAACC,kBAAKC,IAAI,EAAA;QACRC,KAAAA,EAAO,KAAA;QACPR,IAAAA,EAAMA,IAAAA;AACNS,QAAAA,YAAAA,EAAc,CAACC,QAAAA,GAAAA;AACb,YAAA,IAAI,CAACA,QAAAA,EAAU;AACbP,gBAAAA,OAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA;;AAEA,0BAAAQ,cAAA,CAACL,kBAAKM,OAAO,EAAA;AACXC,gBAAAA,QAAAA,EAAU,EAAC;;;;gBAIXC,OAAAA,EAAS,IAAA;gBACTC,YAAAA,EAAYd,KAAAA;gBACZe,KAAAA,EAAO;AAAE,oBAAA,GAAG5B,mBAAmB;AAAE6B,oBAAAA,GAAAA,EAAK5B,SAAS6B,CAAC;AAAEC,oBAAAA,IAAAA,EAAM9B,SAAS+B;AAAE;;0BAErET,cAAA,CAACU,qCAAAA,EAAAA;gBACCC,gBAAAA,EAAiB,cAAA;gBACjBC,MAAAA,EAAQ,CAAA;gBACR/B,QAAAA,EAAS,OAAA;;;;AAITgC,gBAAAA,gBAAAA,EAAkB,CAACC,KAAAA,GAAAA;AACjBA,oBAAAA,KAAAA,CAAMC,cAAc,EAAA;oBAEpB,MAAMC,WAAAA,GACJC,SAASC,aAAa,KAAK,QAAQD,QAAAA,CAASC,aAAa,KAAKD,QAAAA,CAASE,IAAI;oBAE7E,IAAIH,WAAAA,IAAezB,eAAe6B,WAAAA,EAAa;AAC7C7B,wBAAAA,aAAAA,CAAc8B,KAAK,EAAA;AACrB,oBAAA;AACF,gBAAA,CAAA;AAEC5B,gBAAAA,QAAAA,EAAAA;;;;AAIT;;;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Menu } from '@strapi/design-system';
|
|
3
|
+
import { ActionsMenuContent } from './ActionsMenuContent.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The menu is anchored to a zero-sized element parked at the cursor, because
|
|
7
|
+
* the design system's `Menu` is a dropdown: it positions its content against a
|
|
8
|
+
* trigger, and a right-click has none.
|
|
9
|
+
*
|
|
10
|
+
* Inline styles rather than a `styled` wrapper — the trigger renders a design
|
|
11
|
+
* system `Button`, and losing the specificity race with its own class would put
|
|
12
|
+
* a stray button on the page.
|
|
13
|
+
*/ const CURSOR_ANCHOR_STYLE = {
|
|
14
|
+
position: 'fixed',
|
|
15
|
+
width: 0,
|
|
16
|
+
height: 0,
|
|
17
|
+
minWidth: 0,
|
|
18
|
+
minHeight: 0,
|
|
19
|
+
padding: 0,
|
|
20
|
+
border: 0,
|
|
21
|
+
opacity: 0,
|
|
22
|
+
overflow: 'hidden',
|
|
23
|
+
pointerEvents: 'none'
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* A menu opened at the cursor by a right-click, rather than from a trigger the
|
|
27
|
+
* user can see.
|
|
28
|
+
*
|
|
29
|
+
* Extracted from `MainAreaContextMenu`, which opened the background create menu
|
|
30
|
+
* this way first; the item menus reuse it so the anchoring trick exists once.
|
|
31
|
+
*/ const CursorAnchoredMenu = ({ position, open, label, returnFocusTo, onClose, children })=>{
|
|
32
|
+
return /*#__PURE__*/ jsxs(Menu.Root, {
|
|
33
|
+
modal: false,
|
|
34
|
+
open: open,
|
|
35
|
+
onOpenChange: (nextOpen)=>{
|
|
36
|
+
if (!nextOpen) {
|
|
37
|
+
onClose();
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
children: [
|
|
41
|
+
/*#__PURE__*/ jsx(Menu.Trigger, {
|
|
42
|
+
tabIndex: -1,
|
|
43
|
+
// No visible content, so the name has to come from `aria-label` — the
|
|
44
|
+
// trigger's `label` prop renders as button text, which would defeat the
|
|
45
|
+
// point of an invisible anchor.
|
|
46
|
+
endIcon: null,
|
|
47
|
+
"aria-label": label,
|
|
48
|
+
style: {
|
|
49
|
+
...CURSOR_ANCHOR_STYLE,
|
|
50
|
+
top: position.y,
|
|
51
|
+
left: position.x
|
|
52
|
+
}
|
|
53
|
+
}),
|
|
54
|
+
/*#__PURE__*/ jsx(ActionsMenuContent, {
|
|
55
|
+
popoverPlacement: "bottom-start",
|
|
56
|
+
zIndex: 2,
|
|
57
|
+
minWidth: "22rem",
|
|
58
|
+
// The anchor is invisible and sits wherever the cursor was, so handing
|
|
59
|
+
// focus back to it on close would be a focus ring nobody can see. Focus
|
|
60
|
+
// is left alone when a click outside already moved it somewhere else.
|
|
61
|
+
onCloseAutoFocus: (event)=>{
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
const isFocusLost = document.activeElement === null || document.activeElement === document.body;
|
|
64
|
+
if (isFocusLost && returnFocusTo?.isConnected) {
|
|
65
|
+
returnFocusTo.focus();
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
children: children
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export { CursorAnchoredMenu };
|
|
75
|
+
//# sourceMappingURL=CursorAnchoredMenu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CursorAnchoredMenu.mjs","sources":["../../../../../admin/src/pages/Assets/components/CursorAnchoredMenu.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nimport { Menu } from '@strapi/design-system';\n\nimport { ActionsMenuContent } from './ActionsMenuContent';\n\n/**\n * The menu is anchored to a zero-sized element parked at the cursor, because\n * the design system's `Menu` is a dropdown: it positions its content against a\n * trigger, and a right-click has none.\n *\n * Inline styles rather than a `styled` wrapper — the trigger renders a design\n * system `Button`, and losing the specificity race with its own class would put\n * a stray button on the page.\n */\nconst CURSOR_ANCHOR_STYLE: CSSProperties = {\n position: 'fixed',\n width: 0,\n height: 0,\n minWidth: 0,\n minHeight: 0,\n padding: 0,\n border: 0,\n opacity: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n};\n\nexport interface CursorPosition {\n x: number;\n y: number;\n}\n\ninterface CursorAnchoredMenuProps {\n position: CursorPosition;\n /**\n * Controlled, because a caller may need the menu shut while staying mounted —\n * picking an item that opens a dialog is exactly that case.\n */\n open: boolean;\n /** Names the menu for assistive tech — Radix points `aria-labelledby` at the anchor. */\n label: string;\n /** Where focus goes back on close — the element that was right-clicked. */\n returnFocusTo?: HTMLElement | null;\n /**\n * Asked to close. Callers that opened a dialog from an item must defer\n * unmounting until the dialog is done, or the dialog goes with them.\n */\n onClose: () => void;\n children: ReactNode;\n}\n\n/**\n * A menu opened at the cursor by a right-click, rather than from a trigger the\n * user can see.\n *\n * Extracted from `MainAreaContextMenu`, which opened the background create menu\n * this way first; the item menus reuse it so the anchoring trick exists once.\n */\nexport const CursorAnchoredMenu = ({\n position,\n open,\n label,\n returnFocusTo,\n onClose,\n children,\n}: CursorAnchoredMenuProps) => {\n return (\n <Menu.Root\n modal={false}\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <Menu.Trigger\n tabIndex={-1}\n // No visible content, so the name has to come from `aria-label` — the\n // trigger's `label` prop renders as button text, which would defeat the\n // point of an invisible anchor.\n endIcon={null}\n aria-label={label}\n style={{ ...CURSOR_ANCHOR_STYLE, top: position.y, left: position.x }}\n />\n <ActionsMenuContent\n popoverPlacement=\"bottom-start\"\n zIndex={2}\n minWidth=\"22rem\"\n // The anchor is invisible and sits wherever the cursor was, so handing\n // focus back to it on close would be a focus ring nobody can see. Focus\n // is left alone when a click outside already moved it somewhere else.\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n\n const isFocusLost =\n document.activeElement === null || document.activeElement === document.body;\n\n if (isFocusLost && returnFocusTo?.isConnected) {\n returnFocusTo.focus();\n }\n }}\n >\n {children}\n </ActionsMenuContent>\n </Menu.Root>\n );\n};\n"],"names":["CURSOR_ANCHOR_STYLE","position","width","height","minWidth","minHeight","padding","border","opacity","overflow","pointerEvents","CursorAnchoredMenu","open","label","returnFocusTo","onClose","children","_jsxs","Menu","Root","modal","onOpenChange","nextOpen","_jsx","Trigger","tabIndex","endIcon","aria-label","style","top","y","left","x","ActionsMenuContent","popoverPlacement","zIndex","onCloseAutoFocus","event","preventDefault","isFocusLost","document","activeElement","body","isConnected","focus"],"mappings":";;;;AAMA;;;;;;;;AAQC,IACD,MAAMA,mBAAAA,GAAqC;IACzCC,QAAAA,EAAU,OAAA;IACVC,KAAAA,EAAO,CAAA;IACPC,MAAAA,EAAQ,CAAA;IACRC,QAAAA,EAAU,CAAA;IACVC,SAAAA,EAAW,CAAA;IACXC,OAAAA,EAAS,CAAA;IACTC,MAAAA,EAAQ,CAAA;IACRC,OAAAA,EAAS,CAAA;IACTC,QAAAA,EAAU,QAAA;IACVC,aAAAA,EAAe;AACjB,CAAA;AA0BA;;;;;;AAMC,IACM,MAAMC,kBAAAA,GAAqB,CAAC,EACjCV,QAAQ,EACRW,IAAI,EACJC,KAAK,EACLC,aAAa,EACbC,OAAO,EACPC,QAAQ,EACgB,GAAA;IACxB,qBACEC,IAAA,CAACC,KAAKC,IAAI,EAAA;QACRC,KAAAA,EAAO,KAAA;QACPR,IAAAA,EAAMA,IAAAA;AACNS,QAAAA,YAAAA,EAAc,CAACC,QAAAA,GAAAA;AACb,YAAA,IAAI,CAACA,QAAAA,EAAU;AACbP,gBAAAA,OAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA;;AAEA,0BAAAQ,GAAA,CAACL,KAAKM,OAAO,EAAA;AACXC,gBAAAA,QAAAA,EAAU,EAAC;;;;gBAIXC,OAAAA,EAAS,IAAA;gBACTC,YAAAA,EAAYd,KAAAA;gBACZe,KAAAA,EAAO;AAAE,oBAAA,GAAG5B,mBAAmB;AAAE6B,oBAAAA,GAAAA,EAAK5B,SAAS6B,CAAC;AAAEC,oBAAAA,IAAAA,EAAM9B,SAAS+B;AAAE;;0BAErET,GAAA,CAACU,kBAAAA,EAAAA;gBACCC,gBAAAA,EAAiB,cAAA;gBACjBC,MAAAA,EAAQ,CAAA;gBACR/B,QAAAA,EAAS,OAAA;;;;AAITgC,gBAAAA,gBAAAA,EAAkB,CAACC,KAAAA,GAAAA;AACjBA,oBAAAA,KAAAA,CAAMC,cAAc,EAAA;oBAEpB,MAAMC,WAAAA,GACJC,SAASC,aAAa,KAAK,QAAQD,QAAAA,CAASC,aAAa,KAAKD,QAAAA,CAASE,IAAI;oBAE7E,IAAIH,WAAAA,IAAezB,eAAe6B,WAAAA,EAAa;AAC7C7B,wBAAAA,aAAAA,CAAc8B,KAAK,EAAA;AACrB,oBAAA;AACF,gBAAA,CAAA;AAEC5B,gBAAAA,QAAAA,EAAAA;;;;AAIT;;;;"}
|
|
@@ -6,6 +6,7 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
7
|
var icons = require('@strapi/icons');
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
|
+
var useApiErrorMessage = require('../../../hooks/useApiErrorMessage.js');
|
|
9
10
|
var assets = require('../../../services/assets.js');
|
|
10
11
|
var translations = require('../../../utils/translations.js');
|
|
11
12
|
|
|
@@ -20,6 +21,7 @@ var translations = require('../../../utils/translations.js');
|
|
|
20
21
|
*/ const DeleteItemsDialog = ({ open, onClose, target, onSuccess, onPendingChange })=>{
|
|
21
22
|
const { formatMessage } = reactIntl.useIntl();
|
|
22
23
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
24
|
+
const getErrorMessage = useApiErrorMessage.useApiErrorMessage();
|
|
23
25
|
const [bulkDeleteItems, { isLoading: isDeleting }] = assets.useBulkDeleteItemsMutation();
|
|
24
26
|
const count = target.fileIds.length + target.folderIds.length;
|
|
25
27
|
React.useEffect(()=>{
|
|
@@ -43,10 +45,10 @@ var translations = require('../../../utils/translations.js');
|
|
|
43
45
|
// (Confirm again) or Cancel; only surface the error toast.
|
|
44
46
|
toggleNotification({
|
|
45
47
|
type: 'danger',
|
|
46
|
-
message: formatMessage({
|
|
48
|
+
message: getErrorMessage(res.error, formatMessage({
|
|
47
49
|
id: translations.getTranslationKey('list.bulk-actions.delete.error'),
|
|
48
50
|
defaultMessage: 'An error occurred while deleting the items.'
|
|
49
|
-
})
|
|
51
|
+
}))
|
|
50
52
|
});
|
|
51
53
|
return;
|
|
52
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteItemsDialog.js","sources":["../../../../../admin/src/pages/Assets/components/DeleteItemsDialog.tsx"],"sourcesContent":["import { useEffect, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface DeleteItemsDialogProps {\n open: boolean;\n onClose: () => void;\n /** Explicit delete target — assets and/or folders, by id. */\n target: { fileIds: number[]; folderIds: number[] };\n /** Called after a successful delete, before the toast. */\n onSuccess?: () => void;\n /**\n * Mirrors the in-flight state out to the caller, so a host that has its own\n * controls (the bulk actions bar) can disable them for the duration.\n */\n onPendingChange?: (pending: boolean) => void;\n}\n\n/**\n * Confirm dialog for `POST /upload/actions/bulk-delete`. Fully controlled: the\n * caller owns `open` and renders its own trigger. Shared by the bulk actions bar\n * (selection-scoped) and the per-folder actions menu (item-scoped), so the\n * target is always passed in explicitly rather than read from the selection.\n *\n * Deleting a folder cascades server-side, which is why the copy warns about\n * folder contents even for a single item.\n */\nexport const DeleteItemsDialog = ({\n open,\n onClose,\n target,\n onSuccess,\n onPendingChange,\n}: DeleteItemsDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n\n const count = target.fileIds.length + target.folderIds.length;\n\n useEffect(() => {\n onPendingChange?.(isDeleting);\n }, [isDeleting, onPendingChange]);\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems(target);\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n
|
|
1
|
+
{"version":3,"file":"DeleteItemsDialog.js","sources":["../../../../../admin/src/pages/Assets/components/DeleteItemsDialog.tsx"],"sourcesContent":["import { useEffect, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useApiErrorMessage } from '../../../hooks/useApiErrorMessage';\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface DeleteItemsDialogProps {\n open: boolean;\n onClose: () => void;\n /** Explicit delete target — assets and/or folders, by id. */\n target: { fileIds: number[]; folderIds: number[] };\n /** Called after a successful delete, before the toast. */\n onSuccess?: () => void;\n /**\n * Mirrors the in-flight state out to the caller, so a host that has its own\n * controls (the bulk actions bar) can disable them for the duration.\n */\n onPendingChange?: (pending: boolean) => void;\n}\n\n/**\n * Confirm dialog for `POST /upload/actions/bulk-delete`. Fully controlled: the\n * caller owns `open` and renders its own trigger. Shared by the bulk actions bar\n * (selection-scoped) and the per-folder actions menu (item-scoped), so the\n * target is always passed in explicitly rather than read from the selection.\n *\n * Deleting a folder cascades server-side, which is why the copy warns about\n * folder contents even for a single item.\n */\nexport const DeleteItemsDialog = ({\n open,\n onClose,\n target,\n onSuccess,\n onPendingChange,\n}: DeleteItemsDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const getErrorMessage = useApiErrorMessage();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n\n const count = target.fileIds.length + target.folderIds.length;\n\n useEffect(() => {\n onPendingChange?.(isDeleting);\n }, [isDeleting, onPendingChange]);\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems(target);\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.error'),\n defaultMessage: 'An error occurred while deleting the items.',\n })\n ),\n });\n return;\n }\n\n onClose();\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.success'),\n defaultMessage:\n '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}',\n },\n { count }\n ),\n });\n onSuccess?.();\n };\n\n return (\n <Dialog.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The dialog must stay open while the request runs — a bulk delete\n // can't be aborted halfway, so the loader is the source of truth.\n if (!nextOpen && !isDeleting) {\n onClose();\n }\n }}\n >\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.confirm.title'),\n defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?',\n },\n { count }\n )}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n <Typography>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.confirm.description.are-you-sure'),\n defaultMessage:\n 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.',\n })}\n </Typography>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger-light\"\n loading={isDeleting}\n onClick={handleConfirmDelete}\n fullWidth\n >\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n"],"names":["DeleteItemsDialog","open","onClose","target","onSuccess","onPendingChange","formatMessage","useIntl","toggleNotification","useNotification","getErrorMessage","useApiErrorMessage","bulkDeleteItems","isLoading","isDeleting","useBulkDeleteItemsMutation","count","fileIds","length","folderIds","useEffect","handleConfirmDelete","e","preventDefault","res","type","message","error","id","getTranslationKey","defaultMessage","_jsx","Dialog","Root","onOpenChange","nextOpen","_jsxs","Content","Header","Body","icon","WarningCircle","width","height","fill","textAlign","Typography","Footer","Cancel","Button","variant","disabled","fullWidth","Action","loading","onClick"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { useNotification } from '@strapi/admin/strapi-admin';
|
|
|
4
4
|
import { Dialog, Typography, Button } from '@strapi/design-system';
|
|
5
5
|
import { WarningCircle } from '@strapi/icons';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
|
+
import { useApiErrorMessage } from '../../../hooks/useApiErrorMessage.mjs';
|
|
7
8
|
import { useBulkDeleteItemsMutation } from '../../../services/assets.mjs';
|
|
8
9
|
import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
9
10
|
|
|
@@ -18,6 +19,7 @@ import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
|
18
19
|
*/ const DeleteItemsDialog = ({ open, onClose, target, onSuccess, onPendingChange })=>{
|
|
19
20
|
const { formatMessage } = useIntl();
|
|
20
21
|
const { toggleNotification } = useNotification();
|
|
22
|
+
const getErrorMessage = useApiErrorMessage();
|
|
21
23
|
const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();
|
|
22
24
|
const count = target.fileIds.length + target.folderIds.length;
|
|
23
25
|
useEffect(()=>{
|
|
@@ -41,10 +43,10 @@ import { getTranslationKey } from '../../../utils/translations.mjs';
|
|
|
41
43
|
// (Confirm again) or Cancel; only surface the error toast.
|
|
42
44
|
toggleNotification({
|
|
43
45
|
type: 'danger',
|
|
44
|
-
message: formatMessage({
|
|
46
|
+
message: getErrorMessage(res.error, formatMessage({
|
|
45
47
|
id: getTranslationKey('list.bulk-actions.delete.error'),
|
|
46
48
|
defaultMessage: 'An error occurred while deleting the items.'
|
|
47
|
-
})
|
|
49
|
+
}))
|
|
48
50
|
});
|
|
49
51
|
return;
|
|
50
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteItemsDialog.mjs","sources":["../../../../../admin/src/pages/Assets/components/DeleteItemsDialog.tsx"],"sourcesContent":["import { useEffect, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface DeleteItemsDialogProps {\n open: boolean;\n onClose: () => void;\n /** Explicit delete target — assets and/or folders, by id. */\n target: { fileIds: number[]; folderIds: number[] };\n /** Called after a successful delete, before the toast. */\n onSuccess?: () => void;\n /**\n * Mirrors the in-flight state out to the caller, so a host that has its own\n * controls (the bulk actions bar) can disable them for the duration.\n */\n onPendingChange?: (pending: boolean) => void;\n}\n\n/**\n * Confirm dialog for `POST /upload/actions/bulk-delete`. Fully controlled: the\n * caller owns `open` and renders its own trigger. Shared by the bulk actions bar\n * (selection-scoped) and the per-folder actions menu (item-scoped), so the\n * target is always passed in explicitly rather than read from the selection.\n *\n * Deleting a folder cascades server-side, which is why the copy warns about\n * folder contents even for a single item.\n */\nexport const DeleteItemsDialog = ({\n open,\n onClose,\n target,\n onSuccess,\n onPendingChange,\n}: DeleteItemsDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n\n const count = target.fileIds.length + target.folderIds.length;\n\n useEffect(() => {\n onPendingChange?.(isDeleting);\n }, [isDeleting, onPendingChange]);\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems(target);\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n
|
|
1
|
+
{"version":3,"file":"DeleteItemsDialog.mjs","sources":["../../../../../admin/src/pages/Assets/components/DeleteItemsDialog.tsx"],"sourcesContent":["import { useEffect, type MouseEvent } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport { Button, Dialog, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useApiErrorMessage } from '../../../hooks/useApiErrorMessage';\nimport { useBulkDeleteItemsMutation } from '../../../services/assets';\nimport { getTranslationKey } from '../../../utils/translations';\n\ninterface DeleteItemsDialogProps {\n open: boolean;\n onClose: () => void;\n /** Explicit delete target — assets and/or folders, by id. */\n target: { fileIds: number[]; folderIds: number[] };\n /** Called after a successful delete, before the toast. */\n onSuccess?: () => void;\n /**\n * Mirrors the in-flight state out to the caller, so a host that has its own\n * controls (the bulk actions bar) can disable them for the duration.\n */\n onPendingChange?: (pending: boolean) => void;\n}\n\n/**\n * Confirm dialog for `POST /upload/actions/bulk-delete`. Fully controlled: the\n * caller owns `open` and renders its own trigger. Shared by the bulk actions bar\n * (selection-scoped) and the per-folder actions menu (item-scoped), so the\n * target is always passed in explicitly rather than read from the selection.\n *\n * Deleting a folder cascades server-side, which is why the copy warns about\n * folder contents even for a single item.\n */\nexport const DeleteItemsDialog = ({\n open,\n onClose,\n target,\n onSuccess,\n onPendingChange,\n}: DeleteItemsDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const getErrorMessage = useApiErrorMessage();\n const [bulkDeleteItems, { isLoading: isDeleting }] = useBulkDeleteItemsMutation();\n\n const count = target.fileIds.length + target.folderIds.length;\n\n useEffect(() => {\n onPendingChange?.(isDeleting);\n }, [isDeleting, onPendingChange]);\n\n const handleConfirmDelete = async (e: MouseEvent) => {\n // Radix AlertDialog.Action closes the dialog on click by default; prevent\n // that so the dialog stays open showing the loader while the request runs\n // (a bulk delete can take a while depending on the number of assets).\n e.preventDefault();\n\n // Guard re-entry while pending.\n if (isDeleting) {\n return;\n }\n\n const res = await bulkDeleteItems(target);\n\n if ('error' in res) {\n // Keep the dialog open and the selection intact so the user can retry\n // (Confirm again) or Cancel; only surface the error toast.\n toggleNotification({\n type: 'danger',\n message: getErrorMessage(\n res.error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.error'),\n defaultMessage: 'An error occurred while deleting the items.',\n })\n ),\n });\n return;\n }\n\n onClose();\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.success'),\n defaultMessage:\n '{count, plural, =1 {# item has been deleted} other {# items have been deleted}}',\n },\n { count }\n ),\n });\n onSuccess?.();\n };\n\n return (\n <Dialog.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The dialog must stay open while the request runs — a bulk delete\n // can't be aborted halfway, so the loader is the source of truth.\n if (!nextOpen && !isDeleting) {\n onClose();\n }\n }}\n >\n <Dialog.Content>\n <Dialog.Header>\n {formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.delete.confirm.title'),\n defaultMessage: 'Delete {count, plural, =1 {# item} other {# items}}?',\n },\n { count }\n )}\n </Dialog.Header>\n <Dialog.Body\n icon={<WarningCircle width=\"24px\" height=\"24px\" fill=\"danger600\" />}\n textAlign=\"center\"\n >\n <Typography>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.delete.confirm.description.are-you-sure'),\n defaultMessage:\n 'These items cannot be recovered once deleted, and deleting a folder also deletes everything inside it. If they are currently in use, linked content will break and image containers will be empty.',\n })}\n </Typography>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\" disabled={isDeleting} fullWidth>\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger-light\"\n loading={isDeleting}\n onClick={handleConfirmDelete}\n fullWidth\n >\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n};\n"],"names":["DeleteItemsDialog","open","onClose","target","onSuccess","onPendingChange","formatMessage","useIntl","toggleNotification","useNotification","getErrorMessage","useApiErrorMessage","bulkDeleteItems","isLoading","isDeleting","useBulkDeleteItemsMutation","count","fileIds","length","folderIds","useEffect","handleConfirmDelete","e","preventDefault","res","type","message","error","id","getTranslationKey","defaultMessage","_jsx","Dialog","Root","onOpenChange","nextOpen","_jsxs","Content","Header","Body","icon","WarningCircle","width","height","fill","textAlign","Typography","Footer","Cancel","Button","variant","disabled","fullWidth","Action","loading","onClick"],"mappings":";;;;;;;;;;AAyBA;;;;;;;;AAQC,IACM,MAAMA,iBAAAA,GAAoB,CAAC,EAChCC,IAAI,EACJC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,eAAe,EACQ,GAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAMC,eAAAA,GAAkBC,kBAAAA,EAAAA;AACxB,IAAA,MAAM,CAACC,eAAAA,EAAiB,EAAEC,WAAWC,UAAU,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;IAErD,MAAMC,KAAAA,GAAQb,OAAOc,OAAO,CAACC,MAAM,GAAGf,MAAAA,CAAOgB,SAAS,CAACD,MAAM;IAE7DE,SAAAA,CAAU,IAAA;QACRf,eAAAA,GAAkBS,UAAAA,CAAAA;IACpB,CAAA,EAAG;AAACA,QAAAA,UAAAA;AAAYT,QAAAA;AAAgB,KAAA,CAAA;AAEhC,IAAA,MAAMgB,sBAAsB,OAAOC,CAAAA,GAAAA;;;;AAIjCA,QAAAA,CAAAA,CAAEC,cAAc,EAAA;;AAGhB,QAAA,IAAIT,UAAAA,EAAY;AACd,YAAA;AACF,QAAA;QAEA,MAAMU,GAAAA,GAAM,MAAMZ,eAAAA,CAAgBT,MAAAA,CAAAA;AAElC,QAAA,IAAI,WAAWqB,GAAAA,EAAK;;;YAGlBhB,kBAAAA,CAAmB;gBACjBiB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAShB,eAAAA,CACPc,GAAAA,CAAIG,KAAK,EACTrB,aAAAA,CAAc;AACZsB,oBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,gCAAA,CAAA;oBACtBC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;AAEJ,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA5B,QAAAA,OAAAA,EAAAA;QACAM,kBAAAA,CAAmB;YACjBiB,IAAAA,EAAM,SAAA;AACNC,YAAAA,OAAAA,EAASpB,aAAAA,CACP;AACEsB,gBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,kCAAA,CAAA;gBACtBC,cAAAA,EACE;aACJ,EACA;AAAEd,gBAAAA;AAAM,aAAA;AAEZ,SAAA,CAAA;AACAZ,QAAAA,SAAAA,IAAAA;AACF,IAAA,CAAA;IAEA,qBACE2B,GAAA,CAACC,OAAOC,IAAI,EAAA;QACVhC,IAAAA,EAAMA,IAAAA;AACNiC,QAAAA,YAAAA,EAAc,CAACC,QAAAA,GAAAA;;;YAGb,IAAI,CAACA,QAAAA,IAAY,CAACrB,UAAAA,EAAY;AAC5BZ,gBAAAA,OAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA;gCAEAkC,IAAA,CAACJ,OAAOK,OAAO,EAAA;;AACb,8BAAAN,GAAA,CAACC,OAAOM,MAAM,EAAA;8BACXhC,aAAAA,CACC;AACEsB,wBAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,wCAAA,CAAA;wBACtBC,cAAAA,EAAgB;qBAClB,EACA;AAAEd,wBAAAA;AAAM,qBAAA;;AAGZ,8BAAAe,GAAA,CAACC,OAAOO,IAAI,EAAA;AACVC,oBAAAA,IAAAA,gBAAMT,GAAA,CAACU,aAAAA,EAAAA;wBAAcC,KAAAA,EAAM,MAAA;wBAAOC,MAAAA,EAAO,MAAA;wBAAOC,IAAAA,EAAK;;oBACrDC,SAAAA,EAAU,QAAA;AAEV,oBAAA,QAAA,gBAAAd,GAAA,CAACe,UAAAA,EAAAA;kCACExC,aAAAA,CAAc;AACbsB,4BAAAA,EAAAA,EAAIC,iBAAAA,CAAkB,2DAAA,CAAA;4BACtBC,cAAAA,EACE;AACJ,yBAAA;;;AAGJ,8BAAAM,IAAA,CAACJ,OAAOe,MAAM,EAAA;;AACZ,sCAAAhB,GAAA,CAACC,OAAOgB,MAAM,EAAA;AACZ,4BAAA,QAAA,gBAAAjB,GAAA,CAACkB,MAAAA,EAAAA;gCAAOC,OAAAA,EAAQ,UAAA;gCAAWC,QAAAA,EAAUrC,UAAAA;gCAAYsC,SAAS,EAAA,IAAA;0CACvD9C,aAAAA,CAAc;oCAAEsB,EAAAA,EAAI,8BAAA;oCAAgCE,cAAAA,EAAgB;AAAS,iCAAA;;;AAGlF,sCAAAC,GAAA,CAACC,OAAOqB,MAAM,EAAA;AACZ,4BAAA,QAAA,gBAAAtB,GAAA,CAACkB,MAAAA,EAAAA;gCACCC,OAAAA,EAAQ,cAAA;gCACRI,OAAAA,EAASxC,UAAAA;gCACTyC,OAAAA,EAASlC,mBAAAA;gCACT+B,SAAS,EAAA,IAAA;0CAER9C,aAAAA,CAAc;oCACbsB,EAAAA,EAAI,+BAAA;oCACJE,cAAAA,EAAgB;AAClB,iCAAA;;;;;;;;AAOd;;;;"}
|