@strapi/upload 5.42.0 → 5.42.1

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.
@@ -142,7 +142,7 @@ const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles,
142
142
  defaultMessage: error.message
143
143
  } : {
144
144
  id: getTrad.getTrad('upload.generic-error'),
145
- defaultMessage: 'An error occured while uploading the file.'
145
+ defaultMessage: 'An error occurred while uploading the file.'
146
146
  })
147
147
  }) : undefined
148
148
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"UploadingAssetCard.js","sources":["../../../../admin/src/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occured while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","AssetType","Image","Video","Audio","React","useEffect","uploadFile","files","Number","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
1
+ {"version":3,"file":"UploadingAssetCard.js","sources":["../../../../admin/src/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occurred while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","AssetType","Image","Video","Audio","React","useEffect","uploadFile","files","Number","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
@@ -121,7 +121,7 @@ const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles,
121
121
  defaultMessage: error.message
122
122
  } : {
123
123
  id: getTrad('upload.generic-error'),
124
- defaultMessage: 'An error occured while uploading the file.'
124
+ defaultMessage: 'An error occurred while uploading the file.'
125
125
  })
126
126
  }) : undefined
127
127
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"UploadingAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occured while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","AssetType","Image","Video","Audio","React","useEffect","uploadFile","files","Number","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
1
+ {"version":3,"file":"UploadingAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType } from '../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === AssetType.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === AssetType.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === AssetType.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n const files = await upload(asset, folderId ? Number(folderId) : null);\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occurred while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","AssetType","Image","Video","Audio","React","useEffect","uploadFile","files","Number","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
@@ -12,6 +12,7 @@ var useCropImg = require('../../../hooks/useCropImg.js');
12
12
  var useEditAsset = require('../../../hooks/useEditAsset.js');
13
13
  var useTracking = require('../../../hooks/useTracking.js');
14
14
  var useUpload = require('../../../hooks/useUpload.js');
15
+ var appendSearchParamsToUrl = require('../../../utils/appendSearchParamsToUrl.js');
15
16
  var createAssetUrl = require('../../../utils/createAssetUrl.js');
16
17
  var downloadFile = require('../../../utils/downloadFile.js');
17
18
  require('byte-size');
@@ -56,6 +57,26 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
56
57
  const [hasCropIntent, setHasCropIntent] = React__namespace.useState(null);
57
58
  const [assetUrl, setAssetUrl] = React__namespace.useState(createAssetUrl.createAssetUrl(asset, false));
58
59
  const [thumbnailUrl, setThumbnailUrl] = React__namespace.useState(createAssetUrl.createAssetUrl(asset, true));
60
+ // When loading a cross-origin image for cropping, append a cache-busting parameter
61
+ // so the browser makes a fresh request with CORS headers instead of serving a
62
+ // previously cached non-CORS response (which would taint the canvas and break
63
+ // cropping). Signed URLs are excluded because modifying them invalidates the signature.
64
+ const cropUrl = React__namespace.useMemo(()=>{
65
+ if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {
66
+ return appendSearchParamsToUrl.appendSearchParamsToUrl({
67
+ url: assetUrl,
68
+ params: {
69
+ updatedAt: asset.updatedAt
70
+ }
71
+ });
72
+ }
73
+ return assetUrl;
74
+ }, [
75
+ assetUrl,
76
+ asset.isLocal,
77
+ asset.isUrlSigned,
78
+ asset.updatedAt
79
+ ]);
59
80
  const { formatMessage } = reactIntl.useIntl();
60
81
  const [showConfirmDialog, setShowConfirmDialog] = React__namespace.useState(false);
61
82
  const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } = useCropImg.useCropImg();
@@ -280,7 +301,7 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
280
301
  ref: previewRef,
281
302
  mime: asset.mime,
282
303
  name: asset.name,
