@strapi/upload 5.16.0 → 5.17.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,9 @@ var React = require('react');
5
5
  var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var designSystem = require('@strapi/design-system');
7
7
  var icons = require('@strapi/icons');
8
+ var cropperjscss = require('cropperjs/dist/cropper.css?raw');
8
9
  var reactIntl = require('react-intl');
10
+ var styledComponents = require('styled-components');
9
11
  var constants = require('../../../constants.js');
10
12
  var useCropImg = require('../../../hooks/useCropImg.js');
11
13
  var useEditAsset = require('../../../hooks/useEditAsset.js');
@@ -23,7 +25,6 @@ var RemoveAssetDialog = require('../RemoveAssetDialog.js');
23
25
  var AssetPreview = require('./AssetPreview.js');
24
26
  var CroppingActions = require('./CroppingActions.js');
25
27
  var PreviewComponents = require('./PreviewComponents.js');
26
- require('cropperjs/dist/cropper.css');
27
28
 
28
29
  function _interopNamespaceDefault(e) {
29
30
  var n = Object.create(null);
@@ -46,6 +47,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
46
47
 
47
48
  // TODO: find a better naming convention for the file that was an index file before
48
49
  const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCropFinish, onCropStart, onCropCancel, replacementFile, trackedLocation })=>{
50
+ const CropperjsStyle = styledComponents.createGlobalStyle`${cropperjscss}`;
49
51
  const { trackUsage } = strapiAdmin.useTracking();
50
52
  const previewRef = React__namespace.useRef(null);
51
53
  const [isCropImageReady, setIsCropImageReady] = React__namespace.useState(false);
@@ -155,6 +157,7 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
155
157
  };
156
158
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
157
159
  children: [
160
+ /*#__PURE__*/ jsxRuntime.jsx(CropperjsStyle, {}),
158
161
  /*#__PURE__*/ jsxRuntime.jsxs(PreviewComponents.RelativeBox, {
159
162
  hasRadius: true,
160
163
  background: "neutral150",
@@ -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 { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { AssetType } from '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\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 {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } from '../../../../../shared/contracts/files';\n\nimport 'cropperjs/dist/cropper.css';\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}\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}: PreviewBoxProps) => {\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\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 return (\n <>\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 <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 </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 <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 />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","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","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","_jsxs","_Fragment","RelativeBox","hasRadius","background","borderColor","_jsx","CroppingActions","onValidate","onDuplicate","undefined","onCancel","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","Wrapper","UploadProgressWrapper","UploadProgress","AssetPreview","ref","onLoad","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose"],"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 { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } 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 '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\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 {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } 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}\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}: 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\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 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 <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 </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 <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 />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","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","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","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","Wrapper","UploadProgressWrapper","UploadProgress","AssetPreview","ref","onLoad","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose"],"mappings":"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"}
@@ -3,7 +3,9 @@ import * as React from 'react';
3
3
  import { useTracking } from '@strapi/admin/strapi-admin';
4
4
  import { Flex, IconButton } from '@strapi/design-system';
5
5
  import { Trash, Download, Crop } from '@strapi/icons';
6
+ import cropperjscss from 'cropperjs/dist/cropper.css?raw';
6
7
  import { useIntl } from 'react-intl';
8
+ import { createGlobalStyle } from 'styled-components';
7
9
  import { AssetType } from '../../../constants.mjs';
8
10
  import { useCropImg } from '../../../hooks/useCropImg.mjs';
9
11
  import { useEditAsset } from '../../../hooks/useEditAsset.mjs';
@@ -21,10 +23,10 @@ import { RemoveAssetDialog } from '../RemoveAssetDialog.mjs';
21
23
  import { AssetPreview } from './AssetPreview.mjs';
22
24
  import { CroppingActions } from './CroppingActions.mjs';
23
25
  import { RelativeBox, ActionRow, Wrapper, UploadProgressWrapper, BadgeOverride } from './PreviewComponents.mjs';
24
- import 'cropperjs/dist/cropper.css';
25
26
 
26
27
  // TODO: find a better naming convention for the file that was an index file before
27
28
  const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCropFinish, onCropStart, onCropCancel, replacementFile, trackedLocation })=>{
29
+ const CropperjsStyle = createGlobalStyle`${cropperjscss}`;
28
30
  const { trackUsage } = useTracking();
29
31
  const previewRef = React.useRef(null);
30
32
  const [isCropImageReady, setIsCropImageReady] = React.useState(false);
@@ -134,6 +136,7 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
134
136
  };
