@strapi/upload 5.59.0 → 5.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +4 -3
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +4 -3
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
- package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +130 -88
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +129 -91
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
- package/dist/admin/components/UploadProgressDialog.js +2 -1
- package/dist/admin/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/components/UploadProgressDialog.mjs +2 -1
- package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +13 -302
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
- package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
- package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
- package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/services/api.js +92 -7
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +91 -9
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
- package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
- package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
- package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
- package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
- package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
- package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
- package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
- package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
- package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
- package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
- package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
- package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
- package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
- package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
- package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
- package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
- package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
- package/dist/admin/src/services/api.d.ts +24 -1
- package/dist/admin/src/store/uploadProgress.d.ts +14 -1
- package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
- package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
- package/dist/admin/store/uploadProgress.js +30 -3
- package/dist/admin/store/uploadProgress.js.map +1 -1
- package/dist/admin/store/uploadProgress.mjs +29 -4
- package/dist/admin/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +20 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +20 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/findFolderPath.js +26 -0
- package/dist/admin/utils/findFolderPath.js.map +1 -0
- package/dist/admin/utils/findFolderPath.mjs +24 -0
- package/dist/admin/utils/findFolderPath.mjs.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.js +33 -0
- package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
- package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
- package/dist/server/controllers/admin-settings.js +5 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +5 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +2 -2
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +2 -2
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +11 -11
- package/dist/server/src/services/image-manipulation.d.ts +1 -1
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/types.d.ts +63 -12
- package/dist/server/src/types.d.ts.map +1 -1
- package/package.json +8 -6
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
- package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
- package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetRow.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/AssetRow.tsx"],"sourcesContent":["import { Flex, IconButton, Typography } from '@strapi/design-system';\nimport { Link, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../utils/files';\nimport { getAssetIcon } from '../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../utils/translations';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nconst Row = styled(Flex)`\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst Thumbnail = styled(Flex)`\n width: 3.2rem;\n height: 3.2rem;\n flex-shrink: 0;\n overflow: hidden;\n border-radius: 4px;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\nconst ThumbnailImage = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst Name = styled(Typography)`\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\ninterface AssetThumbnailProps {\n asset: File;\n}\n\nconst AssetThumbnail = ({ asset }: AssetThumbnailProps) => {\n const { alternativeText, ext, formats, mime, url, updatedAt, isLocal, isUrlSigned } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n // Same two rules the grid preview applies: a `updatedAt` cache-buster so a\n // replaced asset stops serving its old thumbnail, skipped on signed URLs\n // because an extra param invalidates the signature (#26581).\n const rawUrl =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;\n const src =\n rawUrl && cacheKey !== undefined\n ? `${rawUrl}${rawUrl.includes('?') ? '&' : '?'}v=${cacheKey}`\n : rawUrl;\n\n if (src) {\n return (\n <Thumbnail>\n <ThumbnailImage\n src={src}\n alt={alternativeText || ''}\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n draggable={false}\n />\n </Thumbnail>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <Thumbnail justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={20} height={20} />\n </Thumbnail>\n );\n};\n\ninterface AssetRowProps {\n asset: File;\n disabled?: boolean;\n onCopyLink: (asset: File) => void;\n onEdit?: (asset: File) => void;\n onRemove: (asset: File) => void;\n}\n\n/**\n * One asset already held by the field. The uploading and failed variants the\n * design also specifies are not here yet — while an upload runs, the global\n * progress dialog is what reports it.\n */\nexport const AssetRow = ({\n asset,\n disabled = false,\n onCopyLink,\n onEdit,\n onRemove,\n}: AssetRowProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Row\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={3}\n paddingLeft={3}\n paddingRight={3}\n paddingTop={2}\n paddingBottom={2}\n >\n <Flex alignItems=\"center\" gap={3} minWidth={0}>\n <AssetThumbnail asset={asset} />\n <Name textColor=\"neutral800\">{asset.name}</Name>\n </Flex>\n <Flex tag=\"span\" gap={1} shrink={0}>\n <IconButton\n variant=\"ghost\"\n onClick={() => onCopyLink(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.copy-link'),\n defaultMessage: 'Copy link to {name}',\n },\n { name: asset.name }\n )}\n >\n <Link />\n </IconButton>\n {onEdit && (\n <IconButton\n variant=\"ghost\"\n disabled={disabled}\n onClick={() => onEdit(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.edit'),\n defaultMessage: 'Edit {name}',\n },\n { name: asset.name }\n )}\n >\n <Pencil />\n </IconButton>\n )}\n <IconButton\n variant=\"ghost\"\n disabled={disabled}\n onClick={() => onRemove(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.remove'),\n defaultMessage: 'Remove {name}',\n },\n { name: asset.name }\n )}\n >\n <Trash />\n </IconButton>\n </Flex>\n </Row>\n );\n};\n"],"names":["Row","styled","Flex","theme","colors","neutral0","neutral200","borderRadius","Thumbnail","neutral500","neutral100","ThumbnailImage","img","Name","Typography","AssetThumbnail","asset","alternativeText","ext","formats","mime","url","updatedAt","isLocal","isUrlSigned","includes","ASSET_TYPES","Image","rawUrl","prefixFileUrlWithBackendUrl","thumbnail","cacheKey","Date","getTime","undefined","src","_jsx","alt","crossOrigin","draggable","DocIcon","getAssetIcon","justifyContent","alignItems","width","height","AssetRow","disabled","onCopyLink","onEdit","onRemove","formatMessage","useIntl","_jsxs","gap","paddingLeft","paddingRight","paddingTop","paddingBottom","minWidth","textColor","name","tag","shrink","IconButton","variant","onClick","label","id","getTranslationKey","defaultMessage","Link","Pencil","Trash"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetRow.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/AssetRow.tsx"],"sourcesContent":["import { Box, Button, Flex, Typography } from '@strapi/design-system';\nimport { ArrowClockwise, Cross, Link, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../utils/translations';\n\nimport { AssetPreview, UploadPreview } from './AssetPreview';\nimport { GhostIconButton } from './FieldControls';\nimport { UploadProgressBar } from './UploadProgressBar';\n\nimport type { FieldUpload } from './useFieldUploads';\nimport type { File } from '../../../../shared/contracts/files';\n\ntype RowTone = 'neutral' | 'primary' | 'danger';\n\nconst ROW_COLORS = {\n neutral: { background: 'neutral100', border: 'neutral200' },\n primary: { background: 'primary100', border: 'primary200' },\n danger: { background: 'danger100', border: 'danger200' },\n} as const;\n\nconst Row = styled(Flex)<{ $tone: RowTone }>`\n min-height: 7.2rem;\n background: ${({ theme, $tone }) => theme.colors[ROW_COLORS[$tone].background]};\n border: 1px solid ${({ theme, $tone }) => theme.colors[ROW_COLORS[$tone].border]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst Name = styled(Typography)`\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\ninterface RowFrameProps {\n tone: RowTone;\n children: React.ReactNode;\n}\n\nconst RowFrame = ({ tone, children }: RowFrameProps) => (\n <Row $tone={tone} alignItems=\"center\" gap={4} padding={4}>\n {children}\n </Row>\n);\n\ninterface AssetRowProps {\n asset: File;\n disabled?: boolean;\n onCopyLink: (asset: File) => void;\n onEdit?: (asset: File) => void;\n onRemove: (asset: File) => void;\n}\n\n/**\n * The asset a single-value field holds.\n */\nexport const AssetRow = ({\n asset,\n disabled = false,\n onCopyLink,\n onEdit,\n onRemove,\n}: AssetRowProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <RowFrame tone=\"neutral\">\n <AssetPreview asset={asset} size=\"S\" />\n <Name textColor=\"neutral800\" flex={1}>\n {asset.name}\n </Name>\n <Flex gap={2} shrink={0}>\n <GhostIconButton\n onClick={() => onCopyLink(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.copy-link'),\n defaultMessage: 'Copy link to {name}',\n },\n { name: asset.name }\n )}\n >\n <Link />\n </GhostIconButton>\n {onEdit && (\n <GhostIconButton\n disabled={disabled}\n onClick={() => onEdit(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.edit'),\n defaultMessage: 'Edit {name}',\n },\n { name: asset.name }\n )}\n >\n <Pencil />\n </GhostIconButton>\n )}\n <GhostIconButton\n disabled={disabled}\n onClick={() => onRemove(asset)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.remove'),\n defaultMessage: 'Remove {name}',\n },\n { name: asset.name }\n )}\n >\n <Trash />\n </GhostIconButton>\n </Flex>\n </RowFrame>\n );\n};\n\ninterface UploadRowProps {\n upload: FieldUpload;\n disabled?: boolean;\n onCancel: (upload: FieldUpload) => void;\n onRetry: (upload: FieldUpload) => void;\n onRemove: (upload: FieldUpload) => void;\n}\n\n/**\n * A file a single-value field is uploading, or failed to upload.\n */\nexport const UploadRow = ({\n upload,\n disabled = false,\n onCancel,\n onRetry,\n onRemove,\n}: UploadRowProps) => {\n const { formatMessage } = useIntl();\n const canRetry = upload.isInStore || upload.sourceFile !== undefined;\n\n if (upload.status === 'failed') {\n return (\n <RowFrame tone=\"danger\">\n <UploadPreview file={upload.sourceFile} size=\"S\" />\n <Name textColor=\"danger600\" flex={1}>\n {upload.name}\n </Name>\n <Flex gap={2} shrink={0}>\n {canRetry && (\n <Button\n variant=\"ghost\"\n startIcon={<ArrowClockwise />}\n disabled={disabled}\n onClick={() => onRetry(upload)}\n >\n {formatMessage({\n id: getTranslationKey('upload.progress.retry'),\n defaultMessage: 'Retry',\n })}\n </Button>\n )}\n <Button\n variant=\"danger-light\"\n startIcon={<Trash />}\n disabled={disabled}\n onClick={() => onRemove(upload)}\n >\n {formatMessage({\n id: getTranslationKey('content-manager.input.actions.remove-failed'),\n defaultMessage: 'Remove',\n })}\n </Button>\n </Flex>\n </RowFrame>\n );\n }\n\n const uploadingLabel = formatMessage({\n id: getTranslationKey('upload.progress.file.uploading'),\n defaultMessage: 'Uploading...',\n });\n\n return (\n <RowFrame tone=\"primary\">\n <UploadPreview file={upload.sourceFile} size=\"S\" />\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2} flex={1} minWidth={0}>\n <Flex justifyContent=\"space-between\" gap={4}>\n <Name textColor=\"neutral800\">{upload.name}</Name>\n <Box shrink={0}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {uploadingLabel}\n </Typography>\n </Box>\n </Flex>\n <UploadProgressBar progress={upload.progress} label={uploadingLabel} />\n </Flex>\n <Box shrink={0}>\n <GhostIconButton\n onClick={() => onCancel(upload)}\n label={formatMessage(\n {\n id: getTranslationKey('content-manager.input.actions.cancel'),\n defaultMessage: 'Cancel upload of {name}',\n },\n { name: upload.name }\n )}\n >\n <Cross />\n </GhostIconButton>\n </Box>\n </RowFrame>\n );\n};\n"],"names":["ROW_COLORS","neutral","background","border","primary","danger","Row","styled","Flex","theme","$tone","colors","borderRadius","Name","Typography","RowFrame","tone","children","_jsx","alignItems","gap","padding","AssetRow","asset","disabled","onCopyLink","onEdit","onRemove","formatMessage","useIntl","_jsxs","AssetPreview","size","textColor","flex","name","shrink","GhostIconButton","onClick","label","id","getTranslationKey","defaultMessage","Link","Pencil","Trash","UploadRow","upload","onCancel","onRetry","canRetry","isInStore","sourceFile","undefined","status","UploadPreview","file","Button","variant","startIcon","ArrowClockwise","uploadingLabel","direction","minWidth","justifyContent","Box","UploadProgressBar","progress","Cross"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var designSystem = require('@strapi/design-system');
|
|
4
|
+
var styledComponents = require('styled-components');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A ghost `IconButton` that stays a bare icon when disabled. The design system
|
|
8
|
+
* paints every disabled button, ghost included, as a bordered grey plate.
|
|
9
|
+
*/ const GhostIconButton = styledComponents.styled(designSystem.IconButton).attrs({
|
|
10
|
+
variant: 'ghost'
|
|
11
|
+
})`
|
|
12
|
+
&&[aria-disabled='true'] {
|
|
13
|
+
border-color: transparent;
|
|
14
|
+
background: transparent;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
&&[aria-disabled='true'] svg path {
|
|
18
|
+
fill: ${({ theme })=>theme.colors.neutral300};
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
/**
|
|
22
|
+
* A `Menu.Item` whose label greys out with its icon when disabled. The design
|
|
23
|
+
* system computes a disabled text colour, then its own stylesheet overrides it.
|
|
24
|
+
*/ const FieldMenuItem = styledComponents.styled(designSystem.Menu.Item)`
|
|
25
|
+
&&[aria-disabled='true'] {
|
|
26
|
+
color: ${({ theme })=>theme.colors.neutral500};
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
exports.FieldMenuItem = FieldMenuItem;
|
|
31
|
+
exports.GhostIconButton = GhostIconButton;
|
|
32
|
+
//# sourceMappingURL=FieldControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldControls.js","sources":["../../../../admin/src/components/MediaLibraryInput/FieldControls.tsx"],"sourcesContent":["import { IconButton, Menu } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * A ghost `IconButton` that stays a bare icon when disabled. The design system\n * paints every disabled button, ghost included, as a bordered grey plate.\n */\nexport const GhostIconButton = styled(IconButton).attrs({ variant: 'ghost' })`\n &&[aria-disabled='true'] {\n border-color: transparent;\n background: transparent;\n }\n\n &&[aria-disabled='true'] svg path {\n fill: ${({ theme }) => theme.colors.neutral300};\n }\n`;\n\n/**\n * A `Menu.Item` whose label greys out with its icon when disabled. The design\n * system computes a disabled text colour, then its own stylesheet overrides it.\n */\nexport const FieldMenuItem = styled(Menu.Item)`\n &&[aria-disabled='true'] {\n color: ${({ theme }) => theme.colors.neutral500};\n }\n`;\n"],"names":["GhostIconButton","styled","IconButton","attrs","variant","theme","colors","neutral300","FieldMenuItem","Menu","Item","neutral500"],"mappings":";;;;;AAGA;;;AAGC,IACM,MAAMA,eAAAA,GAAkBC,uBAAAA,CAAOC,uBAAAA,CAAAA,CAAYC,KAAK,CAAC;IAAEC,OAAAA,EAAS;AAAQ,CAAA,CAAE;;;;;;;UAOnE,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAEnD;AAEA;;;AAGC,IACM,MAAMC,aAAAA,GAAgBP,wBAAOQ,iBAAAA,CAAKC,IAAI,CAAC;;WAEnC,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACK,UAAU,CAAC;;AAEpD;;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IconButton, Menu } from '@strapi/design-system';
|
|
2
|
+
import { styled } from 'styled-components';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A ghost `IconButton` that stays a bare icon when disabled. The design system
|
|
6
|
+
* paints every disabled button, ghost included, as a bordered grey plate.
|
|
7
|
+
*/ const GhostIconButton = styled(IconButton).attrs({
|
|
8
|
+
variant: 'ghost'
|
|
9
|
+
})`
|
|
10
|
+
&&[aria-disabled='true'] {
|
|
11
|
+
border-color: transparent;
|
|
12
|
+
background: transparent;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&&[aria-disabled='true'] svg path {
|
|
16
|
+
fill: ${({ theme })=>theme.colors.neutral300};
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
/**
|
|
20
|
+
* A `Menu.Item` whose label greys out with its icon when disabled. The design
|
|
21
|
+
* system computes a disabled text colour, then its own stylesheet overrides it.
|
|
22
|
+
*/ const FieldMenuItem = styled(Menu.Item)`
|
|
23
|
+
&&[aria-disabled='true'] {
|
|
24
|
+
color: ${({ theme })=>theme.colors.neutral500};
|
|
25
|
+
}
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
export { FieldMenuItem, GhostIconButton };
|
|
29
|
+
//# sourceMappingURL=FieldControls.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldControls.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/FieldControls.tsx"],"sourcesContent":["import { IconButton, Menu } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * A ghost `IconButton` that stays a bare icon when disabled. The design system\n * paints every disabled button, ghost included, as a bordered grey plate.\n */\nexport const GhostIconButton = styled(IconButton).attrs({ variant: 'ghost' })`\n &&[aria-disabled='true'] {\n border-color: transparent;\n background: transparent;\n }\n\n &&[aria-disabled='true'] svg path {\n fill: ${({ theme }) => theme.colors.neutral300};\n }\n`;\n\n/**\n * A `Menu.Item` whose label greys out with its icon when disabled. The design\n * system computes a disabled text colour, then its own stylesheet overrides it.\n */\nexport const FieldMenuItem = styled(Menu.Item)`\n &&[aria-disabled='true'] {\n color: ${({ theme }) => theme.colors.neutral500};\n }\n`;\n"],"names":["GhostIconButton","styled","IconButton","attrs","variant","theme","colors","neutral300","FieldMenuItem","Menu","Item","neutral500"],"mappings":";;;AAGA;;;AAGC,IACM,MAAMA,eAAAA,GAAkBC,MAAAA,CAAOC,UAAAA,CAAAA,CAAYC,KAAK,CAAC;IAAEC,OAAAA,EAAS;AAAQ,CAAA,CAAE;;;;;;;UAOnE,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAEnD;AAEA;;;AAGC,IACM,MAAMC,aAAAA,GAAgBP,OAAOQ,IAAAA,CAAKC,IAAI,CAAC;;WAEnC,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACK,UAAU,CAAC;;AAEpD;;;;"}
|
|
@@ -4,13 +4,12 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
|
+
var get = require('lodash/get');
|
|
7
8
|
var reactIntl = require('react-intl');
|
|
8
9
|
var useAIMetadataEnabled = require('../../hooks/useAIMetadataEnabled.js');
|
|
9
10
|
var useMediaLibraryPermissions = require('../../hooks/useMediaLibraryPermissions.js');
|
|
10
11
|
var useTracking = require('../../hooks/useTracking.js');
|
|
11
|
-
var AssetDialog = require('../../legacy/components/AssetDialog/AssetDialog.js');
|
|
12
12
|
var EditAssetContent = require('../../legacy/components/EditAssetDialog/EditAssetContent.js');
|
|
13
|
-
var EditFolderDialog = require('../../legacy/components/EditFolderDialog/EditFolderDialog.js');
|
|
14
13
|
var ImportFromUrlDialog = require('../../pages/Assets/components/ImportFromUrlDialog.js');
|
|
15
14
|
var api = require('../../services/api.js');
|
|
16
15
|
var settings = require('../../services/settings.js');
|
|
@@ -18,11 +17,26 @@ var allowedMediaTypes = require('../../utils/allowedMediaTypes.js');
|
|
|
18
17
|
var files = require('../../utils/files.js');
|
|
19
18
|
var translations = require('../../utils/translations.js');
|
|
20
19
|
var typeFromMime = require('../../utils/typeFromMime.js');
|
|
20
|
+
var AssetPickerDialog = require('../AssetPickerDialog/AssetPickerDialog.js');
|
|
21
21
|
var AddAssetMenu = require('./AddAssetMenu.js');
|
|
22
|
+
var AssetCard = require('./AssetCard.js');
|
|
23
|
+
var AssetCarousel = require('./AssetCarousel.js');
|
|
22
24
|
var AssetDropZone = require('./AssetDropZone.js');
|
|
23
25
|
var AssetRow = require('./AssetRow.js');
|
|
24
|
-
var
|
|
26
|
+
var useFieldUploads = require('./useFieldUploads.js');
|
|
25
27
|
|
|
28
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
29
|
+
|
|
30
|
+
var get__default = /*#__PURE__*/_interopDefault(get);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* What a field wrote that its form has not rendered yet, per form and field.
|
|
34
|
+
* `getValues()` only catches up on render, and two uploads can complete before
|
|
35
|
+
* the next one. Kept outside the input so it survives a remount.
|
|
36
|
+
*/ const unrenderedWrites = new WeakMap();
|
|
37
|
+
const toAssets = (value)=>Array.isArray(value) ? value : value ? [
|
|
38
|
+
value
|
|
39
|
+
] : [];
|
|
26
40
|
/**
|
|
27
41
|
* `location` for every event this field fires. The standalone Media Library
|
|
28
42
|
* tags its events `'upload'`; the picker inside an entry form has always been
|
|
@@ -44,15 +58,15 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
44
58
|
*
|
|
45
59
|
* The legacy input is still registered when `useLegacyMediaLibrary` is on, and
|
|
46
60
|
* is untouched by this.
|
|
47
|
-
*/ const MediaLibraryInput = ({ name, label, labelAction, hint, required = false, disabled = false, attribute = EMPTY_ATTRIBUTE })=>{
|
|
61
|
+
*/ const MediaLibraryInput = ({ name, label, labelAction, hint, required = false, disabled = false, attribute = EMPTY_ATTRIBUTE, layoutSize })=>{
|
|
48
62
|
const { allowedTypes = null, multiple = false } = attribute;
|
|
49
63
|
const { formatMessage } = reactIntl.useIntl();
|
|
50
64
|
const { onChange, value, error } = strapiAdmin.useField(name);
|
|
51
65
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
52
66
|
const { trackUsage } = useTracking.useTracking();
|
|
53
67
|
const { copy } = strapiAdmin.useClipboard();
|
|
68
|
+
const getValues = strapiAdmin.useForm('MediaLibraryInput', (state)=>state.getValues);
|
|
54
69
|
const [step, setStep] = React.useState(undefined);
|
|
55
|
-
const [folderId, setFolderId] = React.useState(null);
|
|
56
70
|
const [editedAsset, setEditedAsset] = React.useState(null);
|
|
57
71
|
const [isUrlDialogOpen, setIsUrlDialogOpen] = React.useState(false);
|
|
58
72
|
const fileInputRef = React.useRef(null);
|
|
@@ -60,7 +74,10 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
60
74
|
const [uploadFromUrls] = api.useUploadFromUrlsMutation();
|
|
61
75
|
// Echoes the app config; a missing payload (still loading) falls back to
|
|
62
76
|
// sequential rather than outpacing what the server asked for.
|
|
63
|
-
const { canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions.useMediaLibraryPermissions();
|
|
77
|
+
const { isLoading, canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions.useMediaLibraryPermissions();
|
|
78
|
+
// Not while permissions load: `useRBAC` starts with every flag false, and an
|
|
79
|
+
// upload sent before it settles can end in a 403.
|
|
80
|
+
const canUpload = !isLoading && canCreate;
|
|
64
81
|
const { data: settings$1 } = settings.useGetUploadSettingsQuery(undefined, {
|
|
65
82
|
skip: !canRead
|
|
66
83
|
});
|
|
@@ -82,20 +99,30 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
82
99
|
}
|
|
83
100
|
onChange(name, nextAssets[0] ?? null);
|
|
84
101
|
};
|
|
102
|
+
const handleRemove = (asset)=>{
|
|
103
|
+
setAssets(assets.filter((current)=>current.id !== asset.id));
|
|
104
|
+
};
|
|
105
|
+
// Bound to the form, not to this input: a component collapsed mid-upload
|
|
106
|
+
// unmounts the field, and the file must still land on the entry.
|
|
85
107
|
const attachUploadedFile = (file)=>{
|
|
86
|
-
const
|
|
87
|
-
|
|
108
|
+
const writes = unrenderedWrites.get(getValues) ?? new Map();
|
|
109
|
+
unrenderedWrites.set(getValues, writes);
|
|
110
|
+
const value = get__default.default(getValues(), name);
|
|
111
|
+
const pending = writes.get(name);
|
|
112
|
+
const current = pending && pending.seen === value ? pending.written : toAssets(value);
|
|
113
|
+
const next = multiple ? [
|
|
114
|
+
...current,
|
|
88
115
|
file
|
|
89
116
|
] : [
|
|
90
117
|
file
|
|
91
118
|
];
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
setAssets(assets.filter((current)=>current.id !== asset.id));
|
|
119
|
+
writes.set(name, {
|
|
120
|
+
seen: value,
|
|
121
|
+
written: next
|
|
122
|
+
});
|
|
123
|
+
setAssets(next);
|
|
98
124
|
};
|
|
125
|
+
const { uploads, cancel, retry, dismiss } = useFieldUploads.useFieldUploads(name);
|
|
99
126
|
const handleCopyLink = async (asset)=>{
|
|
100
127
|
const url = files.prefixFileUrlWithBackendUrl(asset.url);
|
|
101
128
|
if (!url) {
|
|
@@ -131,7 +158,6 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
131
158
|
const handleSelect = (selectedAssets)=>{
|
|
132
159
|
setAssets(selectedAssets);
|
|
133
160
|
setStep(undefined);
|
|
134
|
-
setFolderId(null);
|
|
135
161
|
};
|
|
136
162
|
const notifyUnsupported = ()=>{
|
|
137
163
|
toggleNotification({
|
|
@@ -165,8 +191,8 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
165
191
|
});
|
|
166
192
|
return true;
|
|
167
193
|
};
|
|
168
|
-
const handleUpload =
|
|
169
|
-
if (disabled || files.length === 0) {
|
|
194
|
+
const handleUpload = (files)=>{
|
|
195
|
+
if (disabled || !canUpload || files.length === 0) {
|
|
170
196
|
return;
|
|
171
197
|
}
|
|
172
198
|
// The device picker can't reach this — it carries `multiple` — so a drop is
|
|
@@ -197,6 +223,12 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
197
223
|
location: CONTENT_MANAGER_LOCATION,
|
|
198
224
|
...assetsCountByType
|
|
199
225
|
});
|
|
226
|
+
startUpload(allowedFiles);
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* Hands the files to the shared upload pool. The field picks the results up
|
|
230
|
+
* from `onFileUploaded`, which also runs for retries of the same rows.
|
|
231
|
+
*/ const startUpload = (allowedFiles)=>{
|
|
200
232
|
const formData = new FormData();
|
|
201
233
|
allowedFiles.forEach((file)=>formData.append('files', file));
|
|
202
234
|
formData.append('fileInfo', JSON.stringify(allowedFiles.map((file)=>({
|
|
@@ -205,30 +237,18 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
205
237
|
alternativeText: null,
|
|
206
238
|
folder: UPLOAD_FOLDER_ID
|
|
207
239
|
}))));
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
onFileUploaded: attachUploadedFile
|
|
217
|
-
}).unwrap();
|
|
218
|
-
} catch {
|
|
219
|
-
// Errors reach the user through the progress dialog, which the mutation
|
|
220
|
-
// populates itself.
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
const handleZoneClick = ()=>{
|
|
224
|
-
if (canRead) {
|
|
225
|
-
setStep('browse');
|
|
226
|
-
} else if (canCreate) {
|
|
227
|
-
fileInputRef.current?.click();
|
|
228
|
-
} else {
|
|
229
|
-
setStep('no-access');
|
|
230
|
-
}
|
|
240
|
+
uploadFiles({
|
|
241
|
+
formData,
|
|
242
|
+
totalFiles: allowedFiles.length,
|
|
243
|
+
concurrency,
|
|
244
|
+
generateAiMetadata: Boolean(isAiMetadataEnabled),
|
|
245
|
+
onFileUploaded: attachUploadedFile,
|
|
246
|
+
owner: name
|
|
247
|
+
});
|
|
231
248
|
};
|
|
249
|
+
const handleRetry = (upload)=>retry(upload, (file)=>startUpload([
|
|
250
|
+
file
|
|
251
|
+
]));
|
|
232
252
|
/**
|
|
233
253
|
* The server fetches each URL and uploads what it finds, so the file's type
|
|
234
254
|
* is not known here — `allowedTypes` can only be enforced on what comes back.
|
|
@@ -280,7 +300,7 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
280
300
|
// populates itself.
|
|
281
301
|
}
|
|
282
302
|
};
|
|
283
|
-
const handleFileInputChange =
|
|
303
|
+
const handleFileInputChange = (event)=>{
|
|
284
304
|
// Copied before the reset, not after: `event.target.files` is the input's
|
|
285
305
|
// live FileList, and clearing `value` empties it in place. Reading it
|
|
286
306
|
// afterwards yields nothing and the upload never starts.
|
|
@@ -288,8 +308,64 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
288
308
|
// Reset so picking the same file twice in a row still fires `change`.
|
|
289
309
|
event.target.value = '';
|
|
290
310
|
if (files.length > 0) {
|
|
291
|
-
|
|
311
|
+
handleUpload(files);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const renderValue = ()=>{
|
|
315
|
+
const dropZone = (variant)=>/*#__PURE__*/ jsxRuntime.jsx(AssetDropZone.AssetDropZone, {
|
|
316
|
+
variant: variant,
|
|
317
|
+
disabled: disabled || !canUpload,
|
|
318
|
+
onDropFiles: handleUpload
|
|
319
|
+
});
|
|
320
|
+
if (assets.length === 0 && uploads.length === 0) {
|
|
321
|
+
return dropZone('bar');
|
|
292
322
|
}
|
|
323
|
+
const uploadHandlers = {
|
|
324
|
+
disabled,
|
|
325
|
+
onCancel: cancel,
|
|
326
|
+
onRetry: handleRetry,
|
|
327
|
+
onRemove: (upload)=>dismiss(upload.key)
|
|
328
|
+
};
|
|
329
|
+
if (!multiple) {
|
|
330
|
+
// A replacement in flight, or one that failed, stands in for the current
|
|
331
|
+
// asset until it lands or is removed.
|
|
332
|
+
if (uploads.length > 0) {
|
|
333
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
334
|
+
direction: "column",
|
|
335
|
+
alignItems: "stretch",
|
|
336
|
+
gap: 2,
|
|
337
|
+
children: uploads.map((upload)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow.UploadRow, {
|
|
338
|
+
upload: upload,
|
|
339
|
+
...uploadHandlers
|
|
340
|
+
}, upload.key))
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return /*#__PURE__*/ jsxRuntime.jsx(AssetRow.AssetRow, {
|
|
344
|
+
asset: assets[0],
|
|
345
|
+
disabled: disabled,
|
|
346
|
+
onCopyLink: handleCopyLink,
|
|
347
|
+
// The details dialog needs the library's folder tree, which needs read access.
|
|
348
|
+
onEdit: canRead ? setEditedAsset : undefined,
|
|
349
|
+
onRemove: handleRemove
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(AssetCarousel.AssetCarousel, {
|
|
353
|
+
renderDropZone: dropZone,
|
|
354
|
+
layoutSize: layoutSize,
|
|
355
|
+
children: [
|
|
356
|
+
assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetCard.AssetCard, {
|
|
357
|
+
asset: asset,
|
|
358
|
+
disabled: disabled,
|
|
359
|
+
onCopyLink: handleCopyLink,
|
|
360
|
+
onEdit: canRead ? setEditedAsset : undefined,
|
|
361
|
+
onRemove: handleRemove
|
|
362
|
+
}, asset.id)),
|
|
363
|
+
uploads.map((upload)=>/*#__PURE__*/ jsxRuntime.jsx(AssetCard.UploadCard, {
|
|
364
|
+
upload: upload,
|
|
365
|
+
...uploadHandlers
|
|
366
|
+
}, upload.key))
|
|
367
|
+
]
|
|
368
|
+
});
|
|
293
369
|
};
|
|
294
370
|
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
|
|
295
371
|
name: name,
|
|
@@ -314,26 +390,7 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
314
390
|
})
|
|
315
391
|
]
|
|
316
392
|
}),
|
|
317
|
-
|
|
318
|
-
direction: "column",
|
|
319
|
-
alignItems: "stretch",
|
|
320
|
-
gap: 1,
|
|
321
|
-
children: [
|
|
322
|
-
assets.map((asset)=>/*#__PURE__*/ jsxRuntime.jsx(AssetRow.AssetRow, {
|
|
323
|
-
asset: asset,
|
|
324
|
-
disabled: disabled,
|
|
325
|
-
onCopyLink: handleCopyLink,
|
|
326
|
-
// The details dialog needs the library's folder tree, which needs read access.
|
|
327
|
-
onEdit: canRead ? setEditedAsset : undefined,
|
|
328
|
-
onRemove: handleRemove
|
|
329
|
-
}, asset.id)),
|
|
330
|
-
/*#__PURE__*/ jsxRuntime.jsx(AssetDropZone.AssetDropZone, {
|
|
331
|
-
disabled: disabled,
|
|
332
|
-
onClick: handleZoneClick,
|
|
333
|
-
onDropFiles: handleUpload
|
|
334
|
-
})
|
|
335
|
-
]
|
|
336
|
-
}),
|
|
393
|
+
renderValue(),
|
|
337
394
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Error, {}),
|
|
338
395
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Hint, {}),
|
|
339
396
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
|
|
@@ -346,26 +403,19 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
346
403
|
"aria-hidden": true
|
|
347
404
|
})
|
|
348
405
|
}),
|
|
349
|
-
step === 'browse' && /*#__PURE__*/ jsxRuntime.jsx(
|
|
406
|
+
step === 'browse' && /*#__PURE__*/ jsxRuntime.jsx(AssetPickerDialog.AssetPickerDialog, {
|
|
350
407
|
open: true,
|
|
408
|
+
title: formatMessage({
|
|
409
|
+
id: translations.getTranslationKey('asset-picker.title'),
|
|
410
|
+
defaultMessage: 'Add asset for {fieldName}'
|
|
411
|
+
}, {
|
|
412
|
+
fieldName: label ?? name
|
|
413
|
+
}),
|
|
414
|
+
initialSelection: assets,
|
|
351
415
|
multiple: multiple,
|
|
352
|
-
allowedTypes: allowedTypes
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
trackedLocation: CONTENT_MANAGER_LOCATION,
|
|
356
|
-
onClose: ()=>{
|
|
357
|
-
setStep(undefined);
|
|
358
|
-
setFolderId(null);
|
|
359
|
-
},
|
|
360
|
-
onValidate: handleSelect,
|
|
361
|
-
onAddFolder: ()=>setStep('create-folder'),
|
|
362
|
-
// The dialog's own upload button hands back to this field's upload
|
|
363
|
-
// path, so every route to an uploaded file opens the progress dialog.
|
|
364
|
-
onAddAsset: ()=>{
|
|
365
|
-
setStep(undefined);
|
|
366
|
-
fileInputRef.current?.click();
|
|
367
|
-
},
|
|
368
|
-
onChangeFolder: (nextFolderId)=>setFolderId(nextFolderId)
|
|
416
|
+
allowedTypes: allowedTypes,
|
|
417
|
+
onClose: ()=>setStep(undefined),
|
|
418
|
+
onConfirm: handleSelect
|
|
369
419
|
}),
|
|
370
420
|
editedAsset && /*#__PURE__*/ jsxRuntime.jsx(EditAssetContent.EditAssetDialog, {
|
|
371
421
|
open: true,
|
|
@@ -376,14 +426,6 @@ const EMPTY_ATTRIBUTE = {};
|
|
|
376
426
|
trackedLocation: CONTENT_MANAGER_LOCATION,
|
|
377
427
|
onClose: handleEditClose
|
|
378
428
|
}),
|
|
379
|
-
step === 'create-folder' && /*#__PURE__*/ jsxRuntime.jsx(EditFolderDialog.EditFolderDialog, {
|
|
380
|
-
open: true,
|
|
381
|
-
onClose: ()=>setStep('browse'),
|
|
382
|
-
parentFolderId: folderId
|
|
383
|
-
}),
|
|
384
|
-
step === 'no-access' && /*#__PURE__*/ jsxRuntime.jsx(NoLibraryAccessDialog.NoLibraryAccessDialog, {
|
|
385
|
-
onClose: ()=>setStep(undefined)
|
|
386
|
-
}),
|
|
387
429
|
/*#__PURE__*/ jsxRuntime.jsx(ImportFromUrlDialog.ImportFromUrlDialog, {
|
|
388
430
|
open: isUrlDialogOpen,
|
|
389
431
|
onClose: ()=>setIsUrlDialogOpen(false),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibraryInput.js","sources":["../../../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx"],"sourcesContent":["import { useRef, useState, type ChangeEvent, type ReactNode } from 'react';\n\nimport { useClipboard, useField, useNotification } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, VisuallyHidden } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../hooks/useTracking';\n// Temporary: the Content Manager's own asset picker is not built on this stack\n// yet, so browsing and editing the library still go through the legacy dialogs.\n// These imports go when that modal lands.\nimport { AssetDialog } from '../../legacy/components/AssetDialog/AssetDialog';\nimport {\n EditAssetDialog,\n type Asset as EditableAsset,\n} from '../../legacy/components/EditAssetDialog/EditAssetContent';\nimport { EditFolderDialog } from '../../legacy/components/EditFolderDialog/EditFolderDialog';\nimport { ImportFromUrlDialog } from '../../pages/Assets/components/ImportFromUrlDialog';\nimport { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport {\n filterAllowedFiles,\n isMediaTypeAllowed,\n type AllowedMediaType,\n} from '../../utils/allowedMediaTypes';\nimport { prefixFileUrlWithBackendUrl } from '../../utils/files';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { AddAssetMenu } from './AddAssetMenu';\nimport { AssetDropZone } from './AssetDropZone';\nimport { AssetRow } from './AssetRow';\nimport { NoLibraryAccessDialog } from './NoLibraryAccessDialog';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/**\n * `location` for every event this field fires. The standalone Media Library\n * tags its events `'upload'`; the picker inside an entry form has always been\n * `'content-manager'`, and analytics still splits the two on that axis.\n */\nconst CONTENT_MANAGER_LOCATION = 'content-manager';\n\n/**\n * Uploads from here land at the root of the Media Library. An entry form has no\n * current folder to inherit, and the field offers no destination picker — same\n * place the legacy upload wizard put them when none was chosen.\n */\nconst UPLOAD_FOLDER_ID = null;\n\ntype Step = 'browse' | 'create-folder' | 'no-access';\n\nexport interface MediaLibraryInputProps {\n name: string;\n label?: string;\n labelAction?: ReactNode;\n hint?: string;\n required?: boolean;\n disabled?: boolean;\n attribute?: {\n allowedTypes?: AllowedMediaType[] | null;\n multiple?: boolean;\n };\n}\n\nconst EMPTY_ATTRIBUTE: NonNullable<MediaLibraryInputProps['attribute']> = {};\n\n/**\n * The Content Manager's `media` field, on the current Media Library stack.\n *\n * Files dropped here (or picked from the device) upload straight through\n * `uploadFiles`, which is what drives the global upload progress dialog — so the\n * entry form stays usable while they go, instead of being covered by the legacy\n * wizard.\n *\n * The legacy input is still registered when `useLegacyMediaLibrary` is on, and\n * is untouched by this.\n */\nexport const MediaLibraryInput = ({\n name,\n label,\n labelAction,\n hint,\n required = false,\n disabled = false,\n attribute = EMPTY_ATTRIBUTE,\n}: MediaLibraryInputProps) => {\n const { allowedTypes = null, multiple = false } = attribute;\n const { formatMessage } = useIntl();\n const { onChange, value, error } = useField<File | File[] | null>(name);\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const [step, setStep] = useState<Step | undefined>(undefined);\n const [folderId, setFolderId] = useState<number | null>(null);\n const [editedAsset, setEditedAsset] = useState<File | null>(null);\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // Echoes the app config; a missing payload (still loading) falls back to\n // sequential rather than outpacing what the server asked for.\n const { canRead, canCreate, canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n const { data: settings } = useGetUploadSettingsQuery(undefined, { skip: !canRead });\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n const isAiMetadataEnabled = useAIMetadataEnabled();\n\n const assets: File[] = Array.isArray(value) ? value : value ? [value] : [];\n\n // An upload resumes long after the render that started it, and the dialog is\n // non-blocking precisely so a second batch can be dropped meanwhile. Reading\n // the closed-over `assets` on resume would then append to whatever the field\n // held when that drop began, dropping every asset that landed since.\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const setAssets = (nextAssets: File[]) => {\n if (multiple) {\n onChange(name, nextAssets.length > 0 ? nextAssets : null);\n return;\n }\n onChange(name, nextAssets[0] ?? null);\n };\n\n const attachUploadedFile = (file: File) => {\n const nextAssets = multiple ? [...assetsRef.current, file] : [file];\n // Parallel uploads can finish before the next render refreshes the ref.\n assetsRef.current = nextAssets;\n setAssets(nextAssets);\n };\n\n const handleRemove = (asset: File) => {\n setAssets(assets.filter((current) => current.id !== asset.id));\n };\n\n const handleCopyLink = async (asset: File) => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n\n if (!url) {\n return;\n }\n\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('asset-details.copy-link.success'),\n defaultMessage: 'Link copied.',\n }\n : {\n id: getTranslationKey('asset-details.copy-link.error'),\n defaultMessage: 'Failed to copy the link.',\n }\n ),\n });\n };\n\n const handleEditClose = (result?: EditableAsset | null | boolean) => {\n const asset = editedAsset;\n setEditedAsset(null);\n\n if (!asset) {\n return;\n }\n\n // `null` means the asset was deleted from the library from inside the dialog.\n if (result === null) {\n setAssets(assetsRef.current.filter((current) => current.id !== asset.id));\n return;\n }\n\n if (result && typeof result !== 'boolean') {\n setAssets(\n assetsRef.current.map((current) => (current.id === asset.id ? (result as File) : current))\n );\n }\n };\n\n const handleSelect = (selectedAssets: File[]) => {\n setAssets(selectedAssets);\n setStep(undefined);\n setFolderId(null);\n };\n\n const notifyUnsupported = () => {\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage(\n {\n // Legacy key: translated everywhere, and it names the accepted types,\n // which the field already passes as `fileTypes`.\n id: getTranslationKey('input.notification.not-supported'),\n defaultMessage: `You can't upload this type of file, only the following types are accepted – {fileTypes}`,\n },\n { fileTypes: (allowedTypes ?? []).join(',') }\n ),\n });\n };\n\n /**\n * True when the batch is more than a single-value field can take. Counted on\n * what was handed in rather than on what survives filtering: uploading one of\n * several would leave the user guessing which one the field kept.\n */\n const rejectsBatch = (count: number) => {\n if (multiple || count <= 1) {\n return false;\n }\n\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage({\n id: getTranslationKey('content-manager.input.notification.single-file'),\n defaultMessage: 'This field accepts only one file.',\n }),\n });\n\n return true;\n };\n\n const handleUpload = async (files: globalThis.File[]) => {\n if (disabled || files.length === 0) {\n return;\n }\n\n // The device picker can't reach this — it carries `multiple` — so a drop is\n // the only way in.\n if (rejectsBatch(files.length)) {\n return;\n }\n\n const allowedFiles = filterAllowedFiles(allowedTypes, files);\n\n if (allowedFiles.length === 0) {\n notifyUnsupported();\n return;\n }\n\n // A mixed drop uploads what it can and says so, rather than silently\n // dropping the rest.\n if (allowedFiles.length < files.length) {\n notifyUnsupported();\n }\n\n const assetsCountByType = allowedFiles.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('didSelectFile', { source: 'computer', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', {\n location: CONTENT_MANAGER_LOCATION,\n ...assetsCountByType,\n });\n\n const formData = new FormData();\n allowedFiles.forEach((file) => formData.append('files', file));\n formData.append(\n 'fileInfo',\n JSON.stringify(\n allowedFiles.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: UPLOAD_FOLDER_ID,\n }))\n )\n );\n\n try {\n // Attached per file rather than from the result: a Retry in the progress\n // dialog uploads cancelled files after this call has already resolved.\n await uploadFiles({\n formData,\n totalFiles: allowedFiles.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n onFileUploaded: attachUploadedFile,\n }).unwrap();\n } catch {\n // Errors reach the user through the progress dialog, which the mutation\n // populates itself.\n }\n };\n\n const handleZoneClick = () => {\n if (canRead) {\n setStep('browse');\n } else if (canCreate) {\n fileInputRef.current?.click();\n } else {\n setStep('no-access');\n }\n };\n\n /**\n * The server fetches each URL and uploads what it finds, so the file's type\n * is not known here — `allowedTypes` can only be enforced on what comes back.\n * A URL whose file the field does not accept is uploaded to the library and\n * left off the field, which is also what the Media Library page does with it.\n */\n const handleUrlUpload = async (urls: string[]) => {\n if (disabled || urls.length === 0 || rejectsBatch(urls.length)) {\n return;\n }\n\n trackUsage('didSelectFile', { source: 'url', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', { location: CONTENT_MANAGER_LOCATION });\n\n try {\n const { data: uploadedFiles } = await uploadFromUrls({\n urls,\n folderId: UPLOAD_FOLDER_ID,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n\n const allowedFiles = uploadedFiles.filter((file) =>\n isMediaTypeAllowed(allowedTypes, file.mime)\n );\n const notAttachedFiles = uploadedFiles.filter((file) => !allowedFiles.includes(file));\n\n if (notAttachedFiles.length > 0) {\n toggleNotification({\n type: 'warning',\n timeout: 4000,\n message: formatMessage(\n {\n id: getTranslationKey('content-manager.input.notification.not-attached'),\n defaultMessage:\n '{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.',\n },\n {\n fileNames: notAttachedFiles.map((file) => file.name).join(', '),\n count: notAttachedFiles.length,\n fileTypes: (allowedTypes ?? []).join(', '),\n }\n ),\n });\n }\n\n if (allowedFiles.length > 0) {\n setAssets(multiple ? [...assetsRef.current, ...allowedFiles] : [allowedFiles[0]]);\n }\n } catch {\n // Errors reach the user through the progress dialog, which the mutation\n // populates itself.\n }\n };\n\n const handleFileInputChange = async (event: ChangeEvent<HTMLInputElement>) => {\n // Copied before the reset, not after: `event.target.files` is the input's\n // live FileList, and clearing `value` empties it in place. Reading it\n // afterwards yields nothing and the upload never starts.\n const files = Array.from(event.target.files ?? []);\n // Reset so picking the same file twice in a row still fires `change`.\n event.target.value = '';\n\n if (files.length > 0) {\n await handleUpload(files);\n }\n };\n\n return (\n <Field.Root name={name} error={error} hint={hint} required={required}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <AddAssetMenu\n disabled={disabled}\n onBrowseLibrary={() => setStep('browse')}\n onUploadFromDevice={() => fileInputRef.current?.click()}\n onUploadFromUrl={() => setIsUrlDialogOpen(true)}\n />\n </Flex>\n\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n {assets.map((asset) => (\n <AssetRow\n key={asset.id}\n asset={asset}\n disabled={disabled}\n onCopyLink={handleCopyLink}\n // The details dialog needs the library's folder tree, which needs read access.\n onEdit={canRead ? setEditedAsset : undefined}\n onRemove={handleRemove}\n />\n ))}\n\n <AssetDropZone disabled={disabled} onClick={handleZoneClick} onDropFiles={handleUpload} />\n </Flex>\n\n <Field.Error />\n <Field.Hint />\n\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n onChange={handleFileInputChange}\n tabIndex={-1}\n aria-hidden\n />\n </VisuallyHidden>\n\n {step === 'browse' && (\n <AssetDialog\n open\n multiple={multiple}\n allowedTypes={allowedTypes ?? []}\n initiallySelectedAssets={assets}\n folderId={folderId}\n trackedLocation={CONTENT_MANAGER_LOCATION}\n onClose={() => {\n setStep(undefined);\n setFolderId(null);\n }}\n onValidate={handleSelect}\n onAddFolder={() => setStep('create-folder')}\n // The dialog's own upload button hands back to this field's upload\n // path, so every route to an uploaded file opens the progress dialog.\n onAddAsset={() => {\n setStep(undefined);\n fileInputRef.current?.click();\n }}\n onChangeFolder={(nextFolderId) => setFolderId(nextFolderId)}\n />\n )}\n\n {editedAsset && (\n <EditAssetDialog\n open\n asset={editedAsset as EditableAsset}\n canUpdate={canUpdate && !disabled}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation={CONTENT_MANAGER_LOCATION}\n onClose={handleEditClose}\n />\n )}\n\n {step === 'create-folder' && (\n <EditFolderDialog open onClose={() => setStep('browse')} parentFolderId={folderId} />\n )}\n\n {step === 'no-access' && <NoLibraryAccessDialog onClose={() => setStep(undefined)} />}\n\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n </Field.Root>\n );\n};\n"],"names":["CONTENT_MANAGER_LOCATION","UPLOAD_FOLDER_ID","EMPTY_ATTRIBUTE","MediaLibraryInput","name","label","labelAction","hint","required","disabled","attribute","allowedTypes","multiple","formatMessage","useIntl","onChange","value","error","useField","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","step","setStep","useState","undefined","folderId","setFolderId","editedAsset","setEditedAsset","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","canRead","canCreate","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","data","settings","useGetUploadSettingsQuery","skip","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","assets","Array","isArray","assetsRef","current","setAssets","nextAssets","length","attachUploadedFile","file","handleRemove","asset","filter","id","handleCopyLink","url","prefixFileUrlWithBackendUrl","didCopy","type","message","getTranslationKey","defaultMessage","handleEditClose","result","map","handleSelect","selectedAssets","notifyUnsupported","timeout","fileTypes","join","rejectsBatch","count","handleUpload","files","allowedFiles","filterAllowedFiles","assetsCountByType","reduce","acc","typeFromMime","source","location","formData","FormData","forEach","append","JSON","stringify","caption","alternativeText","folder","totalFiles","generateAiMetadata","Boolean","onFileUploaded","unwrap","handleZoneClick","click","handleUrlUpload","urls","uploadedFiles","isMediaTypeAllowed","mime","notAttachedFiles","includes","fileNames","handleFileInputChange","event","from","target","_jsxs","Field","Root","Flex","justifyContent","alignItems","gap","_jsx","Label","action","AddAssetMenu","onBrowseLibrary","onUploadFromDevice","onUploadFromUrl","direction","AssetRow","onCopyLink","onEdit","onRemove","AssetDropZone","onClick","onDropFiles","Error","Hint","VisuallyHidden","input","ref","tabIndex","aria-hidden","AssetDialog","open","initiallySelectedAssets","trackedLocation","onClose","onValidate","onAddFolder","onAddAsset","onChangeFolder","nextFolderId","EditAssetDialog","EditFolderDialog","parentFolderId","NoLibraryAccessDialog","ImportFromUrlDialog","onUpload"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MediaLibraryInput.js","sources":["../../../../admin/src/components/MediaLibraryInput/MediaLibraryInput.tsx"],"sourcesContent":["import { useRef, useState, type ChangeEvent, type ReactNode } from 'react';\n\nimport { useClipboard, useField, useForm, useNotification } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, VisuallyHidden } from '@strapi/design-system';\nimport get from 'lodash/get';\nimport { useIntl } from 'react-intl';\n\nimport { useAIMetadataEnabled } from '../../hooks/useAIMetadataEnabled';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useTracking } from '../../hooks/useTracking';\nimport {\n EditAssetDialog,\n type Asset as EditableAsset,\n} from '../../legacy/components/EditAssetDialog/EditAssetContent';\nimport { ImportFromUrlDialog } from '../../pages/Assets/components/ImportFromUrlDialog';\nimport { useUploadFilesMutation, useUploadFromUrlsMutation } from '../../services/api';\nimport { useGetUploadSettingsQuery } from '../../services/settings';\nimport {\n filterAllowedFiles,\n isMediaTypeAllowed,\n type AllowedMediaType,\n} from '../../utils/allowedMediaTypes';\nimport { prefixFileUrlWithBackendUrl } from '../../utils/files';\nimport { getTranslationKey } from '../../utils/translations';\nimport { typeFromMime } from '../../utils/typeFromMime';\nimport { AssetPickerDialog } from '../AssetPickerDialog/AssetPickerDialog';\n\nimport { AddAssetMenu } from './AddAssetMenu';\nimport { AssetCard, UploadCard } from './AssetCard';\nimport { AssetCarousel } from './AssetCarousel';\nimport { AssetDropZone, type ZoneVariant } from './AssetDropZone';\nimport { AssetRow, UploadRow } from './AssetRow';\nimport { useFieldUploads, type FieldUpload } from './useFieldUploads';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/**\n * What a field wrote that its form has not rendered yet, per form and field.\n * `getValues()` only catches up on render, and two uploads can complete before\n * the next one. Kept outside the input so it survives a remount.\n */\nconst unrenderedWrites = new WeakMap<object, Map<string, { seen: unknown; written: File[] }>>();\n\nconst toAssets = (value: unknown): File[] =>\n Array.isArray(value) ? value : value ? [value as File] : [];\n\n/**\n * `location` for every event this field fires. The standalone Media Library\n * tags its events `'upload'`; the picker inside an entry form has always been\n * `'content-manager'`, and analytics still splits the two on that axis.\n */\nconst CONTENT_MANAGER_LOCATION = 'content-manager';\n\n/**\n * Uploads from here land at the root of the Media Library. An entry form has no\n * current folder to inherit, and the field offers no destination picker — same\n * place the legacy upload wizard put them when none was chosen.\n */\nconst UPLOAD_FOLDER_ID = null;\n\ntype Step = 'browse';\n\nexport interface MediaLibraryInputProps {\n name: string;\n label?: string;\n labelAction?: ReactNode;\n hint?: string;\n required?: boolean;\n disabled?: boolean;\n attribute?: {\n allowedTypes?: AllowedMediaType[] | null;\n multiple?: boolean;\n };\n /** The field's width in the edit layout, out of 12. Set by the Content Manager. */\n layoutSize?: number;\n}\n\nconst EMPTY_ATTRIBUTE: NonNullable<MediaLibraryInputProps['attribute']> = {};\n\n/**\n * The Content Manager's `media` field, on the current Media Library stack.\n *\n * Files dropped here (or picked from the device) upload straight through\n * `uploadFiles`, which is what drives the global upload progress dialog — so the\n * entry form stays usable while they go, instead of being covered by the legacy\n * wizard.\n *\n * The legacy input is still registered when `useLegacyMediaLibrary` is on, and\n * is untouched by this.\n */\nexport const MediaLibraryInput = ({\n name,\n label,\n labelAction,\n hint,\n required = false,\n disabled = false,\n attribute = EMPTY_ATTRIBUTE,\n layoutSize,\n}: MediaLibraryInputProps) => {\n const { allowedTypes = null, multiple = false } = attribute;\n const { formatMessage } = useIntl();\n const { onChange, value, error } = useField<File | File[] | null>(name);\n const { toggleNotification } = useNotification();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n const getValues = useForm('MediaLibraryInput', (state) => state.getValues);\n\n const [step, setStep] = useState<Step | undefined>(undefined);\n const [editedAsset, setEditedAsset] = useState<File | null>(null);\n const [isUrlDialogOpen, setIsUrlDialogOpen] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const [uploadFiles] = useUploadFilesMutation();\n const [uploadFromUrls] = useUploadFromUrlsMutation();\n // Echoes the app config; a missing payload (still loading) falls back to\n // sequential rather than outpacing what the server asked for.\n const { isLoading, canRead, canCreate, canUpdate, canCopyLink, canDownload } =\n useMediaLibraryPermissions();\n // Not while permissions load: `useRBAC` starts with every flag false, and an\n // upload sent before it settles can end in a 403.\n const canUpload = !isLoading && canCreate;\n const { data: settings } = useGetUploadSettingsQuery(undefined, { skip: !canRead });\n const concurrency = settings?.data?.concurrentUploadRequests ?? 1;\n const isAiMetadataEnabled = useAIMetadataEnabled();\n\n const assets: File[] = Array.isArray(value) ? value : value ? [value] : [];\n\n // An upload resumes long after the render that started it, and the dialog is\n // non-blocking precisely so a second batch can be dropped meanwhile. Reading\n // the closed-over `assets` on resume would then append to whatever the field\n // held when that drop began, dropping every asset that landed since.\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const setAssets = (nextAssets: File[]) => {\n if (multiple) {\n onChange(name, nextAssets.length > 0 ? nextAssets : null);\n return;\n }\n onChange(name, nextAssets[0] ?? null);\n };\n\n const handleRemove = (asset: File) => {\n setAssets(assets.filter((current) => current.id !== asset.id));\n };\n\n // Bound to the form, not to this input: a component collapsed mid-upload\n // unmounts the field, and the file must still land on the entry.\n const attachUploadedFile = (file: File) => {\n const writes = unrenderedWrites.get(getValues) ?? new Map();\n unrenderedWrites.set(getValues, writes);\n\n const value = get(getValues(), name);\n const pending = writes.get(name);\n const current = pending && pending.seen === value ? pending.written : toAssets(value);\n const next = multiple ? [...current, file] : [file];\n\n writes.set(name, { seen: value, written: next });\n setAssets(next);\n };\n\n const { uploads, cancel, retry, dismiss } = useFieldUploads(name);\n\n const handleCopyLink = async (asset: File) => {\n const url = prefixFileUrlWithBackendUrl(asset.url);\n\n if (!url) {\n return;\n }\n\n const didCopy = await copy(url);\n\n toggleNotification({\n type: didCopy ? 'success' : 'danger',\n message: formatMessage(\n didCopy\n ? {\n id: getTranslationKey('asset-details.copy-link.success'),\n defaultMessage: 'Link copied.',\n }\n : {\n id: getTranslationKey('asset-details.copy-link.error'),\n defaultMessage: 'Failed to copy the link.',\n }\n ),\n });\n };\n\n const handleEditClose = (result?: EditableAsset | null | boolean) => {\n const asset = editedAsset;\n setEditedAsset(null);\n\n if (!asset) {\n return;\n }\n\n // `null` means the asset was deleted from the library from inside the dialog.\n if (result === null) {\n setAssets(assetsRef.current.filter((current) => current.id !== asset.id));\n return;\n }\n\n if (result && typeof result !== 'boolean') {\n setAssets(\n assetsRef.current.map((current) => (current.id === asset.id ? (result as File) : current))\n );\n }\n };\n\n const handleSelect = (selectedAssets: File[]) => {\n setAssets(selectedAssets);\n setStep(undefined);\n };\n\n const notifyUnsupported = () => {\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage(\n {\n // Legacy key: translated everywhere, and it names the accepted types,\n // which the field already passes as `fileTypes`.\n id: getTranslationKey('input.notification.not-supported'),\n defaultMessage: `You can't upload this type of file, only the following types are accepted – {fileTypes}`,\n },\n { fileTypes: (allowedTypes ?? []).join(',') }\n ),\n });\n };\n\n /**\n * True when the batch is more than a single-value field can take. Counted on\n * what was handed in rather than on what survives filtering: uploading one of\n * several would leave the user guessing which one the field kept.\n */\n const rejectsBatch = (count: number) => {\n if (multiple || count <= 1) {\n return false;\n }\n\n toggleNotification({\n type: 'danger',\n timeout: 4000,\n message: formatMessage({\n id: getTranslationKey('content-manager.input.notification.single-file'),\n defaultMessage: 'This field accepts only one file.',\n }),\n });\n\n return true;\n };\n\n const handleUpload = (files: globalThis.File[]) => {\n if (disabled || !canUpload || files.length === 0) {\n return;\n }\n\n // The device picker can't reach this — it carries `multiple` — so a drop is\n // the only way in.\n if (rejectsBatch(files.length)) {\n return;\n }\n\n const allowedFiles = filterAllowedFiles(allowedTypes, files);\n\n if (allowedFiles.length === 0) {\n notifyUnsupported();\n return;\n }\n\n // A mixed drop uploads what it can and says so, rather than silently\n // dropping the rest.\n if (allowedFiles.length < files.length) {\n notifyUnsupported();\n }\n\n const assetsCountByType = allowedFiles.reduce<Record<string, number>>((acc, file) => {\n const type = typeFromMime(file.type);\n acc[type] = (acc[type] ?? 0) + 1;\n return acc;\n }, {});\n trackUsage('didSelectFile', { source: 'computer', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', {\n location: CONTENT_MANAGER_LOCATION,\n ...assetsCountByType,\n });\n\n startUpload(allowedFiles);\n };\n\n /**\n * Hands the files to the shared upload pool. The field picks the results up\n * from `onFileUploaded`, which also runs for retries of the same rows.\n */\n const startUpload = (allowedFiles: globalThis.File[]) => {\n const formData = new FormData();\n allowedFiles.forEach((file) => formData.append('files', file));\n formData.append(\n 'fileInfo',\n JSON.stringify(\n allowedFiles.map((file) => ({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: UPLOAD_FOLDER_ID,\n }))\n )\n );\n\n uploadFiles({\n formData,\n totalFiles: allowedFiles.length,\n concurrency,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n onFileUploaded: attachUploadedFile,\n owner: name,\n });\n };\n\n const handleRetry = (upload: FieldUpload) => retry(upload, (file) => startUpload([file]));\n\n /**\n * The server fetches each URL and uploads what it finds, so the file's type\n * is not known here — `allowedTypes` can only be enforced on what comes back.\n * A URL whose file the field does not accept is uploaded to the library and\n * left off the field, which is also what the Media Library page does with it.\n */\n const handleUrlUpload = async (urls: string[]) => {\n if (disabled || urls.length === 0 || rejectsBatch(urls.length)) {\n return;\n }\n\n trackUsage('didSelectFile', { source: 'url', location: CONTENT_MANAGER_LOCATION });\n trackUsage('willAddMediaLibraryAssets', { location: CONTENT_MANAGER_LOCATION });\n\n try {\n const { data: uploadedFiles } = await uploadFromUrls({\n urls,\n folderId: UPLOAD_FOLDER_ID,\n generateAiMetadata: Boolean(isAiMetadataEnabled),\n }).unwrap();\n\n const allowedFiles = uploadedFiles.filter((file) =>\n isMediaTypeAllowed(allowedTypes, file.mime)\n );\n const notAttachedFiles = uploadedFiles.filter((file) => !allowedFiles.includes(file));\n\n if (notAttachedFiles.length > 0) {\n toggleNotification({\n type: 'warning',\n timeout: 4000,\n message: formatMessage(\n {\n id: getTranslationKey('content-manager.input.notification.not-attached'),\n defaultMessage:\n '{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.',\n },\n {\n fileNames: notAttachedFiles.map((file) => file.name).join(', '),\n count: notAttachedFiles.length,\n fileTypes: (allowedTypes ?? []).join(', '),\n }\n ),\n });\n }\n\n if (allowedFiles.length > 0) {\n setAssets(multiple ? [...assetsRef.current, ...allowedFiles] : [allowedFiles[0]]);\n }\n } catch {\n // Errors reach the user through the progress dialog, which the mutation\n // populates itself.\n }\n };\n\n const handleFileInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n // Copied before the reset, not after: `event.target.files` is the input's\n // live FileList, and clearing `value` empties it in place. Reading it\n // afterwards yields nothing and the upload never starts.\n const files = Array.from(event.target.files ?? []);\n // Reset so picking the same file twice in a row still fires `change`.\n event.target.value = '';\n\n if (files.length > 0) {\n handleUpload(files);\n }\n };\n\n const renderValue = () => {\n const dropZone = (variant: ZoneVariant) => (\n <AssetDropZone\n variant={variant}\n disabled={disabled || !canUpload}\n onDropFiles={handleUpload}\n />\n );\n\n if (assets.length === 0 && uploads.length === 0) {\n return dropZone('bar');\n }\n\n const uploadHandlers = {\n disabled,\n onCancel: cancel,\n onRetry: handleRetry,\n onRemove: (upload: FieldUpload) => dismiss(upload.key),\n };\n\n if (!multiple) {\n // A replacement in flight, or one that failed, stands in for the current\n // asset until it lands or is removed.\n if (uploads.length > 0) {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {uploads.map((upload) => (\n <UploadRow key={upload.key} upload={upload} {...uploadHandlers} />\n ))}\n </Flex>\n );\n }\n\n return (\n <AssetRow\n asset={assets[0]}\n disabled={disabled}\n onCopyLink={handleCopyLink}\n // The details dialog needs the library's folder tree, which needs read access.\n onEdit={canRead ? setEditedAsset : undefined}\n onRemove={handleRemove}\n />\n );\n }\n\n return (\n <AssetCarousel renderDropZone={dropZone} layoutSize={layoutSize}>\n {assets.map((asset) => (\n <AssetCard\n key={asset.id}\n asset={asset}\n disabled={disabled}\n onCopyLink={handleCopyLink}\n onEdit={canRead ? setEditedAsset : undefined}\n onRemove={handleRemove}\n />\n ))}\n {uploads.map((upload) => (\n <UploadCard key={upload.key} upload={upload} {...uploadHandlers} />\n ))}\n </AssetCarousel>\n );\n };\n\n return (\n <Field.Root name={name} error={error} hint={hint} required={required}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <AddAssetMenu\n disabled={disabled}\n onBrowseLibrary={() => setStep('browse')}\n onUploadFromDevice={() => fileInputRef.current?.click()}\n onUploadFromUrl={() => setIsUrlDialogOpen(true)}\n />\n </Flex>\n\n {renderValue()}\n\n <Field.Error />\n <Field.Hint />\n\n <VisuallyHidden>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n onChange={handleFileInputChange}\n tabIndex={-1}\n aria-hidden\n />\n </VisuallyHidden>\n\n {step === 'browse' && (\n <AssetPickerDialog\n open\n title={formatMessage(\n {\n id: getTranslationKey('asset-picker.title'),\n defaultMessage: 'Add asset for {fieldName}',\n },\n { fieldName: label ?? name }\n )}\n initialSelection={assets}\n multiple={multiple}\n allowedTypes={allowedTypes}\n onClose={() => setStep(undefined)}\n onConfirm={handleSelect}\n />\n )}\n\n {editedAsset && (\n <EditAssetDialog\n open\n asset={editedAsset as EditableAsset}\n canUpdate={canUpdate && !disabled}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n trackedLocation={CONTENT_MANAGER_LOCATION}\n onClose={handleEditClose}\n />\n )}\n\n <ImportFromUrlDialog\n open={isUrlDialogOpen}\n onClose={() => setIsUrlDialogOpen(false)}\n onUpload={handleUrlUpload}\n />\n </Field.Root>\n );\n};\n"],"names":["unrenderedWrites","WeakMap","toAssets","value","Array","isArray","CONTENT_MANAGER_LOCATION","UPLOAD_FOLDER_ID","EMPTY_ATTRIBUTE","MediaLibraryInput","name","label","labelAction","hint","required","disabled","attribute","layoutSize","allowedTypes","multiple","formatMessage","useIntl","onChange","error","useField","toggleNotification","useNotification","trackUsage","useTracking","copy","useClipboard","getValues","useForm","state","step","setStep","useState","undefined","editedAsset","setEditedAsset","isUrlDialogOpen","setIsUrlDialogOpen","fileInputRef","useRef","uploadFiles","useUploadFilesMutation","uploadFromUrls","useUploadFromUrlsMutation","isLoading","canRead","canCreate","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","canUpload","data","settings","useGetUploadSettingsQuery","skip","concurrency","concurrentUploadRequests","isAiMetadataEnabled","useAIMetadataEnabled","assets","assetsRef","current","setAssets","nextAssets","length","handleRemove","asset","filter","id","attachUploadedFile","file","writes","get","Map","set","pending","seen","written","next","uploads","cancel","retry","dismiss","useFieldUploads","handleCopyLink","url","prefixFileUrlWithBackendUrl","didCopy","type","message","getTranslationKey","defaultMessage","handleEditClose","result","map","handleSelect","selectedAssets","notifyUnsupported","timeout","fileTypes","join","rejectsBatch","count","handleUpload","files","allowedFiles","filterAllowedFiles","assetsCountByType","reduce","acc","typeFromMime","source","location","startUpload","formData","FormData","forEach","append","JSON","stringify","caption","alternativeText","folder","totalFiles","generateAiMetadata","Boolean","onFileUploaded","owner","handleRetry","upload","handleUrlUpload","urls","uploadedFiles","folderId","unwrap","isMediaTypeAllowed","mime","notAttachedFiles","includes","fileNames","handleFileInputChange","event","from","target","renderValue","dropZone","variant","_jsx","AssetDropZone","onDropFiles","uploadHandlers","onCancel","onRetry","onRemove","key","Flex","direction","alignItems","gap","UploadRow","AssetRow","onCopyLink","onEdit","_jsxs","AssetCarousel","renderDropZone","AssetCard","UploadCard","Field","Root","justifyContent","Label","action","AddAssetMenu","onBrowseLibrary","onUploadFromDevice","click","onUploadFromUrl","Error","Hint","VisuallyHidden","input","ref","tabIndex","aria-hidden","AssetPickerDialog","open","title","fieldName","initialSelection","onClose","onConfirm","EditAssetDialog","trackedLocation","ImportFromUrlDialog","onUpload"],"mappings":"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"}
|