283
- url: hasCropIntent ? assetUrl : thumbnailUrl,
304
+ url: hasCropIntent ? cropUrl : thumbnailUrl,
284
305
  onLoad: ()=>{
285
306
  if (asset.isLocal || hasCropIntent) {
286
307
  setIsCropImageReady(true);
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewBox.js","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = (await produceFile(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? assetUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","isLocal","url","current","handleCropping","nextAsset","folder","id","file","name","mime","updatedAt","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":"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"}
1
+ {"version":3,"file":"PreviewBox.js","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { appendSearchParamsToUrl, createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n\n // When loading a cross-origin image for cropping, append a cache-busting parameter\n // so the browser makes a fresh request with CORS headers instead of serving a\n // previously cached non-CORS response (which would taint the canvas and break\n // cropping). Signed URLs are excluded because modifying them invalidates the signature.\n const cropUrl = React.useMemo(() => {\n if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {\n return appendSearchParamsToUrl({ url: assetUrl, params: { updatedAt: asset.updatedAt } });\n }\n\n return assetUrl;\n }, [assetUrl, asset.isLocal, asset.isUrlSigned, asset.updatedAt]);\n\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = (await produceFile(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? cropUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","cropUrl","useMemo","isLocal","isUrlSigned","appendSearchParamsToUrl","url","params","updatedAt","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","current","handleCropping","nextAsset","folder","id","file","name","mime","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AA8DO,MAAMA,UAAAA,GAAa,CAAC,EACzBC,KAAK,EACLC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACRC,YAAY,EACZC,WAAW,EACXC,YAAY,EACZC,eAAe,EACfC,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjBC,kBAAkB,EAClBC,kBAAkB,EACF,GAAA;AAChB,IAAA,MAAMC,cAAAA,GAAiBC,kCAAiB,CAAC,EAAEC,aAAa,CAAC;IACzD,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;IACvB,MAAMC,UAAAA,GAAaC,gBAAAA,CAAMC,MAAM,CAAC,IAAA,CAAA;AAChC,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGH,gBAAAA,CAAMI,QAAQ,CAAC,KAAA,CAAA;AAC/D,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAAA,CAAiB,GAAGN,gBAAAA,CAAMI,QAAQ,CAAiB,IAAA,CAAA;IACzE,MAAM,CAACG,UAAUC,WAAAA,CAAY,GAAGR,iBAAMI,QAAQ,CAACK,8BAAe7B,KAAAA,EAAO,KAAA,CAAA,CAAA;IACrE,MAAM,CAAC8B,cAAcC,eAAAA,CAAgB,GAAGX,iBAAMI,QAAQ,CAACK,8BAAe7B,KAAAA,EAAO,IAAA,CAAA,CAAA;;;;;IAM7E,MAAMgC,OAAAA,GAAUZ,gBAAAA,CAAMa,OAAO,CAAC,IAAA;QAC5B,IAAI,CAACjC,MAAMkC,OAAO,IAAI,CAAClC,KAAAA,CAAMmC,WAAW,IAAIR,QAAAA,EAAU;AACpD,YAAA,OAAOS,+CAAAA,CAAwB;gBAAEC,GAAAA,EAAKV,QAAAA;gBAAUW,MAAAA,EAAQ;AAAEC,oBAAAA,SAAAA,EAAWvC,MAAMuC;AAAU;AAAE,aAAA,CAAA;AACzF,QAAA;QAEA,OAAOZ,QAAAA;IACT,CAAA,EAAG;AAACA,QAAAA,QAAAA;AAAU3B,QAAAA,KAAAA,CAAMkC,OAAO;AAAElC,QAAAA,KAAAA,CAAMmC,WAAW;AAAEnC,QAAAA,KAAAA,CAAMuC;AAAU,KAAA,CAAA;IAEhE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGvB,gBAAAA,CAAMI,QAAQ,CAAC,KAAA,CAAA;AACjE,IAAA,MAAM,EAAEoB,IAAI,EAAEC,WAAW,EAAEC,YAAY,EAAEC,UAAU,EAAEC,cAAc,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAClFC,qBAAAA,EAAAA;IACF,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAE,GAAGC,yBAAAA,EAAAA;AAC1D,IAAA,MAAM,CAACC,kBAAAA,EAAoBC,qBAAAA,CAAsB,GAAGvC,gBAAAA,CAAMI,QAAQ,CAAU,KAAA,CAAA;AAC5E,IAAA,MAAM,CAACoC,UAAAA,EAAYC,aAAAA,CAAc,GAAGzC,gBAAAA,CAAMI,QAAQ,CAChDd,cAAAA,IAAkB;QAAEoD,CAAAA,EAAG,EAAA;QAAIC,CAAAA,EAAG;AAAG,KAAA,CAAA;AAGnC,IAAA,MAAM,EACJC,MAAM,EACNV,SAAAA,EAAWW,eAAe,EAC1BT,MAAAA,EAAQU,YAAY,EACpBb,OAAOc,WAAW,EAClBZ,QAAAA,EAAUa,cAAc,EACzB,GAAGC,mBAAAA,EAAAA;AAEJjD,IAAAA,gBAAAA,CAAMkD,SAAS,CAAC,IAAA;;;AAGd,QAAA,IAAI9D,eAAAA,EAAiB;YACnB,MAAM+D,YAAAA,GAAeC,GAAAA,CAAIC,eAAe,CAACjE,eAAAA,CAAAA;YAEzC,IAAIR,KAAAA,CAAMkC,OAAO,EAAE;AACjBlC,gBAAAA,KAAAA,CAAMqC,GAAG,GAAGkC,YAAAA;AACd,YAAA;YAEA3C,WAAAA,CAAY2C,YAAAA,CAAAA;YACZxC,eAAAA,CAAgBwC,YAAAA,CAAAA;AAClB,QAAA;IACF,CAAA,EAAG;AAAC/D,QAAAA,eAAAA;AAAiBR,QAAAA;AAAM,KAAA,CAAA;AAE3BoB,IAAAA,gBAAAA,CAAMkD,SAAS,CAAC,IAAA;AACd,QAAA,IAAI7C,kBAAkB,KAAA,EAAO;AAC3BqB,YAAAA,YAAAA,EAAAA;AACAvC,YAAAA,YAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACkB,QAAAA,aAAAA;AAAeqB,QAAAA,YAAAA;AAAcvC,QAAAA,YAAAA;AAAcF,QAAAA;AAAa,KAAA,CAAA;AAE5De,IAAAA,gBAAAA,CAAMkD,SAAS,CAAC,IAAA;AACd,QAAA,IAAI7C,iBAAiBH,gBAAAA,EAAkB;AACrCsB,YAAAA,IAAAA,CAAKzB,WAAWuD,OAAO,CAAA;AACvBpE,YAAAA,WAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACgB,QAAAA,gBAAAA;AAAkBG,QAAAA,aAAAA;AAAenB,QAAAA,WAAAA;AAAasC,QAAAA;AAAK,KAAA,CAAA;AAEvD,IAAA,MAAM+B,cAAAA,GAAiB,UAAA;AACrB,QAAA,MAAMC,SAAAA,GAAY;AAAE,YAAA,GAAG5E,KAAK;AAAEiD,YAAAA,KAAAA;AAAOC,YAAAA,MAAAA;YAAQ2B,MAAAA,EAAQ7E,KAAAA,CAAM6E,MAAM,EAAEC;AAAG,SAAA;QACtE,MAAMC,IAAAA,GAAQ,MAAMlC,WAAAA,CAAY+B,SAAAA,CAAUI,IAAI,EAAEJ,SAAAA,CAAUK,IAAI,EAAGL,SAAAA,CAAUrC,SAAS,CAAA;;;QAIpF,IAAI2C,qBAAAA;QACJ,IAAIC,8BAAAA;QAEJ,IAAInF,KAAAA,CAAMkC,OAAO,EAAE;YACjBgD,qBAAAA,GAAwBV,GAAAA,CAAIC,eAAe,CAACM,IAAAA,CAAAA;YAC5CI,8BAAAA,GAAiCD,qBAAAA;AACjClF,YAAAA,KAAAA,CAAMqC,GAAG,GAAG6C,qBAAAA;AACZlF,YAAAA,KAAAA,CAAMoF,OAAO,GAAGL,IAAAA;AAEhB9D,YAAAA,UAAAA,CAAW,aAAA,EAAe;gBAAEoE,cAAAA,EAAgB,IAAA;gBAAMC,QAAAA,EAAU7E;AAAiB,aAAA,CAAA;QAC/E,CAAA,MAAO;YACL,MAAM8E,YAAAA,GAAe,MAAMnC,SAAAA,CAAUwB,SAAAA,EAAWG,IAAAA,CAAAA;AAChDG,YAAAA,qBAAAA,GAAwBrD,8BAAe0D,YAAAA,EAAc,KAAA,CAAA;AACrDJ,YAAAA,8BAAAA,GAAiCtD,8BAAe0D,YAAAA,EAAc,IAAA,CAAA;AAE9DtE,YAAAA,UAAAA,CAAW,aAAA,EAAe;gBAAEoE,cAAAA,EAAgB,KAAA;gBAAOC,QAAAA,EAAU7E;AAAiB,aAAA,CAAA;AAChF,QAAA;QAEAmB,WAAAA,CAAYsD,qBAAAA,CAAAA;QACZnD,eAAAA,CAAgBoD,8BAAAA,CAAAA;QAChBzD,gBAAAA,CAAiB,KAAA,CAAA;AACnB,IAAA,CAAA;IAEA,MAAM8D,gBAAAA,GAAmBzC,cAAc,CAACO,SAAAA;AAExC,IAAA,MAAMmC,iBAAAA,GAAoB,UAAA;AACxB,QAAA,MAAMb,SAAAA,GAAY;AAAE,YAAA,GAAG5E,KAAqB,CAAA;QAC5C,MAAM+E,IAAAA,GAAQ,MAAMlC,WAAAA,CAClB+B,SAAAA,CAAUI,IAAI,EACdJ,SAAAA,CAAUK,IAAI,EACdL,SAAAA,CAAUrC,SAAS,CAAA;AAGrB,QAAA,MAAMyB,MAAAA,CAAO;AAAEgB,YAAAA,IAAAA,EAAMD,KAAKC,IAAI;YAAEI,OAAAA,EAASL;SAAK,EAAG/E,KAAAA,CAAM6E,MAAM,EAAEC,EAAAA,GAAK9E,MAAM6E,MAAM,CAACC,EAAE,GAAG,IAAA,CAAA;AAEtF7D,QAAAA,UAAAA,CAAW,aAAA,EAAe;YAAEoE,cAAAA,EAAgB,IAAA;YAAMC,QAAAA,EAAU7E;AAAiB,SAAA,CAAA;QAE7EiB,gBAAAA,CAAiB,KAAA,CAAA;AACjBrB,QAAAA,YAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMqF,gBAAAA,GAAmB,IAAA;QACvBhE,gBAAAA,CAAiB,KAAA,CAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMiE,eAAAA,GAAkB,IAAA;QACtBjE,gBAAAA,CAAiB,IAAA,CAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMkE,+BAA+B,CAACC,CAAAA,GAAAA;AACpC,QAAA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGF,CAAAA;AAC7B,QAAA,MAAMG,IAAAA,GAAOH,CAAAA,CAAEI,aAAa,CAACC,qBAAqB,EAAA;QAClD,MAAMC,IAAAA,GAAOL,OAAAA,GAAUE,IAAAA,CAAKI,IAAI;QAChC,MAAMC,IAAAA,GAAON,OAAAA,GAAUC,IAAAA,CAAKM,GAAG;QAE/B,OAAO;YACLxC,CAAAA,EAAGyC,MAAAA,CAAO,CAAC,IAACJ,GAAOH,IAAAA,CAAK/C,KAAK,GAAI,GAAE,EAAGuD,OAAO,CAAC,CAAA,CAAA,CAAA;YAC9CzC,CAAAA,EAAGwC,MAAAA,CAAO,CAAC,IAACF,GAAOL,IAAAA,CAAK9C,MAAM,GAAI,GAAE,EAAGsD,OAAO,CAAC,CAAA,CAAA;AACjD,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,wBAAwB,CAACZ,CAAAA,GAAAA;AAC7B,QAAA,IAAI,CAACnC,kBAAAA,EAAoB;AACzBG,QAAAA,aAAAA,CAAc+B,4BAAAA,CAA6BC,CAAAA,CAAAA,CAAAA;AAC7C,IAAA,CAAA;AAEA,IAAA,MAAMa,sBAAAA,GAAyB,IAAA;QAC7B/C,qBAAAA,CAAsB,KAAA,CAAA;AACtBE,QAAAA,aAAAA,CAAcnD,cAAAA,IAAkB;YAAEoD,CAAAA,EAAG,EAAA;YAAIC,CAAAA,EAAG;AAAG,SAAA,CAAA;AAC/ClD,QAAAA,kBAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM8F,qBAAAA,GAAwB,IAAA;AAC5BhG,QAAAA,iBAAAA,EAAAA;QACAgD,qBAAAA,CAAsB,IAAA,CAAA;AACxB,IAAA,CAAA;AAEA,IAAA,MAAMiD,wBAAAA,GAA2B,IAAA;QAC/BjD,qBAAAA,CAAsB,KAAA,CAAA;QACtB/C,kBAAAA,CAAmBgD,UAAAA,CAAAA;AACrB,IAAA,CAAA;AAEA,IAAA,MAAMiD,qBAAAA,GAAwB,IAAA;QAC5BhD,aAAAA,CAAc;YAAEC,CAAAA,EAAG,EAAA;YAAIC,CAAAA,EAAG;AAAG,SAAA,CAAA;AAC/B,IAAA,CAAA;IAEA,qBACE+C,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAAA,CAAClG,cAAAA,EAAAA,EAAAA,CAAAA;0BACDgG,eAAA,CAACG,6BAAAA,EAAAA;gBAAYC,SAAS,EAAA,IAAA;gBAACC,UAAAA,EAAW,YAAA;gBAAaC,WAAAA,EAAY,YAAA;;AACxDpE,oBAAAA,cAAAA,IAAkBwC,kCACjBwB,cAAA,CAACK,+BAAAA,EAAAA;wBACCC,UAAAA,EAAY3C,cAAAA;wBACZ4C,WAAAA,EAAavH,KAAAA,CAAMkC,OAAO,GAAGsF,SAAAA,GAAY/B,iBAAAA;wBACzCgC,QAAAA,EAAU/B;;AAIbhC,oBAAAA,kBAAAA,kBACCsD,cAAA,CAACU,mCAAAA,EAAAA;wBACCJ,UAAAA,EAAYV,wBAAAA;wBACZa,QAAAA,EAAUf,sBAAAA;wBACViB,OAAAA,EAASd;;kCAIbG,cAAA,CAACY,2BAAAA,EAAAA;wBAAUC,WAAAA,EAAa,CAAA;wBAAGC,YAAAA,EAAc,CAAA;wBAAGC,cAAAA,EAAe,UAAA;AACzD,wBAAA,QAAA,gBAAAjB,eAAA,CAACkB,iBAAAA,EAAAA;4BAAKC,GAAAA,EAAK,CAAA;;AACRhI,gCAAAA,SAAAA,IAAa,CAACD,KAAAA,CAAMkC,OAAO,kBAC1B8E,cAAA,CAACkB,uBAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;wCACnBsC,EAAAA,EAAI,eAAA;wCACJsD,cAAAA,EAAgB;AAClB,qCAAA,CAAA;AACAC,oCAAAA,OAAAA,EAAS,IAAM1F,oBAAAA,CAAqB,IAAA,CAAA;AAEpC,oCAAA,QAAA,gBAAAqE,cAAA,CAACsB,WAAAA,EAAAA,EAAAA;;AAIJnI,gCAAAA,WAAAA,kBACC6G,cAAA,CAACkB,uBAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AACnBsC,wCAAAA,EAAAA,EAAIyD,eAAAA,CAAQ,uBAAA,CAAA;wCACZH,cAAAA,EAAgB;AAClB,qCAAA,CAAA;AACAC,oCAAAA,OAAAA,EAAS,IAAMG,yBAAAA,CAAa7G,QAAAA,EAAW3B,KAAAA,CAAMgF,IAAI,CAAA;AAEjD,oCAAA,QAAA,gBAAAgC,cAAA,CAACyB,cAAAA,EAAAA,EAAAA;;AAIJvI,gCAAAA,WAAAA,kBAAe8G,cAAA,CAAC0B,6BAAAA,EAAAA;oCAAerG,GAAAA,EAAKV;;AAEpC1B,gCAAAA,SAAAA,IAAaD,MAAMiF,IAAI,EAAE0D,SAASC,eAAAA,CAAUC,KAAK,mBAChD7B,cAAA,CAACkB,uBAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AAAEsC,wCAAAA,EAAAA,EAAIyD,eAAAA,CAAQ,mBAAA,CAAA;wCAAsBH,cAAAA,EAAgB;AAAO,qCAAA,CAAA;oCAChFC,OAAAA,EAAS1C,eAAAA;AAET,oCAAA,QAAA,gBAAAqB,cAAA,CAAC8B,UAAAA,EAAAA,EAAAA;;AAIJ7I,gCAAAA,SAAAA,IAAaD,MAAMiF,IAAI,EAAE0D,SAASC,eAAAA,CAAUC,KAAK,mBAChD7B,cAAA,CAACkB,uBAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AACnBsC,wCAAAA,EAAAA,EAAIyD,eAAAA,CAAQ,8BAAA,CAAA;wCACZH,cAAAA,EAAgB;AAClB,qCAAA,CAAA;oCACAC,OAAAA,EAAS1B,qBAAAA;AAET,oCAAA,QAAA,gBAAAK,cAAA,CAAC+B,YAAAA,EAAAA,EAAAA;;;;;kCAMTjC,eAAA,CAACkC,yBAAAA,EAAAA;;AAEE1F,4BAAAA,SAAAA,kBACC0D,cAAA,CAACiC,uCAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAjC,cAAA,CAACkC,6BAAAA,EAAAA;oCAAe7F,KAAAA,EAAOA,KAAAA;oCAAOoE,QAAAA,EAAUjE,MAAAA;oCAAQD,QAAAA,EAAUA;;;AAK7DU,4BAAAA,eAAAA,kBACC+C,cAAA,CAACiC,uCAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAjC,cAAA,CAACkC,6BAAAA,EAAAA;oCACC7F,KAAAA,EAAOc,WAAAA;oCACPsD,QAAAA,EAAUvD,YAAAA;oCACVX,QAAAA,EAAUa;;;0CAKhB0C,eAAA,CAACqC,wCAAAA,EAAAA;;kDACCnC,cAAA,CAACoC,yBAAAA,EAAAA;wCACCC,GAAAA,EAAKlI,UAAAA;AACL8D,wCAAAA,IAAAA,EAAMjF,MAAMiF,IAAI;AAChBD,wCAAAA,IAAAA,EAAMhF,MAAMgF,IAAI;AAChB3C,wCAAAA,GAAAA,EAAKZ,gBAAgBO,OAAAA,GAAWF,YAAAA;wCAChCwH,MAAAA,EAAQ,IAAA;4CACN,IAAItJ,KAAAA,CAAMkC,OAAO,IAAIT,aAAAA,EAAe;gDAClCF,mBAAAA,CAAoB,IAAA,CAAA;AACtB,4CAAA;AACF,wCAAA,CAAA;wCACA8G,OAAAA,EAAS5B,qBAAAA;wCACT8C,KAAAA,EAAO;AAAEC,4CAAAA,MAAAA,EAAQ9F,qBAAqB,WAAA,GAAc8D;AAAU;;AAI/D9D,oCAAAA,kBAAAA,kBACCsD,cAAA,CAACyC,+BAAAA,EAAAA;wCAAcC,WAAAA,EAAa9F,UAAAA;AAC1B,wCAAA,QAAA,gBAAAoD,cAAA,CAAC2C,gCAAAA,EAAAA,EAAAA;;;;;;kCAMT7C,eAAA,CAACc,2BAAAA,EAAAA;wBACCC,WAAAA,EAAa,CAAA;wBACbC,YAAAA,EAAc,CAAA;wBACdC,cAAAA,EAAe,UAAA;AACf6B,wBAAAA,OAAAA,EAASpE,gBAAAA,IAAoB9B,kBAAAA;;4BAE5B8B,gBAAAA,IAAoBvC,KAAAA,IAASC,wBAC5B8D,cAAA,CAAC6C,+BAAAA,EAAAA;gCAAc1C,UAAAA,EAAW,YAAA;gCAAa2C,KAAAA,EAAM,UAAA;AAC1C7G,gCAAAA,QAAAA,EAAAA,KAAAA,IAASC,SAAS,CAAA,EAAGA,MAAAA,CAAO,CAAC,EAAED,OAAO,GAAG;;AAG7CS,4BAAAA,kBAAAA,kBACCsD,cAAA,CAAC6C,+BAAAA,EAAAA;gCAAc1C,UAAAA,EAAW,YAAA;gCAAa2C,KAAAA,EAAM,UAAA;0CAC1C,CAAC,GAAG,EAAElG,UAAAA,CAAWE,CAAC,CAAC,OAAO,EAAEF,UAAAA,CAAWG,CAAC,CAAC,CAAC;;;;;;0BAMnDiD,cAAA,CAAC+C,mCAAAA,EAAAA;gBACCC,IAAAA,EAAMtH,iBAAAA;AACNuH,gBAAAA,OAAAA,EAAS,CAACC,KAAAA,GAAAA;oBACRvH,oBAAAA,CAAqB,KAAA,CAAA;AACrB,oBAAA,IAAIuH,UAAU,IAAA,EAAM;wBAClB9J,QAAAA,CAAS,IAAA,CAAA;AACX,oBAAA;AACF,gBAAA,CAAA;gBACAJ,KAAAA,EAAOA;;;;AAIf;;;;"}
@@ -10,6 +10,7 @@ import { useCropImg } from '../../../hooks/useCropImg.mjs';
10
10
  import { useEditAsset } from '../../../hooks/useEditAsset.mjs';
11
11
  import { useTracking } from '../../../hooks/useTracking.mjs';
12
12
  import { useUpload } from '../../../hooks/useUpload.mjs';
13
+ import { appendSearchParamsToUrl } from '../../../utils/appendSearchParamsToUrl.mjs';
13
14
  import { createAssetUrl } from '../../../utils/createAssetUrl.mjs';
14
15
  import { downloadFile } from '../../../utils/downloadFile.mjs';
15
16
  import 'byte-size';
@@ -35,6 +36,26 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
35
36
  const [hasCropIntent, setHasCropIntent] = React.useState(null);
36
37
  const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));
37
38
  const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));