135
137
  return /*#__PURE__*/ jsxs(Fragment, {
136
138
  children: [
139
+ /*#__PURE__*/ jsx(CropperjsStyle, {}),
137
140
  /*#__PURE__*/ jsxs(RelativeBox, {
138
141
  hasRadius: true,
139
142
  background: "neutral150",
@@ -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 { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { AssetType } from '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\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 {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } from '../../../../../shared/contracts/files';\n\nimport 'cropperjs/dist/cropper.css';\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}\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}: PreviewBoxProps) => {\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\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 return (\n <>\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 <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 </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 <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 />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","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","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","_jsxs","_Fragment","RelativeBox","hasRadius","background","borderColor","_jsx","CroppingActions","onValidate","onDuplicate","undefined","onCancel","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","Wrapper","UploadProgressWrapper","UploadProgress","AssetPreview","ref","onLoad","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose"],"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 { useTracking } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash } 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 '../../../constants';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\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 {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n} from './PreviewComponents';\n\nimport type { File as FileDefinition, RawFile } 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}\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}: 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\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 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 <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 </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 <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 />\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={() => {\n setShowConfirmDialog(false);\n onDelete(null);\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","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","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","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","Wrapper","UploadProgressWrapper","UploadProgress","AssetPreview","ref","onLoad","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/upload";
6
- var version = "5.15.1";
6
+ var version = "5.16.0";
7
7
  var description = "Makes it easy to upload images and files to your Strapi Application.";
8
8
  var license = "SEE LICENSE IN LICENSE";
9
9
  var author = {
@@ -66,8 +66,8 @@ var dependencies = {
66
66
  "@mux/mux-player-react": "3.1.0",
67
67
  "@strapi/design-system": "2.0.0-rc.26",
68
68
  "@strapi/icons": "2.0.0-rc.26",
69
- "@strapi/provider-upload-local": "5.15.1",
70
- "@strapi/utils": "5.15.1",
69
+ "@strapi/provider-upload-local": "5.16.0",
70
+ "@strapi/utils": "5.16.0",
71
71
  "byte-size": "8.1.1",
72
72
  cropperjs: "1.6.1",
73
73
  "date-fns": "2.30.0",
@@ -89,8 +89,8 @@ var dependencies = {
89
89
  yup: "0.32.9"
90
90
  };
91
91
  var devDependencies = {
92
- "@strapi/admin": "5.15.1",
93
- "@strapi/types": "5.15.1",
92
+ "@strapi/admin": "5.16.0",
93
+ "@strapi/types": "5.16.0",
94
94
  "@testing-library/dom": "10.1.0",
95
95
  "@testing-library/react": "15.0.7",
96
96
  "@testing-library/user-event": "14.5.2",
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/upload";
2
- var version = "5.15.1";
2
+ var version = "5.16.0";
3
3
  var description = "Makes it easy to upload images and files to your Strapi Application.";
4
4
  var license = "SEE LICENSE IN LICENSE";
5
5
  var author = {
@@ -62,8 +62,8 @@ var dependencies = {
62
62
  "@mux/mux-player-react": "3.1.0",
63
63
  "@strapi/design-system": "2.0.0-rc.26",
64
64
  "@strapi/icons": "2.0.0-rc.26",
65
- "@strapi/provider-upload-local": "5.15.1",
66
- "@strapi/utils": "5.15.1",
65
+ "@strapi/provider-upload-local": "5.16.0",
66
+ "@strapi/utils": "5.16.0",
67
67
  "byte-size": "8.1.1",
68
68
  cropperjs: "1.6.1",
69
69
  "date-fns": "2.30.0",
@@ -85,8 +85,8 @@ var dependencies = {
85
85
  yup: "0.32.9"
86
86
  };
87
87
  var devDependencies = {
88
- "@strapi/admin": "5.15.1",
89
- "@strapi/types": "5.15.1",
88
+ "@strapi/admin": "5.16.0",
89
+ "@strapi/types": "5.16.0",
90
90
  "@testing-library/dom": "10.1.0",
91
91
  "@testing-library/react": "15.0.7",
92
92
  "@testing-library/user-event": "14.5.2",
@@ -1,5 +1,4 @@
1
1
  import type { File as FileDefinition, RawFile } from '../../../../../shared/contracts/files';
2
- import 'cropperjs/dist/cropper.css';
3
2
  interface Asset extends Omit<FileDefinition, 'folder'> {
4
3
  isLocal?: boolean;
5
4
  rawFile?: RawFile;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/upload",
3
- "version": "5.16.0",
3
+ "version": "5.17.0-beta.0",
4
4
  "description": "Makes it easy to upload images and files to your Strapi Application.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
@@ -63,8 +63,8 @@
63
63
  "@mux/mux-player-react": "3.1.0",
64
64
  "@strapi/design-system": "2.0.0-rc.26",
65
65
  "@strapi/icons": "2.0.0-rc.26",
66
- "@strapi/provider-upload-local": "5.16.0",
67
- "@strapi/utils": "5.16.0",
66
+ "@strapi/provider-upload-local": "5.17.0-beta.0",
67
+ "@strapi/utils": "5.17.0-beta.0",
68
68
  "byte-size": "8.1.1",
69
69
  "cropperjs": "1.6.1",
70
70
  "date-fns": "2.30.0",
@@ -86,8 +86,8 @@
86
86
  "yup": "0.32.9"
87
87
  },
88
88
  "devDependencies": {
89
- "@strapi/admin": "5.16.0",
90
- "@strapi/types": "5.16.0",
89
+ "@strapi/admin": "5.17.0-beta.0",
90
+ "@strapi/types": "5.17.0-beta.0",
91
91
  "@testing-library/dom": "10.1.0",
92
92
  "@testing-library/react": "15.0.7",
93
93
  "@testing-library/user-event": "14.5.2",