@strapi/upload 5.52.1 → 5.52.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/future/components/UploadProgressDialog.js +36 -1
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +37 -2
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/hooks/useApiErrorMessage.js +61 -0
- package/dist/admin/future/hooks/useApiErrorMessage.js.map +1 -0
- package/dist/admin/future/hooks/useApiErrorMessage.mjs +39 -0
- package/dist/admin/future/hooks/useApiErrorMessage.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +4 -5
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +4 -5
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +41 -50
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +41 -50
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +10 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +10 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +3 -2
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +3 -2
- package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +4 -2
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +4 -2
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js +30 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +26 -0
- package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -0
- package/dist/admin/future/services/api.js +116 -11
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +118 -13
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.js +9 -3
- package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
- package/dist/admin/future/services/uploadFileViaXHR.mjs +9 -3
- package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +44 -5
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +43 -6
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/future/utils/getApiErrorMessage.js +20 -0
- package/dist/admin/future/utils/getApiErrorMessage.js.map +1 -0
- package/dist/admin/future/utils/getApiErrorMessage.mjs +18 -0
- package/dist/admin/future/utils/getApiErrorMessage.mjs.map +1 -0
- package/dist/admin/src/future/hooks/useApiErrorMessage.d.ts +17 -0
- package/dist/admin/src/future/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +18 -0
- package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +6 -1
- package/dist/admin/src/future/store/uploadProgress.d.ts +16 -1
- package/dist/admin/src/future/utils/getApiErrorMessage.d.ts +1 -0
- package/dist/admin/translations/ca.json.js +1 -1
- package/dist/admin/translations/ca.json.mjs +1 -1
- package/dist/admin/translations/de.json.js +1 -1
- package/dist/admin/translations/de.json.mjs +1 -1
- package/dist/admin/translations/en.json.js +2 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +2 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/fr.json.js +1 -1
- package/dist/admin/translations/fr.json.mjs +1 -1
- package/dist/admin/translations/ja.json.js +1 -1
- package/dist/admin/translations/ja.json.mjs +1 -1
- package/dist/admin/translations/ko.json.js +1 -1
- package/dist/admin/translations/ko.json.mjs +1 -1
- package/dist/admin/translations/nl.json.js +1 -1
- package/dist/admin/translations/nl.json.mjs +1 -1
- package/dist/admin/translations/pl.json.js +1 -1
- package/dist/admin/translations/pl.json.mjs +1 -1
- package/dist/admin/translations/pt-BR.json.js +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +1 -1
- package/dist/admin/translations/ru.json.js +1 -1
- package/dist/admin/translations/ru.json.mjs +1 -1
- package/dist/admin/translations/sk.json.js +1 -1
- package/dist/admin/translations/sk.json.mjs +1 -1
- package/dist/admin/translations/tr.json.js +1 -1
- package/dist/admin/translations/tr.json.mjs +1 -1
- package/dist/admin/translations/uk.json.js +1 -1
- package/dist/admin/translations/uk.json.mjs +1 -1
- package/dist/admin/translations/zh-Hans.json.js +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +1 -1
- package/dist/admin/translations/zh.json.js +1 -1
- package/dist/admin/translations/zh.json.mjs +1 -1
- package/dist/server/services/ai-metadata.js +25 -5
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +1 -1
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/upload.js +4 -0
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +4 -0
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/admin/future/utils/getBulkMoveErrorMessage.js +0 -23
- package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +0 -1
- package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +0 -21
- package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +0 -1
- package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +0 -1
|
@@ -8,6 +8,7 @@ import { styled } from 'styled-components';
|
|
|
8
8
|
import { ASSET_TYPES } from '../../../../../enums.mjs';
|
|
9
9
|
import { Drawer } from '../../../../components/Drawer.mjs';
|
|
10
10
|
import { useAIMetadataEnabled } from '../../../../hooks/useAIMetadataEnabled.mjs';
|
|
11
|
+
import { useApiErrorMessage } from '../../../../hooks/useApiErrorMessage.mjs';
|
|
11
12
|
import { useMediaLibraryPermissions } from '../../../../hooks/useMediaLibraryPermissions.mjs';
|
|
12
13
|
import { useTracking, MEDIA_LIBRARY_LOCATION } from '../../../../hooks/useTracking.mjs';
|
|
13
14
|
import { useUploadFileSilentlyMutation } from '../../../../services/api.mjs';
|
|
@@ -18,12 +19,11 @@ import { formatBytes, getFileExtension, prefixFileUrlWithBackendUrl } from '../.
|
|
|
18
19
|
import { getAssetIcon } from '../../../../utils/getAssetIcon.mjs';
|
|
19
20
|
import { getTranslationKey } from '../../../../utils/translations.mjs';
|
|
20
21
|
import { useFolderInfo } from '../../hooks/useFolderInfo.mjs';
|
|
22
|
+
import { parseAssetDetailsId, ASSET_DETAILS_URL_PARAM } from '../../hooks/useIsAssetDetailsOpen.mjs';
|
|
21
23
|
import { BusyOverlay } from '../BusyOverlay.mjs';
|
|
22
24
|
import { AssetCropEditor } from './AssetCropEditor.mjs';
|
|
23
25
|
import { AssetPreview } from './AssetPreview.mjs';
|
|
24
26
|
|
|
25
|
-
// Name of the parameter to look for in the URL to open the drawer
|
|
26
|
-
const URL_PARAM = 'assetId';
|
|
27
27
|
const DrawerNotifyContext = /*#__PURE__*/ React.createContext(null);
|
|
28
28
|
const useDrawerNotify = ()=>{
|
|
29
29
|
const ctx = React.useContext(DrawerNotifyContext);
|
|
@@ -41,12 +41,11 @@ const useAssetOperation = ()=>{
|
|
|
41
41
|
return ctx;
|
|
42
42
|
};
|
|
43
43
|
/* -------------------------------------------------------------------------------------------------
|
|
44
|
-
* useAssetDetailsParam - sync drawer visibility with URL ?{
|
|
44
|
+
* useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}
|
|
45
45
|
* -----------------------------------------------------------------------------------------------*/ const useAssetDetailsParam = ()=>{
|
|
46
46
|
const [{ query }, setQuery] = useQueryParams();
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
const hasValidId = assetId !== null && !Number.isNaN(assetId);
|
|
47
|
+
const assetId = parseAssetDetailsId(query?.[ASSET_DETAILS_URL_PARAM]);
|
|
48
|
+
const hasValidId = assetId !== null;
|
|
50
49
|
// Closing is driven by removing the URL param (a navigation), so navigation
|
|
51
50
|
// guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the
|
|
52
51
|
// tree through the slide-out: it stays true once opened and only flips false
|
|
@@ -73,14 +72,14 @@ const useAssetOperation = ()=>{
|
|
|
73
72
|
]);
|
|
74
73
|
const openDetails = React.useCallback((id)=>{
|
|
75
74
|
setQuery({
|
|
76
|
-
[
|
|
75
|
+
[ASSET_DETAILS_URL_PARAM]: String(id)
|
|
77
76
|
}, 'push', true);
|
|
78
77
|
}, [
|
|
79
78
|
setQuery
|
|
80
79
|
]);
|
|
81
80
|
const closeDetails = React.useCallback(()=>{
|
|
82
81
|
setQuery({
|
|
83
|
-
[
|
|
82
|
+
[ASSET_DETAILS_URL_PARAM]: undefined
|
|
84
83
|
}, 'remove', true);
|
|
85
84
|
}, [
|
|
86
85
|
setQuery
|
|
@@ -286,7 +285,6 @@ const LocationField = ({ label, rootLabel, folders, disabled })=>{
|
|
|
286
285
|
children: [
|
|
287
286
|
/*#__PURE__*/ jsx(Dialog.Trigger, {
|
|
288
287
|
children: /*#__PURE__*/ jsx(IconButton, {
|
|
289
|
-
withTooltip: false,
|
|
290
288
|
label: triggerLabel,
|
|
291
289
|
variant: "danger-light",
|
|
292
290
|
children: /*#__PURE__*/ jsx(Trash, {})
|
|
@@ -364,7 +362,6 @@ const CopyLinkButton = ({ asset })=>{
|
|
|
364
362
|
});
|
|
365
363
|
};
|
|
366
364
|
return /*#__PURE__*/ jsx(IconButton, {
|
|
367
|
-
withTooltip: false,
|
|
368
365
|
label: formatMessage({
|
|
369
366
|
id: getTranslationKey('asset-details.copy-link.trigger'),
|
|
370
367
|
defaultMessage: 'Copy link'
|
|
@@ -397,7 +394,6 @@ const DownloadAssetButton = ({ asset })=>{
|
|
|
397
394
|
}
|
|
398
395
|
};
|
|
399
396
|
return /*#__PURE__*/ jsx(IconButton, {
|
|
400
|
-
withTooltip: false,
|
|
401
397
|
label: formatMessage({
|
|
402
398
|
id: getTranslationKey('asset-details.download.trigger'),
|
|
403
399
|
defaultMessage: 'Download'
|
|
@@ -441,6 +437,7 @@ const ReplaceAssetButton = ({ mime })=>{
|
|
|
441
437
|
children: /*#__PURE__*/ jsx("input", {
|
|
442
438
|
ref: fileInputRef,
|
|
443
439
|
type: "file",
|
|
440
|
+
accept: mime ?? '',
|
|
444
441
|
multiple: false,
|
|
445
442
|
onChange: handleFileChange,
|
|
446
443
|
"aria-hidden": true,
|
|
@@ -448,7 +445,6 @@ const ReplaceAssetButton = ({ mime })=>{
|
|
|
448
445
|
})
|
|
449
446
|
}),
|
|
450
447
|
/*#__PURE__*/ jsx(IconButton, {
|
|
451
|
-
withTooltip: false,
|
|
452
448
|
label: formatMessage({
|
|
453
449
|
id: getTranslationKey('asset-details.replace.trigger'),
|
|
454
450
|
defaultMessage: 'Replace this file'
|
|
@@ -523,32 +519,27 @@ const ReplaceAssetButton = ({ mime })=>{
|
|
|
523
519
|
]
|
|
524
520
|
});
|
|
525
521
|
};
|
|
526
|
-
const AssetImageActions = ({ onCrop
|
|
522
|
+
const AssetImageActions = ({ onCrop })=>{
|
|
527
523
|
const { formatMessage } = useIntl();
|
|
528
524
|
const isSubmitting = useForm('AssetImageActions', (state)=>state.isSubmitting);
|
|
529
|
-
return /*#__PURE__*/
|
|
525
|
+
return /*#__PURE__*/ jsx(Flex, {
|
|
530
526
|
direction: "column",
|
|
531
527
|
gap: 2,
|
|
532
|
-
children:
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
id: getTranslationKey('asset-details.crop.trigger'),
|
|
537
|
-
defaultMessage: 'Crop'
|
|
538
|
-
}),
|
|
539
|
-
variant: "tertiary",
|
|
540
|
-
onClick: onCrop,
|
|
541
|
-
disabled: isSubmitting || !onCrop,
|
|
542
|
-
children: /*#__PURE__*/ jsx(Crop, {})
|
|
528
|
+
children: /*#__PURE__*/ jsx(IconButton, {
|
|
529
|
+
label: formatMessage({
|
|
530
|
+
id: getTranslationKey('asset-details.crop.trigger'),
|
|
531
|
+
defaultMessage: 'Crop'
|
|
543
532
|
}),
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
533
|
+
variant: "tertiary",
|
|
534
|
+
onClick: onCrop,
|
|
535
|
+
disabled: isSubmitting || !onCrop,
|
|
536
|
+
children: /*#__PURE__*/ jsx(Crop, {})
|
|
537
|
+
})
|
|
548
538
|
});
|
|
549
539
|
};
|
|
550
540
|
const AssetDetails = ({ asset, closeDetails })=>{
|
|
551
541
|
const { formatMessage, formatDate } = useIntl();
|
|
542
|
+
const getErrorMessage = useApiErrorMessage();
|
|
552
543
|
const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions();
|
|
553
544
|
const { data: folders = [] } = useGetAllFoldersQuery();
|
|
554
545
|
const { toggleNotification } = useNotification();
|
|
@@ -591,10 +582,10 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
591
582
|
if ('error' in res) {
|
|
592
583
|
notify({
|
|
593
584
|
type: 'danger',
|
|
594
|
-
message: formatMessage({
|
|
585
|
+
message: getErrorMessage(res.error, formatMessage({
|
|
595
586
|
id: getTranslationKey('asset-details.update.error'),
|
|
596
587
|
defaultMessage: 'Failed to update the file.'
|
|
597
|
-
})
|
|
588
|
+
}))
|
|
598
589
|
});
|
|
599
590
|
return;
|
|
600
591
|
}
|
|
@@ -620,14 +611,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
620
611
|
file
|
|
621
612
|
});
|
|
622
613
|
if ('error' in res) {
|
|
623
|
-
const error = res.error;
|
|
624
|
-
const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
|
|
625
|
-
id: getTranslationKey('asset-details.replace.error'),
|
|
626
|
-
defaultMessage: 'Failed to replace the file.'
|
|
627
|
-
});
|
|
628
614
|
notify({
|
|
629
615
|
type: 'danger',
|
|
630
|
-
message
|
|
616
|
+
message: getErrorMessage(res.error, formatMessage({
|
|
617
|
+
id: getTranslationKey('asset-details.replace.error'),
|
|
618
|
+
defaultMessage: 'Failed to replace the file.'
|
|
619
|
+
}))
|
|
631
620
|
});
|
|
632
621
|
return;
|
|
633
622
|
}
|
|
@@ -644,6 +633,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
644
633
|
}, [
|
|
645
634
|
asset.id,
|
|
646
635
|
formatMessage,
|
|
636
|
+
getErrorMessage,
|
|
647
637
|
notify,
|
|
648
638
|
replaceMutation,
|
|
649
639
|
trackUsage
|
|
@@ -653,14 +643,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
653
643
|
const handleDelete = React.useCallback(async ()=>{
|
|
654
644
|
const res = await deleteMutation(asset.id);
|
|
655
645
|
if ('error' in res) {
|
|
656
|
-
const error = res.error;
|
|
657
|
-
const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
|
|
658
|
-
id: getTranslationKey('asset-details.delete.error'),
|
|
659
|
-
defaultMessage: 'Failed to delete the asset.'
|
|
660
|
-
});
|
|
661
646
|
notify({
|
|
662
647
|
type: 'danger',
|
|
663
|
-
message
|
|
648
|
+
message: getErrorMessage(res.error, formatMessage({
|
|
649
|
+
id: getTranslationKey('asset-details.delete.error'),
|
|
650
|
+
defaultMessage: 'Failed to delete the asset.'
|
|
651
|
+
}))
|
|
664
652
|
});
|
|
665
653
|
return;
|
|
666
654
|
}
|
|
@@ -680,16 +668,17 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
680
668
|
deleteMutation,
|
|
681
669
|
folderName,
|
|
682
670
|
formatMessage,
|
|
671
|
+
getErrorMessage,
|
|
683
672
|
notify,
|
|
684
673
|
toggleNotification
|
|
685
674
|
]);
|
|
686
|
-
const notifyCropError = ()=>{
|
|
675
|
+
const notifyCropError = (error)=>{
|
|
687
676
|
notify({
|
|
688
677
|
type: 'danger',
|
|
689
|
-
message: formatMessage({
|
|
678
|
+
message: getErrorMessage(error, formatMessage({
|
|
690
679
|
id: getTranslationKey('asset-details.crop.error'),
|
|
691
680
|
defaultMessage: 'Failed to crop the file.'
|
|
692
|
-
})
|
|
681
|
+
}))
|
|
693
682
|
});
|
|
694
683
|
};
|
|
695
684
|
// Apply: replace the original binary with the cropped file + focal point.
|
|
@@ -705,7 +694,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
705
694
|
}
|
|
706
695
|
});
|
|
707
696
|
if ('error' in res) {
|
|
708
|
-
notifyCropError();
|
|
697
|
+
notifyCropError(res.error);
|
|
709
698
|
return;
|
|
710
699
|
}
|
|
711
700
|
trackUsage('didCropFile', {
|
|
@@ -736,7 +725,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
736
725
|
}
|
|
737
726
|
});
|
|
738
727
|
if ('error' in res) {
|
|
739
|
-
notifyCropError();
|
|
728
|
+
notifyCropError(res.error);
|
|
740
729
|
return;
|
|
741
730
|
}
|
|
742
731
|
trackUsage('didCropFile', {
|
|
@@ -811,8 +800,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
811
800
|
/*#__PURE__*/ jsx(AssetPreview, {
|
|
812
801
|
asset: asset,
|
|
813
802
|
actions: isImage && canUpdate ? /*#__PURE__*/ jsx(AssetImageActions, {
|
|
814
|
-
onCrop: ()=>setIsCropOpen(true)
|
|
815
|
-
mime: asset.mime
|
|
803
|
+
onCrop: ()=>setIsCropOpen(true)
|
|
816
804
|
}) : null
|
|
817
805
|
}),
|
|
818
806
|
/*#__PURE__*/ jsxs(Flex, {
|
|
@@ -965,6 +953,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
|
|
|
965
953
|
}),
|
|
966
954
|
canDownload && /*#__PURE__*/ jsx(DownloadAssetButton, {
|
|
967
955
|
asset: asset
|
|
956
|
+
}),
|
|
957
|
+
canUpdate && /*#__PURE__*/ jsx(ReplaceAssetButton, {
|
|
958
|
+
mime: asset.mime
|
|
968
959
|
})
|
|
969
960
|
]
|
|
970
961
|
}),
|