39
+ // When loading a cross-origin image for cropping, append a cache-busting parameter
40
+ // so the browser makes a fresh request with CORS headers instead of serving a
41
+ // previously cached non-CORS response (which would taint the canvas and break
42
+ // cropping). Signed URLs are excluded because modifying them invalidates the signature.
43
+ const cropUrl = React.useMemo(()=>{
44
+ if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {
45
+ return appendSearchParamsToUrl({
46
+ url: assetUrl,
47
+ params: {
48
+ updatedAt: asset.updatedAt
49
+ }
50
+ });
51
+ }
52
+ return assetUrl;
53
+ }, [
54
+ assetUrl,
55
+ asset.isLocal,
56
+ asset.isUrlSigned,
57
+ asset.updatedAt
58
+ ]);
38
59
  const { formatMessage } = useIntl();
39
60
  const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);
40
61
  const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } = useCropImg();
@@ -259,7 +280,7 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
259
280
  ref: previewRef,
260
281
  mime: asset.mime,
261
282
  name: asset.name,
262
- url: hasCropIntent ? assetUrl : thumbnailUrl,
283
+ url: hasCropIntent ? cropUrl : thumbnailUrl,
263
284
  onLoad: ()=>{
264
285
  if (asset.isLocal || hasCropIntent) {
265
286
  setIsCropImageReady(true);
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewBox.mjs","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = (await produceFile(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? assetUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","isLocal","url","current","handleCropping","nextAsset","folder","id","file","name","mime","updatedAt","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":"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"}
1
+ {"version":3,"file":"PreviewBox.mjs","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { appendSearchParamsToUrl, createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n\n // When loading a cross-origin image for cropping, append a cache-busting parameter\n // so the browser makes a fresh request with CORS headers instead of serving a\n // previously cached non-CORS response (which would taint the canvas and break\n // cropping). Signed URLs are excluded because modifying them invalidates the signature.\n const cropUrl = React.useMemo(() => {\n if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {\n return appendSearchParamsToUrl({ url: assetUrl, params: { updatedAt: asset.updatedAt } });\n }\n\n return assetUrl;\n }, [assetUrl, asset.isLocal, asset.isUrlSigned, asset.updatedAt]);\n\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = (await produceFile(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(AssetType.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? cropUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","cropUrl","useMemo","isLocal","isUrlSigned","appendSearchParamsToUrl","url","params","updatedAt","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","current","handleCropping","nextAsset","folder","id","file","name","mime","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AA8DO,MAAMA,UAAAA,GAAa,CAAC,EACzBC,KAAK,EACLC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACRC,YAAY,EACZC,WAAW,EACXC,YAAY,EACZC,eAAe,EACfC,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjBC,kBAAkB,EAClBC,kBAAkB,EACF,GAAA;AAChB,IAAA,MAAMC,cAAAA,GAAiBC,iBAAiB,CAAC,EAAEC,aAAa,CAAC;IACzD,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;IACvB,MAAMC,UAAAA,GAAaC,KAAAA,CAAMC,MAAM,CAAC,IAAA,CAAA;AAChC,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGH,KAAAA,CAAMI,QAAQ,CAAC,KAAA,CAAA;AAC/D,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAAA,CAAiB,GAAGN,KAAAA,CAAMI,QAAQ,CAAiB,IAAA,CAAA;IACzE,MAAM,CAACG,UAAUC,WAAAA,CAAY,GAAGR,MAAMI,QAAQ,CAACK,eAAe7B,KAAAA,EAAO,KAAA,CAAA,CAAA;IACrE,MAAM,CAAC8B,cAAcC,eAAAA,CAAgB,GAAGX,MAAMI,QAAQ,CAACK,eAAe7B,KAAAA,EAAO,IAAA,CAAA,CAAA;;;;;IAM7E,MAAMgC,OAAAA,GAAUZ,KAAAA,CAAMa,OAAO,CAAC,IAAA;QAC5B,IAAI,CAACjC,MAAMkC,OAAO,IAAI,CAAClC,KAAAA,CAAMmC,WAAW,IAAIR,QAAAA,EAAU;AACpD,YAAA,OAAOS,uBAAAA,CAAwB;gBAAEC,GAAAA,EAAKV,QAAAA;gBAAUW,MAAAA,EAAQ;AAAEC,oBAAAA,SAAAA,EAAWvC,MAAMuC;AAAU;AAAE,aAAA,CAAA;AACzF,QAAA;QAEA,OAAOZ,QAAAA;IACT,CAAA,EAAG;AAACA,QAAAA,QAAAA;AAAU3B,QAAAA,KAAAA,CAAMkC,OAAO;AAAElC,QAAAA,KAAAA,CAAMmC,WAAW;AAAEnC,QAAAA,KAAAA,CAAMuC;AAAU,KAAA,CAAA;IAEhE,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGvB,KAAAA,CAAMI,QAAQ,CAAC,KAAA,CAAA;AACjE,IAAA,MAAM,EAAEoB,IAAI,EAAEC,WAAW,EAAEC,YAAY,EAAEC,UAAU,EAAEC,cAAc,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAClFC,UAAAA,EAAAA;IACF,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAE,GAAGC,YAAAA,EAAAA;AAC1D,IAAA,MAAM,CAACC,kBAAAA,EAAoBC,qBAAAA,CAAsB,GAAGvC,KAAAA,CAAMI,QAAQ,CAAU,KAAA,CAAA;AAC5E,IAAA,MAAM,CAACoC,UAAAA,EAAYC,aAAAA,CAAc,GAAGzC,KAAAA,CAAMI,QAAQ,CAChDd,cAAAA,IAAkB;QAAEoD,CAAAA,EAAG,EAAA;QAAIC,CAAAA,EAAG;AAAG,KAAA,CAAA;AAGnC,IAAA,MAAM,EACJC,MAAM,EACNV,SAAAA,EAAWW,eAAe,EAC1BT,MAAAA,EAAQU,YAAY,EACpBb,OAAOc,WAAW,EAClBZ,QAAAA,EAAUa,cAAc,EACzB,GAAGC,SAAAA,EAAAA;AAEJjD,IAAAA,KAAAA,CAAMkD,SAAS,CAAC,IAAA;;;AAGd,QAAA,IAAI9D,eAAAA,EAAiB;YACnB,MAAM+D,YAAAA,GAAeC,GAAAA,CAAIC,eAAe,CAACjE,eAAAA,CAAAA;YAEzC,IAAIR,KAAAA,CAAMkC,OAAO,EAAE;AACjBlC,gBAAAA,KAAAA,CAAMqC,GAAG,GAAGkC,YAAAA;AACd,YAAA;YAEA3C,WAAAA,CAAY2C,YAAAA,CAAAA;YACZxC,eAAAA,CAAgBwC,YAAAA,CAAAA;AAClB,QAAA;IACF,CAAA,EAAG;AAAC/D,QAAAA,eAAAA;AAAiBR,QAAAA;AAAM,KAAA,CAAA;AAE3BoB,IAAAA,KAAAA,CAAMkD,SAAS,CAAC,IAAA;AACd,QAAA,IAAI7C,kBAAkB,KAAA,EAAO;AAC3BqB,YAAAA,YAAAA,EAAAA;AACAvC,YAAAA,YAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACkB,QAAAA,aAAAA;AAAeqB,QAAAA,YAAAA;AAAcvC,QAAAA,YAAAA;AAAcF,QAAAA;AAAa,KAAA,CAAA;AAE5De,IAAAA,KAAAA,CAAMkD,SAAS,CAAC,IAAA;AACd,QAAA,IAAI7C,iBAAiBH,gBAAAA,EAAkB;AACrCsB,YAAAA,IAAAA,CAAKzB,WAAWuD,OAAO,CAAA;AACvBpE,YAAAA,WAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACgB,QAAAA,gBAAAA;AAAkBG,QAAAA,aAAAA;AAAenB,QAAAA,WAAAA;AAAasC,QAAAA;AAAK,KAAA,CAAA;AAEvD,IAAA,MAAM+B,cAAAA,GAAiB,UAAA;AACrB,QAAA,MAAMC,SAAAA,GAAY;AAAE,YAAA,GAAG5E,KAAK;AAAEiD,YAAAA,KAAAA;AAAOC,YAAAA,MAAAA;YAAQ2B,MAAAA,EAAQ7E,KAAAA,CAAM6E,MAAM,EAAEC;AAAG,SAAA;QACtE,MAAMC,IAAAA,GAAQ,MAAMlC,WAAAA,CAAY+B,SAAAA,CAAUI,IAAI,EAAEJ,SAAAA,CAAUK,IAAI,EAAGL,SAAAA,CAAUrC,SAAS,CAAA;;;QAIpF,IAAI2C,qBAAAA;QACJ,IAAIC,8BAAAA;QAEJ,IAAInF,KAAAA,CAAMkC,OAAO,EAAE;YACjBgD,qBAAAA,GAAwBV,GAAAA,CAAIC,eAAe,CAACM,IAAAA,CAAAA;YAC5CI,8BAAAA,GAAiCD,qBAAAA;AACjClF,YAAAA,KAAAA,CAAMqC,GAAG,GAAG6C,qBAAAA;AACZlF,YAAAA,KAAAA,CAAMoF,OAAO,GAAGL,IAAAA;AAEhB9D,YAAAA,UAAAA,CAAW,aAAA,EAAe;gBAAEoE,cAAAA,EAAgB,IAAA;gBAAMC,QAAAA,EAAU7E;AAAiB,aAAA,CAAA;QAC/E,CAAA,MAAO;YACL,MAAM8E,YAAAA,GAAe,MAAMnC,SAAAA,CAAUwB,SAAAA,EAAWG,IAAAA,CAAAA;AAChDG,YAAAA,qBAAAA,GAAwBrD,eAAe0D,YAAAA,EAAc,KAAA,CAAA;AACrDJ,YAAAA,8BAAAA,GAAiCtD,eAAe0D,YAAAA,EAAc,IAAA,CAAA;AAE9DtE,YAAAA,UAAAA,CAAW,aAAA,EAAe;gBAAEoE,cAAAA,EAAgB,KAAA;gBAAOC,QAAAA,EAAU7E;AAAiB,aAAA,CAAA;AAChF,QAAA;QAEAmB,WAAAA,CAAYsD,qBAAAA,CAAAA;QACZnD,eAAAA,CAAgBoD,8BAAAA,CAAAA;QAChBzD,gBAAAA,CAAiB,KAAA,CAAA;AACnB,IAAA,CAAA;IAEA,MAAM8D,gBAAAA,GAAmBzC,cAAc,CAACO,SAAAA;AAExC,IAAA,MAAMmC,iBAAAA,GAAoB,UAAA;AACxB,QAAA,MAAMb,SAAAA,GAAY;AAAE,YAAA,GAAG5E,KAAqB,CAAA;QAC5C,MAAM+E,IAAAA,GAAQ,MAAMlC,WAAAA,CAClB+B,SAAAA,CAAUI,IAAI,EACdJ,SAAAA,CAAUK,IAAI,EACdL,SAAAA,CAAUrC,SAAS,CAAA;AAGrB,QAAA,MAAMyB,MAAAA,CAAO;AAAEgB,YAAAA,IAAAA,EAAMD,KAAKC,IAAI;YAAEI,OAAAA,EAASL;SAAK,EAAG/E,KAAAA,CAAM6E,MAAM,EAAEC,EAAAA,GAAK9E,MAAM6E,MAAM,CAACC,EAAE,GAAG,IAAA,CAAA;AAEtF7D,QAAAA,UAAAA,CAAW,aAAA,EAAe;YAAEoE,cAAAA,EAAgB,IAAA;YAAMC,QAAAA,EAAU7E;AAAiB,SAAA,CAAA;QAE7EiB,gBAAAA,CAAiB,KAAA,CAAA;AACjBrB,QAAAA,YAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMqF,gBAAAA,GAAmB,IAAA;QACvBhE,gBAAAA,CAAiB,KAAA,CAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMiE,eAAAA,GAAkB,IAAA;QACtBjE,gBAAAA,CAAiB,IAAA,CAAA;AACnB,IAAA,CAAA;AAEA,IAAA,MAAMkE,+BAA+B,CAACC,CAAAA,GAAAA;AACpC,QAAA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGF,CAAAA;AAC7B,QAAA,MAAMG,IAAAA,GAAOH,CAAAA,CAAEI,aAAa,CAACC,qBAAqB,EAAA;QAClD,MAAMC,IAAAA,GAAOL,OAAAA,GAAUE,IAAAA,CAAKI,IAAI;QAChC,MAAMC,IAAAA,GAAON,OAAAA,GAAUC,IAAAA,CAAKM,GAAG;QAE/B,OAAO;YACLxC,CAAAA,EAAGyC,MAAAA,CAAO,CAAC,IAACJ,GAAOH,IAAAA,CAAK/C,KAAK,GAAI,GAAE,EAAGuD,OAAO,CAAC,CAAA,CAAA,CAAA;YAC9CzC,CAAAA,EAAGwC,MAAAA,CAAO,CAAC,IAACF,GAAOL,IAAAA,CAAK9C,MAAM,GAAI,GAAE,EAAGsD,OAAO,CAAC,CAAA,CAAA;AACjD,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,wBAAwB,CAACZ,CAAAA,GAAAA;AAC7B,QAAA,IAAI,CAACnC,kBAAAA,EAAoB;AACzBG,QAAAA,aAAAA,CAAc+B,4BAAAA,CAA6BC,CAAAA,CAAAA,CAAAA;AAC7C,IAAA,CAAA;AAEA,IAAA,MAAMa,sBAAAA,GAAyB,IAAA;QAC7B/C,qBAAAA,CAAsB,KAAA,CAAA;AACtBE,QAAAA,aAAAA,CAAcnD,cAAAA,IAAkB;YAAEoD,CAAAA,EAAG,EAAA;YAAIC,CAAAA,EAAG;AAAG,SAAA,CAAA;AAC/ClD,QAAAA,kBAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM8F,qBAAAA,GAAwB,IAAA;AAC5BhG,QAAAA,iBAAAA,EAAAA;QACAgD,qBAAAA,CAAsB,IAAA,CAAA;AACxB,IAAA,CAAA;AAEA,IAAA,MAAMiD,wBAAAA,GAA2B,IAAA;QAC/BjD,qBAAAA,CAAsB,KAAA,CAAA;QACtB/C,kBAAAA,CAAmBgD,UAAAA,CAAAA;AACrB,IAAA,CAAA;AAEA,IAAA,MAAMiD,qBAAAA,GAAwB,IAAA;QAC5BhD,aAAAA,CAAc;YAAEC,CAAAA,EAAG,EAAA;YAAIC,CAAAA,EAAG;AAAG,SAAA,CAAA;AAC/B,IAAA,CAAA;IAEA,qBACE+C,IAAA,CAAAC,QAAA,EAAA;;0BACEC,GAAA,CAAClG,cAAAA,EAAAA,EAAAA,CAAAA;0BACDgG,IAAA,CAACG,WAAAA,EAAAA;gBAAYC,SAAS,EAAA,IAAA;gBAACC,UAAAA,EAAW,YAAA;gBAAaC,WAAAA,EAAY,YAAA;;AACxDpE,oBAAAA,cAAAA,IAAkBwC,kCACjBwB,GAAA,CAACK,eAAAA,EAAAA;wBACCC,UAAAA,EAAY3C,cAAAA;wBACZ4C,WAAAA,EAAavH,KAAAA,CAAMkC,OAAO,GAAGsF,SAAAA,GAAY/B,iBAAAA;wBACzCgC,QAAAA,EAAU/B;;AAIbhC,oBAAAA,kBAAAA,kBACCsD,GAAA,CAACU,iBAAAA,EAAAA;wBACCJ,UAAAA,EAAYV,wBAAAA;wBACZa,QAAAA,EAAUf,sBAAAA;wBACViB,OAAAA,EAASd;;kCAIbG,GAAA,CAACY,SAAAA,EAAAA;wBAAUC,WAAAA,EAAa,CAAA;wBAAGC,YAAAA,EAAc,CAAA;wBAAGC,cAAAA,EAAe,UAAA;AACzD,wBAAA,QAAA,gBAAAjB,IAAA,CAACkB,IAAAA,EAAAA;4BAAKC,GAAAA,EAAK,CAAA;;AACRhI,gCAAAA,SAAAA,IAAa,CAACD,KAAAA,CAAMkC,OAAO,kBAC1B8E,GAAA,CAACkB,UAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;wCACnBsC,EAAAA,EAAI,eAAA;wCACJsD,cAAAA,EAAgB;AAClB,qCAAA,CAAA;AACAC,oCAAAA,OAAAA,EAAS,IAAM1F,oBAAAA,CAAqB,IAAA,CAAA;AAEpC,oCAAA,QAAA,gBAAAqE,GAAA,CAACsB,KAAAA,EAAAA,EAAAA;;AAIJnI,gCAAAA,WAAAA,kBACC6G,GAAA,CAACkB,UAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AACnBsC,wCAAAA,EAAAA,EAAIyD,OAAAA,CAAQ,uBAAA,CAAA;wCACZH,cAAAA,EAAgB;AAClB,qCAAA,CAAA;AACAC,oCAAAA,OAAAA,EAAS,IAAMG,YAAAA,CAAa7G,QAAAA,EAAW3B,KAAAA,CAAMgF,IAAI,CAAA;AAEjD,oCAAA,QAAA,gBAAAgC,GAAA,CAACyB,QAAAA,EAAAA,EAAAA;;AAIJvI,gCAAAA,WAAAA,kBAAe8G,GAAA,CAAC0B,cAAAA,EAAAA;oCAAerG,GAAAA,EAAKV;;AAEpC1B,gCAAAA,SAAAA,IAAaD,MAAMiF,IAAI,EAAE0D,SAASC,SAAAA,CAAUC,KAAK,mBAChD7B,GAAA,CAACkB,UAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AAAEsC,wCAAAA,EAAAA,EAAIyD,OAAAA,CAAQ,mBAAA,CAAA;wCAAsBH,cAAAA,EAAgB;AAAO,qCAAA,CAAA;oCAChFC,OAAAA,EAAS1C,eAAAA;AAET,oCAAA,QAAA,gBAAAqB,GAAA,CAAC8B,IAAAA,EAAAA,EAAAA;;AAIJ7I,gCAAAA,SAAAA,IAAaD,MAAMiF,IAAI,EAAE0D,SAASC,SAAAA,CAAUC,KAAK,mBAChD7B,GAAA,CAACkB,UAAAA,EAAAA;AACCC,oCAAAA,KAAAA,EAAO3F,aAAAA,CAAc;AACnBsC,wCAAAA,EAAAA,EAAIyD,OAAAA,CAAQ,8BAAA,CAAA;wCACZH,cAAAA,EAAgB;AAClB,qCAAA,CAAA;oCACAC,OAAAA,EAAS1B,qBAAAA;AAET,oCAAA,QAAA,gBAAAK,GAAA,CAAC+B,MAAAA,EAAAA,EAAAA;;;;;kCAMTjC,IAAA,CAACkC,OAAAA,EAAAA;;AAEE1F,4BAAAA,SAAAA,kBACC0D,GAAA,CAACiC,qBAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAjC,GAAA,CAACkC,cAAAA,EAAAA;oCAAe7F,KAAAA,EAAOA,KAAAA;oCAAOoE,QAAAA,EAAUjE,MAAAA;oCAAQD,QAAAA,EAAUA;;;AAK7DU,4BAAAA,eAAAA,kBACC+C,GAAA,CAACiC,qBAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAjC,GAAA,CAACkC,cAAAA,EAAAA;oCACC7F,KAAAA,EAAOc,WAAAA;oCACPsD,QAAAA,EAAUvD,YAAAA;oCACVX,QAAAA,EAAUa;;;0CAKhB0C,IAAA,CAACqC,sBAAAA,EAAAA;;kDACCnC,GAAA,CAACoC,YAAAA,EAAAA;wCACCC,GAAAA,EAAKlI,UAAAA;AACL8D,wCAAAA,IAAAA,EAAMjF,MAAMiF,IAAI;AAChBD,wCAAAA,IAAAA,EAAMhF,MAAMgF,IAAI;AAChB3C,wCAAAA,GAAAA,EAAKZ,gBAAgBO,OAAAA,GAAWF,YAAAA;wCAChCwH,MAAAA,EAAQ,IAAA;4CACN,IAAItJ,KAAAA,CAAMkC,OAAO,IAAIT,aAAAA,EAAe;gDAClCF,mBAAAA,CAAoB,IAAA,CAAA;AACtB,4CAAA;AACF,wCAAA,CAAA;wCACA8G,OAAAA,EAAS5B,qBAAAA;wCACT8C,KAAAA,EAAO;AAAEC,4CAAAA,MAAAA,EAAQ9F,qBAAqB,WAAA,GAAc8D;AAAU;;AAI/D9D,oCAAAA,kBAAAA,kBACCsD,GAAA,CAACyC,aAAAA,EAAAA;wCAAcC,WAAAA,EAAa9F,UAAAA;AAC1B,wCAAA,QAAA,gBAAAoD,GAAA,CAAC2C,cAAAA,EAAAA,EAAAA;;;;;;kCAMT7C,IAAA,CAACc,SAAAA,EAAAA;wBACCC,WAAAA,EAAa,CAAA;wBACbC,YAAAA,EAAc,CAAA;wBACdC,cAAAA,EAAe,UAAA;AACf6B,wBAAAA,OAAAA,EAASpE,gBAAAA,IAAoB9B,kBAAAA;;4BAE5B8B,gBAAAA,IAAoBvC,KAAAA,IAASC,wBAC5B8D,GAAA,CAAC6C,aAAAA,EAAAA;gCAAc1C,UAAAA,EAAW,YAAA;gCAAa2C,KAAAA,EAAM,UAAA;AAC1C7G,gCAAAA,QAAAA,EAAAA,KAAAA,IAASC,SAAS,CAAA,EAAGA,MAAAA,CAAO,CAAC,EAAED,OAAO,GAAG;;AAG7CS,4BAAAA,kBAAAA,kBACCsD,GAAA,CAAC6C,aAAAA,EAAAA;gCAAc1C,UAAAA,EAAW,YAAA;gCAAa2C,KAAAA,EAAM,UAAA;0CAC1C,CAAC,GAAG,EAAElG,UAAAA,CAAWE,CAAC,CAAC,OAAO,EAAEF,UAAAA,CAAWG,CAAC,CAAC,CAAC;;;;;;0BAMnDiD,GAAA,CAAC+C,iBAAAA,EAAAA;gBACCC,IAAAA,EAAMtH,iBAAAA;AACNuH,gBAAAA,OAAAA,EAAS,CAACC,KAAAA,GAAAA;oBACRvH,oBAAAA,CAAqB,KAAA,CAAA;AACrB,oBAAA,IAAIuH,UAAU,IAAA,EAAM;wBAClB9J,QAAAA,CAAS,IAAA,CAAA;AACX,oBAAA;AACF,gBAAA,CAAA;gBACAJ,KAAAA,EAAOA;;;;AAIf;;;;"}
@@ -79,7 +79,7 @@ const FromUrlForm = ({ onClose, onAddAsset, trackedLocation })=>{
79
79
  }),
80
80
  error: error?.message || (errors.urls ? formatMessage({
81
81
  id: errors.urls,
82
- defaultMessage: 'An error occured'
82
+ defaultMessage: 'An error occurred'
83
83
  }) : undefined),
84
84
  children: [
85
85
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
@@ -1 +1 @@
1
- {"version":3,"file":"FromUrlForm.js","sources":["../../../../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useTracking } from '../../../hooks/useTracking';\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e: unknown) {\n setError(e as Error);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occured' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n"],"names":["FromUrlForm","onClose","onAddAsset","trackedLocation","loading","setLoading","React","useState","error","setError","undefined","formatMessage","useIntl","trackUsage","useTracking","handleSubmit","urls","urlArray","split","assets","urlsToAssets","source","location","e","_jsx","Formik","enableReinitialize","initialValues","onSubmit","validationSchema","urlSchema","validateOnChange","values","errors","handleChange","_jsxs","Form","noValidate","Box","paddingLeft","paddingRight","paddingBottom","paddingTop","Field","Root","hint","id","getTrad","defaultMessage","message","Label","Textarea","name","onChange","value","Hint","Error","Modal","Footer","Button","onClick","variant","type"],"mappings":"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"}
1
+ {"version":3,"file":"FromUrlForm.js","sources":["../../../../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useTracking } from '../../../hooks/useTracking';\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e: unknown) {\n setError(e as Error);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occurred' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n"],"names":["FromUrlForm","onClose","onAddAsset","trackedLocation","loading","setLoading","React","useState","error","setError","undefined","formatMessage","useIntl","trackUsage","useTracking","handleSubmit","urls","urlArray","split","assets","urlsToAssets","source","location","e","_jsx","Formik","enableReinitialize","initialValues","onSubmit","validationSchema","urlSchema","validateOnChange","values","errors","handleChange","_jsxs","Form","noValidate","Box","paddingLeft","paddingRight","paddingBottom","paddingTop","Field","Root","hint","id","getTrad","defaultMessage","message","Label","Textarea","name","onChange","value","Hint","Error","Modal","Footer","Button","onClick","variant","type"],"mappings":"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"}
@@ -58,7 +58,7 @@ const FromUrlForm = ({ onClose, onAddAsset, trackedLocation })=>{
58
58
  }),
59
59
  error: error?.message || (errors.urls ? formatMessage({
60
60
  id: errors.urls,
61
- defaultMessage: 'An error occured'
61
+ defaultMessage: 'An error occurred'
62
62
  }) : undefined),
63
63
  children: [
64
64
  /*#__PURE__*/ jsx(Field.Label, {
@@ -1 +1 @@
1
- {"version":3,"file":"FromUrlForm.mjs","sources":["../../../../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useTracking } from '../../../hooks/useTracking';\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e: unknown) {\n setError(e as Error);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occured' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n"],"names":["FromUrlForm","onClose","onAddAsset","trackedLocation","loading","setLoading","React","useState","error","setError","undefined","formatMessage","useIntl","trackUsage","useTracking","handleSubmit","urls","urlArray","split","assets","urlsToAssets","source","location","e","_jsx","Formik","enableReinitialize","initialValues","onSubmit","validationSchema","urlSchema","validateOnChange","values","errors","handleChange","_jsxs","Form","noValidate","Box","paddingLeft","paddingRight","paddingBottom","paddingTop","Field","Root","hint","id","getTrad","defaultMessage","message","Label","Textarea","name","onChange","value","Hint","Error","Modal","Footer","Button","onClick","variant","type"],"mappings":"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"}
1
+ {"version":3,"file":"FromUrlForm.mjs","sources":["../../../../../admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Field, Modal, Textarea } from '@strapi/design-system';\nimport { Form, Formik } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { useTracking } from '../../../hooks/useTracking';\nimport { getTrad, urlsToAssets, urlSchema } from '../../../utils';\n\nimport type { FileWithRawFile } from './AddAssetStep';\n\ninterface FromUrlFormProps {\n onClose: () => void;\n onAddAsset: (assets: FileWithRawFile[]) => void;\n trackedLocation?: string;\n}\n\nexport const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }: FromUrlFormProps) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleSubmit = async ({ urls }: { urls: string }) => {\n setLoading(true);\n const urlArray = urls.split(/\\r?\\n/);\n try {\n const assets: FileWithRawFile[] = await urlsToAssets(urlArray);\n\n if (trackedLocation) {\n trackUsage('didSelectFile', { source: 'url', location: trackedLocation });\n }\n\n // no need to set the loading to false since the component unmounts\n onAddAsset(assets);\n } catch (e: unknown) {\n setError(e as Error);\n setLoading(false);\n }\n };\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n urls: '',\n }}\n onSubmit={handleSubmit}\n validationSchema={urlSchema}\n validateOnChange={false}\n >\n {({ values, errors, handleChange }) => (\n <Form noValidate>\n <Box paddingLeft={8} paddingRight={8} paddingBottom={6} paddingTop={6}>\n <Field.Root\n hint={formatMessage({\n id: getTrad('input.url.description'),\n defaultMessage: 'Separate your URL links by a carriage return.',\n })}\n error={\n error?.message ||\n (errors.urls\n ? formatMessage({ id: errors.urls, defaultMessage: 'An error occurred' })\n : undefined)\n }\n >\n <Field.Label>\n {formatMessage({ id: getTrad('input.url.label'), defaultMessage: 'URL' })}\n </Field.Label>\n <Textarea name=\"urls\" onChange={handleChange} value={values.urls} />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n </Box>\n\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'cancel' })}\n </Button>\n <Button type=\"submit\" loading={loading}>\n {formatMessage({\n id: getTrad('button.next'),\n defaultMessage: 'Next',\n })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n );\n};\n"],"names":["FromUrlForm","onClose","onAddAsset","trackedLocation","loading","setLoading","React","useState","error","setError","undefined","formatMessage","useIntl","trackUsage","useTracking","handleSubmit","urls","urlArray","split","assets","urlsToAssets","source","location","e","_jsx","Formik","enableReinitialize","initialValues","onSubmit","validationSchema","urlSchema","validateOnChange","values","errors","handleChange","_jsxs","Form","noValidate","Box","paddingLeft","paddingRight","paddingBottom","paddingTop","Field","Root","hint","id","getTrad","defaultMessage","message","Label","Textarea","name","onChange","value","Hint","Error","Modal","Footer","Button","onClick","variant","type"],"mappings":"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"}
@@ -1,8 +1,53 @@
1
1
  'use strict';
2
2
 
3
3
  var pl = {
4
+ "apiError.FileTooBig": "Przesłany plik przekracza maksymalny dozwolony rozmiar pliku.",
5
+ "assets.uploaded": "{number, plural, one {# przesłany zasób} other {# przesłanych zasobów}} pomyślnie",
6
+ "asset-details.title": "Szczegóły pliku",
7
+ "asset-details.description": "Wyświetla informacje o pliku i jego metadane",
8
+ "asset-details.fileInfo": "Informacje o pliku",
9
+ "asset-details.error": "Nie udało się załadować szczegółów pliku.",
10
+ "asset-details.videoNotSupported": "Twoja przeglądarka nie obsługuje tagu video.",
11
+ "asset-details.size": "Rozmiar",
12
+ "asset-details.dimensions": "Wymiary",
13
+ "asset-details.duration": "Czas trwania",
14
+ "asset-details.creationDate": "Data utworzenia",
15
+ "asset-details.lastUpdated": "Ostatnia aktualizacja",
16
+ "asset-details.createdBy": "Utworzone przez",
17
+ "asset-details.extension": "Rozszerzenie",
18
+ "asset-details.assetId": "Identyfikator zasobu",
19
+ "asset-details.fileName": "Nazwa pliku",
20
+ "asset-details.caption": "Podpis",
21
+ "asset-details.alternativeText": "Tekst alternatywny",
22
+ "asset-details.noPreview": "Brak podglądu",
23
+ "upload.generic-error": "Wystąpił błąd podczas przesyłania pliku.",
24
+ "upload.progress": "Postęp przesyłania",
25
+ "upload.progress.description": "Wyświetla postęp i stan przesyłania",
26
+ "upload.progress.failed": "Przesyłanie nie powiodło się",
27
+ "upload.progress.failed.subtitle": "Spróbuj przesłać pliki ponownie",
28
+ "upload.progress.success": "Przesyłanie zakończone sukcesem!",
29
+ "upload.progress.success.subtitle": "{count, plural, one {# plik przesłany pomyślnie} other {# plików przesłane pomyślnie}}",
30
+ "upload.progress.success.subtitle.withErrors": "{successCount} przesłano, {errorCount} nie powiodło się",
31
+ "upload.progress.uploading.withCount": "Przesyłanie {total} elementów ({percentage}%)",
32
+ "upload.progress.uploading-files": "Przesyłanie {count, plural, one {# pliku} other {# plików}}",
33
+ "upload.progress.indicator.in-progress": "Wskaźnik trwającego przesyłania",
34
+ "upload.progress.indicator.complete": "Wskaźnik zakończonego przesyłania",
35
+ "upload.progress.label": "Przesyłanie",
36
+ "upload.progress.errors.title": "Nie udało się przesłać:",
37
+ "upload.progress.cancel": "Anuluj",
38
+ "upload.progress.canceled": "Przesyłanie anulowane",
39
+ "upload.progress.canceled.subtitle": "Niektóre pliki nie zostały przesłane",
40
+ "upload.progress.canceled.subtitle.all": "Przesyłanie wszystkich plików zostało anulowane",
41
+ "upload.progress.retry": "Ponów próbę",
42
+ "upload.progress.file.uploading": "Przesyłanie...",
43
+ "upload.progress.file.canceled": "Anulowano",
44
+ "upload.progress.file.uploaded": "Przesłano",
45
+ "upload.progress.maximize": "Maksymalizuj",
46
+ "upload.progress.minimize": "Minimalizuj",
47
+ "upload.progress.close": "Zamknij",
4
48
  "bulk.select.label": "Wybierz wszystkie",
5
49
  "button.next": "Dalej",
50
+ "new": "Nowy",
6
51
  "checkControl.crop-duplicate": "Duplikuj i przytnij",
7
52
  "checkControl.crop-original": "Przytnij",
8
53
  "content.isLoading": "Ładowanie listy.",
@@ -10,22 +55,42 @@ var pl = {
10
55
  "control-card.cancel": "Anuluj",
11
56
  "control-card.copy-link": "Kopiuj link",
12
57
  "control-card.crop": "Przytnij",
58
+ "control-card.set-focal-point": "Ustaw punkt skupienia",
59
+ "control-card.stop-focal-point": "Anuluj wybór punktu skupienia",
60
+ "control-card.reset-focal-point": "Zresetuj do środka obrazu",
61
+ "control-card.save-focal-point": "Zapisz punkt skupienia",
13
62
  "control-card.download": "Pobierz",
14
63
  "control-card.edit": "Edytuj",
64
+ "control-card.remove-selection": "Usuń z zaznaczenia",
15
65
  "control-card.replace-media": "Zamień",
16
66
  "control-card.save": "Zapisz",
17
67
  "control-card.stop-crop": "Zatrzymaj przycinanie",
68
+ "dropzone.upload.message": "Upuść tutaj, aby przesłać do",
18
69
  "filter.add": "Dodaj filtr",
19
70
  "form.button.replace-media": "Zamień",
20
71
  "form.input.description.file-alt": "Ten tekst zostanie wyświetlony, jeżeli medium nie będzie mogło zostać pokazane.",
21
72
  "form.input.label.file-alt": "Tekst alternatywny",
22
73
  "form.input.label.file-caption": "Podpis",
74
+ "form.input.placeholder.file-caption": "Wpisz podpis",
23
75
  "form.input.label.file-name": "Nazwa pliku",
24
76
  "form.upload-url.error.url.invalid": "Link URL jest niepoprawny",
25
77
  "form.upload-url.error.url.invalids": "{number} linków URL jest niepoprawnych",
26
- "header.actions.add-assets": "Dodaj",
27
- "header.actions.upload-assets": "Prześlij zasób",
28
- "header.content.assets": "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 zasób} other {# zasobów}}",
78
+ "header.actions.add-assets": "Dodaj pliki",
79
+ "header.actions.add-folder": "Dodaj folder",
80
+ "folder.create.title": "Nowy folder",
81
+ "folder.form.name.label": "Nazwa folderu",
82
+ "folder.create.submit": "Utwórz folder",
83
+ "folder.create.form.error.name-required": "Nazwa jest wymagana",
84
+ "folder.create.form.error.unknown": "Wystąpił błąd podczas tworzenia folderu",
85
+ "folder.create.success": "Folder został utworzony",
86
+ "header.actions.add-assets.folder": "folder",
87
+ "header.actions.upload-assets": "Prześlij pliki",
88
+ "header.actions.upload-new-asset": "Prześlij nowy plik",
89
+ "header.content.assets-empty": "Brak plików",
90
+ "header.content.assets": "{numberFolders, plural, one {1 folder} other {# folderów}} - {numberAssets, plural, one {1 plik} other {# plików}}",
91
+ "header.content.item-count": "{count, plural, =1 {# element} other {# elementów}}",
92
+ "import-files": "Przesyłanie plików",
93
+ "import-from-url": "Przesyłanie plików z adresu URL",
29
94
  "input.button.label": "Przeglądaj pliki",
30
95
  "input.label": "Przeciągnij i upuść tutaj lub",
31
96
  "input.label-bold": "Przeciągnij & upuść",
@@ -34,18 +99,31 @@ var pl = {
34
99
  "input.placeholder.icon": "Upuść tutaj",
35
100
  "input.url.description": "Oddziel swoje linki URL umieszczając je w nowych liniach.",
36
101
  "input.url.label": "URL",
102
+ "input.url.placeholder": "Brak",
103
+ "input.notification.not-supported": "Nie możesz przesłać pliku tego typu, akceptowane są tylko następujące typy – {fileTypes}",
104
+ "list.assets.title": "Pliki ({count})",
37
105
  "list.asset.at.finished": "Załadowano.",
38
106
  "list.assets-empty.search": "Brak wyników wyszukiwania",
39
107
  "list.assets-empty.subtitle": "Dodaj jeden do listy.",
40
- "list.assets-empty.title": "Nie ma jeszcze żadnych zasobów",
41
- "list.assets-empty.title-withSearch": "Brak zasobów pasujących do wybranych filtrów",
42
- "list.assets.empty": "Prześlij pierwszy plik...",
108
+ "list.assets-empty.title": "Nie ma jeszcze żadnych plików",
109
+ "list.assets-empty.title-withSearch": "Brak plików pasujących do wybranych filtrów",
110
+ "list.assets.empty": "Biblioteka Mediów jest pusta",
111
+ "list.assets.empty-upload": "Prześlij pierwszy plik...",
43
112
  "list.assets.empty.no-permissions": "Lista jest pusta.",
113
+ "list.assets.error": "Wystąpił błąd podczas pobierania zasobów.",
114
+ "list.assets.loading-more": "Ładowanie kolejnych zasobów...",
44
115
  "list.assets.loading-asset": "Ładowanie podglądu dla: {path}",
45
116
  "list.assets.not-supported-content": "Podgląd nie jest dostępny",
46
117
  "list.assets.preview-asset": "Podgląd dla video: {path}",
47
- "list.assets.selected": "{number, plural, =0 {No asset} other {# zaznaczono}}",
118
+ "list.assets.selected": "{number, plural, =0 {Brak plików} other {# zaznaczono}}",
119
+ "list-assets-select": "Wybierz plik {name}",
48
120
  "list.assets.type-not-allowed": "Ten typ pliku jest niedozwolony.",
121
+ "list.assets.to-upload": "{number, plural, =0 {Brak plików} one {1 plik gotowy} other {# plików gotowych}} do przesłania",
122
+ "list.folder.edit": "Edytuj folder",
123
+ "list.folder.select": "Wybierz folder {name}",
124
+ "list.folder.subtitle": "{folderCount, plural, =0 {# folderów} one {# folder} other {# foldery}}, {filesCount, plural, =0 {# plików} one {# plik} other {# plików}}",
125
+ "list.folders.title": "Foldery ({count})",
126
+ "list.folders.link-label": "Przejdź do folderu",
49
127
  "mediaLibraryInput.actions.nextSlide": "Następny",
50
128
  "mediaLibraryInput.actions.previousSlide": "Poprzedni",
51
129
  "mediaLibraryInput.placeholder": "Kliknij by dodać plik lub przeciągnij i upuść plik w to miejsce",
@@ -54,18 +132,24 @@ var pl = {
54
132
  "modal.file-details.dimensions": "Wymiary",
55
133
  "modal.file-details.extension": "Rozszerzenia",
56
134
  "modal.file-details.size": "Rozmiar",
135
+ "modal.file-details.id": "ID pliku",
136
+ "modal.file-details.focal-point": "Punkt skupienia",
137
+ "modal.folder.elements.count": "{folderCount} folderów, {assetCount} plików",
57
138
  "modal.header.browse": "Prześlij media",
58
139
  "modal.header.file-detail": "Szczegóły",
59
140
  "modal.header.pending-assets": "Oczekujące",
60
141
  "modal.header.select-files": "Wybrane pliki",
142
+ "modal.header.go-back": "Wstecz",
143
+ "modal.folder.move.title": "Przenieś elementy do",
61
144
  "modal.nav.browse": "przeglądaj",
62
145
  "modal.nav.computer": "z komputera",
63
146
  "modal.nav.selected": "wybrane",
64
147
  "modal.nav.url": "z linku URL",
65
- "modal.remove.success-label": "Usunięto",
66
- "modal.selected-list.sub-header-subtitle": "Przeciągnij i upuść, aby zmienić kolejność zasobów w polu",
67
- "modal.upload-list.footer.button": "Prześlij",
68
- "modal.upload-list.sub-header-subtitle": "Zarządzaj zasobami przed dodaniem ich do Biblioteki Multimediów",
148
+ "modal.remove.success-label": "Elementy zostały pomyślnie usunięte.",
149
+ "modal.move.success-label": "Elementy zostały pomyślnie przeniesione",
150
+ "modal.selected-list.sub-header-subtitle": "Przeciągnij i upuść, aby zmienić kolejność plików w polu",
151
+ "modal.upload-list.footer.button": "Prześlij pliki do biblioteki",
152
+ "modal.upload-list.sub-header-subtitle": "Zarządzaj plikami przed dodaniem ich do Biblioteki Multimediów",
69
153
  "modal.upload-list.sub-header.button": "Dodaj więcej",
70
154
  "modal.upload.cancelled": "Przesyłanie przerwane.",
71
155
  "page.title": "Ustawienia - Biblioteka Multimediów",
@@ -73,22 +157,33 @@ var pl = {
73
157
  "plugin.description.long": "Zarządzanie plikami multimedialnymi.",
74
158
  "plugin.description.short": "Zarządzanie plikami multimedialnymi.",
75
159
  "plugin.name": "Bilbioteka Multimediów",
160
+ "plugin.home": "Strona główna",
76
161
  "search.clear.label": "Wyczyść",
77
162
  "search.label": "Szukaj",
78
163
  "search.placeholder": "Szukaj...",
79
164
  "settings.blockTitle": "Zarządzanie plikami",
165
+ "settings.form.aiMetadata.label": "Automatycznie generuj podpisy i teksty alternatywne za pomocą sztucznej inteligencji podczas przesyłania!",
166
+ "settings.form.aiMetadata.description": "Włącz tę funkcję, aby zaoszczędzić czas, zoptymalizować SEO i zwiększyć dostępność, pozwalając naszej sztucznej inteligencji generować za Ciebie podpisy i teksty alternatywne.",
167
+ "settings.form.aiMetadata.allAssetsHaveMetadata": "Wszystkie zasoby mają podpisy i teksty alternatywne",
168
+ "settings.form.aiMetadata.imagesWithoutMetadata": "{count, plural, jeden {# obraz nie ma podpisu lub tekstu alternatywnego} other {# obrazy nie mają podpisów lub tekstów alternatywnych}}",
169
+ "settings.form.aiMetadata.generatingMetadata": "AI generuje Twoje metadane",
170
+ "settings.form.aiMetadata.metadataGenerated": "Twoje metadane zostały wygenerowane",
171
+ "settings.form.aiMetadata.generateButton": "Generuj metadane",
172
+ "settings.form.aiMetadata.confirmDialog.title": "Generuj metadane AI",
173
+ "settings.form.aiMetadata.confirmDialog.message": "Spowoduje to uruchomienie procesu w tle w celu wygenerowania podpisów i tekstu alternatywnego dla {count, plural, one {# obrazu} other {# obrazów}}. Sztuczna inteligencja może popełniać błędy, pamiętaj, aby sprawdzić wygenerowaną treść.",
80
174
  "settings.form.autoOrientation.description": "Automatycznie obróć obraz zgodnie ze znacznikiem orientacji EXIF",
81
175
  "settings.form.autoOrientation.label": "Włącz automatyczną orientację",
82
- "settings.form.responsiveDimensions.description": "Automatycznie generuje wiele formatów (duży, średni, mały) przesłanego zasobu",
176
+ "settings.form.responsiveDimensions.description": "Automatycznie generuje wiele formatów (duży, średni, mały) przesłanego pliku",
83
177
  "settings.form.responsiveDimensions.label": "Włącz przesyłanie przyjazne responsywności",
84
178
  "settings.form.sizeOptimization.description": "Włączenie tej opcji zmniejszy rozmiar obrazka i delikatnie zmniejszy jego jakość.",
85
179
  "settings.form.sizeOptimization.label": "Włącz optymalizację rozmiaru (bez utraty jakości)",
86
180
  "settings.form.videoPreview.description": "Wygeneruje sześciosekundowy podgląd wideo (GIF)",
87
181
  "settings.form.videoPreview.label": "Podgląd",
88
182
  "settings.header.label": "Biblioteka Multimediów",
183
+ "settings.section.audio.label": "Audio",
89
184
  "settings.section.doc.label": "Dokument",
90
185
  "settings.section.image.label": "Obraz",
91
- "settings.section.video.label": "Video",
186
+ "settings.section.video.label": "Wideo",
92
187
  "settings.sub-header.label": "Skonfiguruj ustawienia biblioteki multimediów",
93
188
  "sort.created_at_asc": "Najstarsze przesłane",
94
189
  "sort.created_at_desc": "Ostatnio przesłane",
@@ -97,9 +192,35 @@ var pl = {
97
192
  "sort.name_desc": "Odwróć kolejność alfabetyczną (od Z do A)",
98
193
  "sort.updated_at_asc": "Najstarsze aktualizacje",
99
194
  "sort.updated_at_desc": "Ostatnie aktualizacje",
195
+ "list.table.header.actions": "akcje",
196
+ "list.table.header.preview": "podgląd",
197
+ "list.table.header.name": "nazwa",
198
+ "list.table.header.ext": "rozszerzenie",
199
+ "list.table.header.size": "rozmiar",
200
+ "list.table.header.createdAt": "utworzono",
201
+ "list.table.header.updatedAt": "ostatnia modyfikacja",
202
+ "list.table.header.creationDate": "Data utworzenia",
203
+ "list.table.header.lastModified": "Data ostatniej modyfikacji",
204
+ "list.table.header.sort": "Sortuj według {label}",
205
+ "list.table.content.empty-label": "To pole jest puste",
100
206
  "tabs.title": "W jaki sposób chcesz przesłać pliki?",
101
207
  "window.confirm.close-modal.file": "Czy napewno? Twoje zmiany zostaną utracone.",
102
- "window.confirm.close-modal.files": "Czy napewno? Masz pliki, które nie zostały jeszcze przesłane."
208
+ "window.confirm.close-modal.files": "Czy napewno? Masz pliki, które nie zostały jeszcze przesłane.",
209
+ "config.back": "Wstecz",
210
+ "config.subtitle": "Zdefiniuj ustawienia widoku biblioteki multimediów.",
211
+ "config.entries.title": "Wpisy na stronę",
212
+ "config.sort.title": "Domyślna kolejność sortowania",
213
+ "config.entries.note": "Liczba plików wyświetlanych domyślnie w bibliotece multimediów",
214
+ "config.note": "Uwaga: Możesz zmienić tę wartość w bibliotece multimediów.",
215
+ "config.popUpWarning.warning.updateAllSettings": "Spowoduje to modyfikację wszystkich Twoich ustawień",
216
+ "view-switch.list": "Widok listy",
217
+ "view-switch.grid": "Widok siatki",
218
+ "view.switch.label": "View options",
219
+ "view.table": "Widok tabeli",
220
+ "view.grid": "Widokl siatki",
221
+ "ai.modal.uploading.title": "Przesyłanie i przetwarzanie przez AI...",
222
+ "ai.modal.title": "{count, plural, one {# przesłany zasób} other {# przesłanych zasobów}}, sprawdź metadane wygenerowane przez AI",
223
+ "ai.modal.error": "Nie udało się wygenerować metadanych dla przesłanych plików przez AI."
103
224
  };
104
225
 
105
226
  module.exports = pl;
@@ -1 +1 @@
1
- {"version":3,"file":"pl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"pl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,51 @@
1
1
  var pl = {
2
+ "apiError.FileTooBig": "Przesłany plik przekracza maksymalny dozwolony rozmiar pliku.",
3
+ "assets.uploaded": "{number, plural, one {# przesłany zasób} other {# przesłanych zasobów}} pomyślnie",
4
+ "asset-details.title": "Szczegóły pliku",
5
+ "asset-details.description": "Wyświetla informacje o pliku i jego metadane",
6
+ "asset-details.fileInfo": "Informacje o pliku",
7
+ "asset-details.error": "Nie udało się załadować szczegółów pliku.",
8
+ "asset-details.videoNotSupported": "Twoja przeglądarka nie obsługuje tagu video.",
9
+ "asset-details.size": "Rozmiar",
10
+ "asset-details.dimensions": "Wymiary",
11
+ "asset-details.duration": "Czas trwania",
12
+ "asset-details.creationDate": "Data utworzenia",
13
+ "asset-details.lastUpdated": "Ostatnia aktualizacja",
14
+ "asset-details.createdBy": "Utworzone przez",
15
+ "asset-details.extension": "Rozszerzenie",
16
+ "asset-details.assetId": "Identyfikator zasobu",
17
+ "asset-details.fileName": "Nazwa pliku",
18
+ "asset-details.caption": "Podpis",
19
+ "asset-details.alternativeText": "Tekst alternatywny",
20
+ "asset-details.noPreview": "Brak podglądu",
21
+ "upload.generic-error": "Wystąpił błąd podczas przesyłania pliku.",
22
+ "upload.progress": "Postęp przesyłania",
23
+ "upload.progress.description": "Wyświetla postęp i stan przesyłania",
24
+ "upload.progress.failed": "Przesyłanie nie powiodło się",
25
+ "upload.progress.failed.subtitle": "Spróbuj przesłać pliki ponownie",
26
+ "upload.progress.success": "Przesyłanie zakończone sukcesem!",
27
+ "upload.progress.success.subtitle": "{count, plural, one {# plik przesłany pomyślnie} other {# plików przesłane pomyślnie}}",
28
+ "upload.progress.success.subtitle.withErrors": "{successCount} przesłano, {errorCount} nie powiodło się",
29
+ "upload.progress.uploading.withCount": "Przesyłanie {total} elementów ({percentage}%)",
30
+ "upload.progress.uploading-files": "Przesyłanie {count, plural, one {# pliku} other {# plików}}",
31
+ "upload.progress.indicator.in-progress": "Wskaźnik trwającego przesyłania",
32
+ "upload.progress.indicator.complete": "Wskaźnik zakończonego przesyłania",
33
+ "upload.progress.label": "Przesyłanie",
34
+ "upload.progress.errors.title": "Nie udało się przesłać:",
35
+ "upload.progress.cancel": "Anuluj",
36
+ "upload.progress.canceled": "Przesyłanie anulowane",
37
+ "upload.progress.canceled.subtitle": "Niektóre pliki nie zostały przesłane",
38
+ "upload.progress.canceled.subtitle.all": "Przesyłanie wszystkich plików zostało anulowane",
39
+ "upload.progress.retry": "Ponów próbę",
40
+ "upload.progress.file.uploading": "Przesyłanie...",
41
+ "upload.progress.file.canceled": "Anulowano",
42
+ "upload.progress.file.uploaded": "Przesłano",
43
+ "upload.progress.maximize": "Maksymalizuj",
44
+ "upload.progress.minimize": "Minimalizuj",
45
+ "upload.progress.close": "Zamknij",
2
46
  "bulk.select.label": "Wybierz wszystkie",
3
47
  "button.next": "Dalej",
48
+ "new": "Nowy",
4
49
  "checkControl.crop-duplicate": "Duplikuj i przytnij",
5
50
  "checkControl.crop-original": "Przytnij",
6
51
  "content.isLoading": "Ładowanie listy.",
@@ -8,22 +53,42 @@ var pl = {
8
53
  "control-card.cancel": "Anuluj",
9
54
  "control-card.copy-link": "Kopiuj link",
10
55
  "control-card.crop": "Przytnij",
56
+ "control-card.set-focal-point": "Ustaw punkt skupienia",
57
+ "control-card.stop-focal-point": "Anuluj wybór punktu skupienia",
58
+ "control-card.reset-focal-point": "Zresetuj do środka obrazu",
59
+ "control-card.save-focal-point": "Zapisz punkt skupienia",
11
60
  "control-card.download": "Pobierz",
12
61
  "control-card.edit": "Edytuj",
62
+ "control-card.remove-selection": "Usuń z zaznaczenia",
13
63
  "control-card.replace-media": "Zamień",
14
64
  "control-card.save": "Zapisz",
15
65
  "control-card.stop-crop": "Zatrzymaj przycinanie",
66
+ "dropzone.upload.message": "Upuść tutaj, aby przesłać do",
16
67
  "filter.add": "Dodaj filtr",
17
68
  "form.button.replace-media": "Zamień",
18
69
  "form.input.description.file-alt": "Ten tekst zostanie wyświetlony, jeżeli medium nie będzie mogło zostać pokazane.",
19
70
  "form.input.label.file-alt": "Tekst alternatywny",
20
71
  "form.input.label.file-caption": "Podpis",
72
+ "form.input.placeholder.file-caption": "Wpisz podpis",
21
73
  "form.input.label.file-name": "Nazwa pliku",
22
74
  "form.upload-url.error.url.invalid": "Link URL jest niepoprawny",
23
75
  "form.upload-url.error.url.invalids": "{number} linków URL jest niepoprawnych",
24
- "header.actions.add-assets": "Dodaj",
25
- "header.actions.upload-assets": "Prześlij zasób",
26
- "header.content.assets": "{numberFolders, plural, one {1 folder} other {# folders}} - {numberAssets, plural, one {1 zasób} other {# zasobów}}",
76
+ "header.actions.add-assets": "Dodaj pliki",
77
+ "header.actions.add-folder": "Dodaj folder",
78
+ "folder.create.title": "Nowy folder",
79
+ "folder.form.name.label": "Nazwa folderu",
80
+ "folder.create.submit": "Utwórz folder",
81
+ "folder.create.form.error.name-required": "Nazwa jest wymagana",
82
+ "folder.create.form.error.unknown": "Wystąpił błąd podczas tworzenia folderu",
83
+ "folder.create.success": "Folder został utworzony",
84
+ "header.actions.add-assets.folder": "folder",
85
+ "header.actions.upload-assets": "Prześlij pliki",
86
+ "header.actions.upload-new-asset": "Prześlij nowy plik",
87
+ "header.content.assets-empty": "Brak plików",
88
+ "header.content.assets": "{numberFolders, plural, one {1 folder} other {# folderów}} - {numberAssets, plural, one {1 plik} other {# plików}}",
89
+ "header.content.item-count": "{count, plural, =1 {# element} other {# elementów}}",
90
+ "import-files": "Przesyłanie plików",
91
+ "import-from-url": "Przesyłanie plików z adresu URL",
27
92
  "input.button.label": "Przeglądaj pliki",
28
93
  "input.label": "Przeciągnij i upuść tutaj lub",
29
94
  "input.label-bold": "Przeciągnij & upuść",
@@ -32,18 +97,31 @@ var pl = {
32
97
  "input.placeholder.icon": "Upuść tutaj",
33
98
  "input.url.description": "Oddziel swoje linki URL umieszczając je w nowych liniach.",
34
99
  "input.url.label": "URL",
100
+ "input.url.placeholder": "Brak",
101
+ "input.notification.not-supported": "Nie możesz przesłać pliku tego typu, akceptowane są tylko następujące typy – {fileTypes}",
102
+ "list.assets.title": "Pliki ({count})",
35
103
  "list.asset.at.finished": "Załadowano.",
36
104
  "list.assets-empty.search": "Brak wyników wyszukiwania",
37
105
  "list.assets-empty.subtitle": "Dodaj jeden do listy.",
38
- "list.assets-empty.title": "Nie ma jeszcze żadnych zasobów",
39
- "list.assets-empty.title-withSearch": "Brak zasobów pasujących do wybranych filtrów",
40
- "list.assets.empty": "Prześlij pierwszy plik...",
106
+ "list.assets-empty.title": "Nie ma jeszcze żadnych plików",
107
+ "list.assets-empty.title-withSearch": "Brak plików pasujących do wybranych filtrów",
108
+ "list.assets.empty": "Biblioteka Mediów jest pusta",
109
+ "list.assets.empty-upload": "Prześlij pierwszy plik...",
41
110
  "list.assets.empty.no-permissions": "Lista jest pusta.",
111
+ "list.assets.error": "Wystąpił błąd podczas pobierania zasobów.",
112
+ "list.assets.loading-more": "Ładowanie kolejnych zasobów...",
42
113
  "list.assets.loading-asset": "Ładowanie podglądu dla: {path}",
43
114
  "list.assets.not-supported-content": "Podgląd nie jest dostępny",
44
115
  "list.assets.preview-asset": "Podgląd dla video: {path}",
45
- "list.assets.selected": "{number, plural, =0 {No asset} other {# zaznaczono}}",
116
+ "list.assets.selected": "{number, plural, =0 {Brak plików} other {# zaznaczono}}",
117
+ "list-assets-select": "Wybierz plik {name}",
46
118
  "list.assets.type-not-allowed": "Ten typ pliku jest niedozwolony.",
119
+ "list.assets.to-upload": "{number, plural, =0 {Brak plików} one {1 plik gotowy} other {# plików gotowych}} do przesłania",
120
+ "list.folder.edit": "Edytuj folder",
121
+ "list.folder.select": "Wybierz folder {name}",
122
+ "list.folder.subtitle": "{folderCount, plural, =0 {# folderów} one {# folder} other {# foldery}}, {filesCount, plural, =0 {# plików} one {# plik} other {# plików}}",
123
+ "list.folders.title": "Foldery ({count})",
124
+ "list.folders.link-label": "Przejdź do folderu",
47
125
  "mediaLibraryInput.actions.nextSlide": "Następny",
48
126
  "mediaLibraryInput.actions.previousSlide": "Poprzedni",
49
127
  "mediaLibraryInput.placeholder": "Kliknij by dodać plik lub przeciągnij i upuść plik w to miejsce",
@@ -52,18 +130,24 @@ var pl = {
52
130
  "modal.file-details.dimensions": "Wymiary",
53
131
  "modal.file-details.extension": "Rozszerzenia",
54
132
  "modal.file-details.size": "Rozmiar",
133
+ "modal.file-details.id": "ID pliku",
134
+ "modal.file-details.focal-point": "Punkt skupienia",
135
+ "modal.folder.elements.count": "{folderCount} folderów, {assetCount} plików",
55
136
  "modal.header.browse": "Prześlij media",
56
137
  "modal.header.file-detail": "Szczegóły",
57
138
  "modal.header.pending-assets": "Oczekujące",
58
139
  "modal.header.select-files": "Wybrane pliki",
140
+ "modal.header.go-back": "Wstecz",
141
+ "modal.folder.move.title": "Przenieś elementy do",
59
142
  "modal.nav.browse": "przeglądaj",
60
143
  "modal.nav.computer": "z komputera",
61
144
  "modal.nav.selected": "wybrane",
62
145
  "modal.nav.url": "z linku URL",
63
- "modal.remove.success-label": "Usunięto",
64
- "modal.selected-list.sub-header-subtitle": "Przeciągnij i upuść, aby zmienić kolejność zasobów w polu",
65
- "modal.upload-list.footer.button": "Prześlij",
66
- "modal.upload-list.sub-header-subtitle": "Zarządzaj zasobami przed dodaniem ich do Biblioteki Multimediów",
146
+ "modal.remove.success-label": "Elementy zostały pomyślnie usunięte.",
147
+ "modal.move.success-label": "Elementy zostały pomyślnie przeniesione",
148
+ "modal.selected-list.sub-header-subtitle": "Przeciągnij i upuść, aby zmienić kolejność plików w polu",
149
+ "modal.upload-list.footer.button": "Prześlij pliki do biblioteki",
150
+ "modal.upload-list.sub-header-subtitle": "Zarządzaj plikami przed dodaniem ich do Biblioteki Multimediów",
67
151
  "modal.upload-list.sub-header.button": "Dodaj więcej",
68
152
  "modal.upload.cancelled": "Przesyłanie przerwane.",
69
153
  "page.title": "Ustawienia - Biblioteka Multimediów",
@@ -71,22 +155,33 @@ var pl = {
71
155
  "plugin.description.long": "Zarządzanie plikami multimedialnymi.",
72
156
  "plugin.description.short": "Zarządzanie plikami multimedialnymi.",
73
157
  "plugin.name": "Bilbioteka Multimediów",
158
+ "plugin.home": "Strona główna",
74
159
  "search.clear.label": "Wyczyść",
75
160
  "search.label": "Szukaj",
76
161
  "search.placeholder": "Szukaj...",
77
162
  "settings.blockTitle": "Zarządzanie plikami",
163
+ "settings.form.aiMetadata.label": "Automatycznie generuj podpisy i teksty alternatywne za pomocą sztucznej inteligencji podczas przesyłania!",
164
+ "settings.form.aiMetadata.description": "Włącz tę funkcję, aby zaoszczędzić czas, zoptymalizować SEO i zwiększyć dostępność, pozwalając naszej sztucznej inteligencji generować za Ciebie podpisy i teksty alternatywne.",
165
+ "settings.form.aiMetadata.allAssetsHaveMetadata": "Wszystkie zasoby mają podpisy i teksty alternatywne",
166
+ "settings.form.aiMetadata.imagesWithoutMetadata": "{count, plural, jeden {# obraz nie ma podpisu lub tekstu alternatywnego} other {# obrazy nie mają podpisów lub tekstów alternatywnych}}",
167
+ "settings.form.aiMetadata.generatingMetadata": "AI generuje Twoje metadane",
168
+ "settings.form.aiMetadata.metadataGenerated": "Twoje metadane zostały wygenerowane",
169
+ "settings.form.aiMetadata.generateButton": "Generuj metadane",
170
+ "settings.form.aiMetadata.confirmDialog.title": "Generuj metadane AI",
171
+ "settings.form.aiMetadata.confirmDialog.message": "Spowoduje to uruchomienie procesu w tle w celu wygenerowania podpisów i tekstu alternatywnego dla {count, plural, one {# obrazu} other {# obrazów}}. Sztuczna inteligencja może popełniać błędy, pamiętaj, aby sprawdzić wygenerowaną treść.",
78
172
  "settings.form.autoOrientation.description": "Automatycznie obróć obraz zgodnie ze znacznikiem orientacji EXIF",
79
173
  "settings.form.autoOrientation.label": "Włącz automatyczną orientację",
80
- "settings.form.responsiveDimensions.description": "Automatycznie generuje wiele formatów (duży, średni, mały) przesłanego zasobu",
174
+ "settings.form.responsiveDimensions.description": "Automatycznie generuje wiele formatów (duży, średni, mały) przesłanego pliku",
81
175
  "settings.form.responsiveDimensions.label": "Włącz przesyłanie przyjazne responsywności",
82
176
  "settings.form.sizeOptimization.description": "Włączenie tej opcji zmniejszy rozmiar obrazka i delikatnie zmniejszy jego jakość.",
83
177
  "settings.form.sizeOptimization.label": "Włącz optymalizację rozmiaru (bez utraty jakości)",
84
178
  "settings.form.videoPreview.description": "Wygeneruje sześciosekundowy podgląd wideo (GIF)",
85
179
  "settings.form.videoPreview.label": "Podgląd",
86
180
  "settings.header.label": "Biblioteka Multimediów",
181
+ "settings.section.audio.label": "Audio",
87
182
  "settings.section.doc.label": "Dokument",
88
183
  "settings.section.image.label": "Obraz",
89
- "settings.section.video.label": "Video",
184
+ "settings.section.video.label": "Wideo",
90
185
  "settings.sub-header.label": "Skonfiguruj ustawienia biblioteki multimediów",
91
186
  "sort.created_at_asc": "Najstarsze przesłane",
92
187
  "sort.created_at_desc": "Ostatnio przesłane",
@@ -95,9 +190,35 @@ var pl = {
95
190
  "sort.name_desc": "Odwróć kolejność alfabetyczną (od Z do A)",
96
191
  "sort.updated_at_asc": "Najstarsze aktualizacje",
97
192
  "sort.updated_at_desc": "Ostatnie aktualizacje",
193
+ "list.table.header.actions": "akcje",
194
+ "list.table.header.preview": "podgląd",
195
+ "list.table.header.name": "nazwa",
196
+ "list.table.header.ext": "rozszerzenie",
197
+ "list.table.header.size": "rozmiar",
198
+ "list.table.header.createdAt": "utworzono",
199
+ "list.table.header.updatedAt": "ostatnia modyfikacja",
200
+ "list.table.header.creationDate": "Data utworzenia",
201
+ "list.table.header.lastModified": "Data ostatniej modyfikacji",
202
+ "list.table.header.sort": "Sortuj według {label}",
203
+ "list.table.content.empty-label": "To pole jest puste",
98
204
  "tabs.title": "W jaki sposób chcesz przesłać pliki?",
99
205
  "window.confirm.close-modal.file": "Czy napewno? Twoje zmiany zostaną utracone.",
100
- "window.confirm.close-modal.files": "Czy napewno? Masz pliki, które nie zostały jeszcze przesłane."
206
+ "window.confirm.close-modal.files": "Czy napewno? Masz pliki, które nie zostały jeszcze przesłane.",
207
+ "config.back": "Wstecz",
208
+ "config.subtitle": "Zdefiniuj ustawienia widoku biblioteki multimediów.",
209
+ "config.entries.title": "Wpisy na stronę",
210
+ "config.sort.title": "Domyślna kolejność sortowania",
211
+ "config.entries.note": "Liczba plików wyświetlanych domyślnie w bibliotece multimediów",
212
+ "config.note": "Uwaga: Możesz zmienić tę wartość w bibliotece multimediów.",
213
+ "config.popUpWarning.warning.updateAllSettings": "Spowoduje to modyfikację wszystkich Twoich ustawień",
214
+ "view-switch.list": "Widok listy",
215
+ "view-switch.grid": "Widok siatki",
216
+ "view.switch.label": "View options",
217
+ "view.table": "Widok tabeli",
218
+ "view.grid": "Widokl siatki",
219
+ "ai.modal.uploading.title": "Przesyłanie i przetwarzanie przez AI...",
220
+ "ai.modal.title": "{count, plural, one {# przesłany zasób} other {# przesłanych zasobów}}, sprawdź metadane wygenerowane przez AI",
221
+ "ai.modal.error": "Nie udało się wygenerować metadanych dla przesłanych plików przez AI."
101
222
  };
102
223
 
103
224
  export { pl as default };
@@ -1 +1 @@
1
- {"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -85,7 +85,7 @@ var ru = {
85
85
  "modal.remove.success-label": "Элементы были успешно удалены.",
86
86
  "modal.move.success-label": "Элементы были успешно перемещены",
87
87
  "modal.selected-list.sub-header-subtitle": "Перетащите, чтобы изменить порядок ресурсов в поле",
88
- "modal.upload-list.footer.button": "Загрузить {number, plural, one {# ресурс} other {# ресурсов}} в бтиблиотеку",
88
+ "modal.upload-list.footer.button": "Загрузить {number, plural, one {# ресурс} other {# ресурсов}} в библиотеку",
89
89
  "modal.upload-list.sub-header-subtitle": "Управление ресурсами перед добавлением в медиабиблиотеку",
90
90
  "modal.upload-list.sub-header.button": "Добавить ещё ресурсы",
91
91
  "modal.upload.cancelled": "Загрузка вручную прервана.",
@@ -83,7 +83,7 @@ var ru = {
83
83
  "modal.remove.success-label": "Элементы были успешно удалены.",
84
84
  "modal.move.success-label": "Элементы были успешно перемещены",
85
85
  "modal.selected-list.sub-header-subtitle": "Перетащите, чтобы изменить порядок ресурсов в поле",
86
- "modal.upload-list.footer.button": "Загрузить {number, plural, one {# ресурс} other {# ресурсов}} в бтиблиотеку",
86
+ "modal.upload-list.footer.button": "Загрузить {number, plural, one {# ресурс} other {# ресурсов}} в библиотеку",
87
87
  "modal.upload-list.sub-header-subtitle": "Управление ресурсами перед добавлением в медиабиблиотеку",
88
88
  "modal.upload-list.sub-header.button": "Добавить ещё ресурсы",
89
89
  "modal.upload.cancelled": "Загрузка вручную прервана.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upload",
3
- "version": "5.42.0",
3
+ "version": "5.42.1",
4
4
  "description": "Makes it easy to upload images and files to your Strapi Application.",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -73,11 +73,11 @@
73
73
  "@radix-ui/react-dialog": "1.0.5",
74
74
  "@radix-ui/react-toggle-group": "1.1.11",
75
75
  "@reduxjs/toolkit": "1.9.7",
76
- "@strapi/database": "5.42.0",
76
+ "@strapi/database": "5.42.1",
77
77
  "@strapi/design-system": "2.2.0",
78
78
  "@strapi/icons": "2.2.0",
79
- "@strapi/provider-upload-local": "5.42.0",
80
- "@strapi/utils": "5.42.0",
79
+ "@strapi/provider-upload-local": "5.42.1",
80
+ "@strapi/utils": "5.42.1",
81
81
  "byte-size": "8.1.1",
82
82
  "cropperjs": "1.6.1",
83
83
  "date-fns": "2.30.0",
@@ -87,7 +87,7 @@
87
87
  "immer": "9.0.21",
88
88
  "koa-range": "0.3.0",
89
89
  "koa-static": "5.0.0",
90
- "lodash": "4.17.23",
90
+ "lodash": "4.18.1",
91
91
  "mime-types": "2.1.35",
92
92
  "prop-types": "^15.8.1",
93
93
  "qs": "6.15.0",
@@ -101,8 +101,8 @@
101
101
  "zod": "3.25.67"
102
102
  },
103
103
  "devDependencies": {
104
- "@strapi/admin": "5.42.0",
105
- "@strapi/types": "5.42.0",
104
+ "@strapi/admin": "5.42.1",
105
+ "@strapi/types": "5.42.1",
106
106
  "@testing-library/dom": "10.4.1",
107
107
  "@testing-library/react": "16.3.0",
108
108
  "@testing-library/user-event": "14.6.1",