@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.
Files changed (102) hide show
  1. package/dist/admin/future/components/UploadProgressDialog.js +36 -1
  2. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  3. package/dist/admin/future/components/UploadProgressDialog.mjs +37 -2
  4. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  5. package/dist/admin/future/hooks/useApiErrorMessage.js +61 -0
  6. package/dist/admin/future/hooks/useApiErrorMessage.js.map +1 -0
  7. package/dist/admin/future/hooks/useApiErrorMessage.mjs +39 -0
  8. package/dist/admin/future/hooks/useApiErrorMessage.mjs.map +1 -0
  9. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +4 -5
  10. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
  11. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +4 -5
  12. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
  13. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +41 -50
  14. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  15. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +41 -50
  16. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  17. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +10 -1
  18. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  19. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +10 -1
  20. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  21. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +3 -2
  22. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  23. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +3 -2
  24. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +4 -2
  26. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +4 -2
  28. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js +30 -0
  30. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.js.map +1 -0
  31. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs +26 -0
  32. package/dist/admin/future/pages/Assets/hooks/useIsAssetDetailsOpen.mjs.map +1 -0
  33. package/dist/admin/future/services/api.js +116 -11
  34. package/dist/admin/future/services/api.js.map +1 -1
  35. package/dist/admin/future/services/api.mjs +118 -13
  36. package/dist/admin/future/services/api.mjs.map +1 -1
  37. package/dist/admin/future/services/uploadFileViaXHR.js +9 -3
  38. package/dist/admin/future/services/uploadFileViaXHR.js.map +1 -1
  39. package/dist/admin/future/services/uploadFileViaXHR.mjs +9 -3
  40. package/dist/admin/future/services/uploadFileViaXHR.mjs.map +1 -1
  41. package/dist/admin/future/store/uploadProgress.js +44 -5
  42. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  43. package/dist/admin/future/store/uploadProgress.mjs +43 -6
  44. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  45. package/dist/admin/future/utils/getApiErrorMessage.js +20 -0
  46. package/dist/admin/future/utils/getApiErrorMessage.js.map +1 -0
  47. package/dist/admin/future/utils/getApiErrorMessage.mjs +18 -0
  48. package/dist/admin/future/utils/getApiErrorMessage.mjs.map +1 -0
  49. package/dist/admin/src/future/hooks/useApiErrorMessage.d.ts +17 -0
  50. package/dist/admin/src/future/pages/Assets/hooks/useIsAssetDetailsOpen.d.ts +18 -0
  51. package/dist/admin/src/future/services/uploadFileViaXHR.d.ts +6 -1
  52. package/dist/admin/src/future/store/uploadProgress.d.ts +16 -1
  53. package/dist/admin/src/future/utils/getApiErrorMessage.d.ts +1 -0
  54. package/dist/admin/translations/ca.json.js +1 -1
  55. package/dist/admin/translations/ca.json.mjs +1 -1
  56. package/dist/admin/translations/de.json.js +1 -1
  57. package/dist/admin/translations/de.json.mjs +1 -1
  58. package/dist/admin/translations/en.json.js +2 -1
  59. package/dist/admin/translations/en.json.js.map +1 -1
  60. package/dist/admin/translations/en.json.mjs +2 -1
  61. package/dist/admin/translations/en.json.mjs.map +1 -1
  62. package/dist/admin/translations/es.json.js +1 -1
  63. package/dist/admin/translations/es.json.mjs +1 -1
  64. package/dist/admin/translations/fr.json.js +1 -1
  65. package/dist/admin/translations/fr.json.mjs +1 -1
  66. package/dist/admin/translations/ja.json.js +1 -1
  67. package/dist/admin/translations/ja.json.mjs +1 -1
  68. package/dist/admin/translations/ko.json.js +1 -1
  69. package/dist/admin/translations/ko.json.mjs +1 -1
  70. package/dist/admin/translations/nl.json.js +1 -1
  71. package/dist/admin/translations/nl.json.mjs +1 -1
  72. package/dist/admin/translations/pl.json.js +1 -1
  73. package/dist/admin/translations/pl.json.mjs +1 -1
  74. package/dist/admin/translations/pt-BR.json.js +1 -1
  75. package/dist/admin/translations/pt-BR.json.mjs +1 -1
  76. package/dist/admin/translations/ru.json.js +1 -1
  77. package/dist/admin/translations/ru.json.mjs +1 -1
  78. package/dist/admin/translations/sk.json.js +1 -1
  79. package/dist/admin/translations/sk.json.mjs +1 -1
  80. package/dist/admin/translations/tr.json.js +1 -1
  81. package/dist/admin/translations/tr.json.mjs +1 -1
  82. package/dist/admin/translations/uk.json.js +1 -1
  83. package/dist/admin/translations/uk.json.mjs +1 -1
  84. package/dist/admin/translations/zh-Hans.json.js +1 -1
  85. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  86. package/dist/admin/translations/zh.json.js +1 -1
  87. package/dist/admin/translations/zh.json.mjs +1 -1
  88. package/dist/server/services/ai-metadata.js +25 -5
  89. package/dist/server/services/ai-metadata.js.map +1 -1
  90. package/dist/server/services/ai-metadata.mjs +1 -1
  91. package/dist/server/services/ai-metadata.mjs.map +1 -1
  92. package/dist/server/services/upload.js +4 -0
  93. package/dist/server/services/upload.js.map +1 -1
  94. package/dist/server/services/upload.mjs +4 -0
  95. package/dist/server/services/upload.mjs.map +1 -1
  96. package/dist/server/src/services/upload.d.ts.map +1 -1
  97. package/package.json +7 -7
  98. package/dist/admin/future/utils/getBulkMoveErrorMessage.js +0 -23
  99. package/dist/admin/future/utils/getBulkMoveErrorMessage.js.map +0 -1
  100. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs +0 -21
  101. package/dist/admin/future/utils/getBulkMoveErrorMessage.mjs.map +0 -1
  102. package/dist/admin/src/future/utils/getBulkMoveErrorMessage.d.ts +0 -1
@@ -10,6 +10,7 @@ var styledComponents = require('styled-components');
10
10
  var enums = require('../../../../../enums.js');
11
11
  var Drawer = require('../../../../components/Drawer.js');
12
12
  var useAIMetadataEnabled = require('../../../../hooks/useAIMetadataEnabled.js');
13
+ var useApiErrorMessage = require('../../../../hooks/useApiErrorMessage.js');
13
14
  var useMediaLibraryPermissions = require('../../../../hooks/useMediaLibraryPermissions.js');
14
15
  var useTracking = require('../../../../hooks/useTracking.js');
15
16
  var api = require('../../../../services/api.js');
@@ -20,6 +21,7 @@ var files = require('../../../../utils/files.js');
20
21
  var getAssetIcon = require('../../../../utils/getAssetIcon.js');
21
22
  var translations = require('../../../../utils/translations.js');
22
23
  var useFolderInfo = require('../../hooks/useFolderInfo.js');
24
+ var useIsAssetDetailsOpen = require('../../hooks/useIsAssetDetailsOpen.js');
23
25
  var BusyOverlay = require('../BusyOverlay.js');
24
26
  var AssetCropEditor = require('./AssetCropEditor.js');
25
27
  var AssetPreview = require('./AssetPreview.js');
@@ -44,8 +46,6 @@ function _interopNamespace(e) {
44
46
 
45
47
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
46
48
 
47
- // Name of the parameter to look for in the URL to open the drawer
48
- const URL_PARAM = 'assetId';
49
49
  const DrawerNotifyContext = /*#__PURE__*/ React__namespace.createContext(null);
50
50
  const useDrawerNotify = ()=>{
51
51
  const ctx = React__namespace.useContext(DrawerNotifyContext);
@@ -63,12 +63,11 @@ const useAssetOperation = ()=>{
63
63
  return ctx;
64
64
  };
65
65
  /* -------------------------------------------------------------------------------------------------
66
- * useAssetDetailsParam - sync drawer visibility with URL ?{URL_PARAM}={id}
66
+ * useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}
67
67
  * -----------------------------------------------------------------------------------------------*/ const useAssetDetailsParam = ()=>{
68
68
  const [{ query }, setQuery] = strapiAdmin.useQueryParams();
69
- const detailsId = query?.[URL_PARAM];
70
- const assetId = detailsId ? parseInt(detailsId, 10) : null;
71
- const hasValidId = assetId !== null && !Number.isNaN(assetId);
69
+ const assetId = useIsAssetDetailsOpen.parseAssetDetailsId(query?.[useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]);
70
+ const hasValidId = assetId !== null;
72
71
  // Closing is driven by removing the URL param (a navigation), so navigation
73
72
  // guards like <Blocker> can intercept it. `isMounted` keeps the drawer in the
74
73
  // tree through the slide-out: it stays true once opened and only flips false
@@ -95,14 +94,14 @@ const useAssetOperation = ()=>{
95
94
  ]);
96
95
  const openDetails = React__namespace.useCallback((id)=>{
97
96
  setQuery({
98
- [URL_PARAM]: String(id)
97
+ [useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]: String(id)
99
98
  }, 'push', true);
100
99
  }, [
101
100
  setQuery
102
101
  ]);
103
102
  const closeDetails = React__namespace.useCallback(()=>{
104
103
  setQuery({
105
- [URL_PARAM]: undefined
104
+ [useIsAssetDetailsOpen.ASSET_DETAILS_URL_PARAM]: undefined
106
105
  }, 'remove', true);
107
106
  }, [
108
107
  setQuery
@@ -308,7 +307,6 @@ const LocationField = ({ label, rootLabel, folders, disabled })=>{
308
307
  children: [
309
308
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Trigger, {
310
309
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
311
- withTooltip: false,
312
310
  label: triggerLabel,
313
311
  variant: "danger-light",
314
312
  children: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {})
@@ -386,7 +384,6 @@ const CopyLinkButton = ({ asset })=>{
386
384
  });
387
385
  };
388
386
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
389
- withTooltip: false,
390
387
  label: formatMessage({
391
388
  id: translations.getTranslationKey('asset-details.copy-link.trigger'),
392
389
  defaultMessage: 'Copy link'
@@ -419,7 +416,6 @@ const DownloadAssetButton = ({ asset })=>{
419
416
  }
420
417
  };
421
418
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
422
- withTooltip: false,
423
419
  label: formatMessage({
424
420
  id: translations.getTranslationKey('asset-details.download.trigger'),
425
421
  defaultMessage: 'Download'
@@ -463,6 +459,7 @@ const ReplaceAssetButton = ({ mime })=>{
463
459
  children: /*#__PURE__*/ jsxRuntime.jsx("input", {
464
460
  ref: fileInputRef,
465
461
  type: "file",
462
+ accept: mime ?? '',
466
463
  multiple: false,
467
464
  onChange: handleFileChange,
468
465
  "aria-hidden": true,
@@ -470,7 +467,6 @@ const ReplaceAssetButton = ({ mime })=>{
470
467
  })
471
468
  }),
472
469
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
473
- withTooltip: false,
474
470
  label: formatMessage({
475
471
  id: translations.getTranslationKey('asset-details.replace.trigger'),
476
472
  defaultMessage: 'Replace this file'
@@ -545,32 +541,27 @@ const ReplaceAssetButton = ({ mime })=>{
545
541
  ]
546
542
  });
547
543
  };
548
- const AssetImageActions = ({ onCrop, mime })=>{
544
+ const AssetImageActions = ({ onCrop })=>{
549
545
  const { formatMessage } = reactIntl.useIntl();
550
546
  const isSubmitting = strapiAdmin.useForm('AssetImageActions', (state)=>state.isSubmitting);
551
- return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
547
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
552
548
  direction: "column",
553
549
  gap: 2,
554
- children: [
555
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
556
- withTooltip: false,
557
- label: formatMessage({
558
- id: translations.getTranslationKey('asset-details.crop.trigger'),
559
- defaultMessage: 'Crop'
560
- }),
561
- variant: "tertiary",
562
- onClick: onCrop,
563
- disabled: isSubmitting || !onCrop,
564
- children: /*#__PURE__*/ jsxRuntime.jsx(icons.Crop, {})
550
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
551
+ label: formatMessage({
552
+ id: translations.getTranslationKey('asset-details.crop.trigger'),
553
+ defaultMessage: 'Crop'
565
554
  }),
566
- /*#__PURE__*/ jsxRuntime.jsx(ReplaceAssetButton, {
567
- mime: mime
568
- })
569
- ]
555
+ variant: "tertiary",
556
+ onClick: onCrop,
557
+ disabled: isSubmitting || !onCrop,
558
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Crop, {})
559
+ })
570
560
  });
571
561
  };
572
562
  const AssetDetails = ({ asset, closeDetails })=>{
573
563
  const { formatMessage, formatDate } = reactIntl.useIntl();
564
+ const getErrorMessage = useApiErrorMessage.useApiErrorMessage();
574
565
  const { canCreate, canUpdate, canDownload, canCopyLink } = useMediaLibraryPermissions.useMediaLibraryPermissions();
575
566
  const { data: folders$1 = [] } = folders.useGetAllFoldersQuery();
576
567
  const { toggleNotification } = strapiAdmin.useNotification();
@@ -613,10 +604,10 @@ const AssetDetails = ({ asset, closeDetails })=>{
613
604
  if ('error' in res) {
614
605
  notify({
615
606
  type: 'danger',
616
- message: formatMessage({
607
+ message: getErrorMessage(res.error, formatMessage({
617
608
  id: translations.getTranslationKey('asset-details.update.error'),
618
609
  defaultMessage: 'Failed to update the file.'
619
- })
610
+ }))
620
611
  });
621
612
  return;
622
613
  }
@@ -642,14 +633,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
642
633
  file
643
634
  });
644
635
  if ('error' in res) {
645
- const error = res.error;
646
- const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
647
- id: translations.getTranslationKey('asset-details.replace.error'),
648
- defaultMessage: 'Failed to replace the file.'
649
- });
650
636
  notify({
651
637
  type: 'danger',
652
- message
638
+ message: getErrorMessage(res.error, formatMessage({
639
+ id: translations.getTranslationKey('asset-details.replace.error'),
640
+ defaultMessage: 'Failed to replace the file.'
641
+ }))
653
642
  });
654
643
  return;
655
644
  }
@@ -666,6 +655,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
666
655
  }, [
667
656
  asset.id,
668
657
  formatMessage,
658
+ getErrorMessage,
669
659
  notify,
670
660
  replaceMutation,
671
661
  trackUsage
@@ -675,14 +665,12 @@ const AssetDetails = ({ asset, closeDetails })=>{
675
665
  const handleDelete = React__namespace.useCallback(async ()=>{
676
666
  const res = await deleteMutation(asset.id);
677
667
  if ('error' in res) {
678
- const error = res.error;
679
- const message = error?.data?.error?.message ?? error?.data?.message ?? formatMessage({
680
- id: translations.getTranslationKey('asset-details.delete.error'),
681
- defaultMessage: 'Failed to delete the asset.'
682
- });
683
668
  notify({
684
669
  type: 'danger',
685
- message
670
+ message: getErrorMessage(res.error, formatMessage({
671
+ id: translations.getTranslationKey('asset-details.delete.error'),
672
+ defaultMessage: 'Failed to delete the asset.'
673
+ }))
686
674
  });
687
675
  return;
688
676
  }
@@ -702,16 +690,17 @@ const AssetDetails = ({ asset, closeDetails })=>{
702
690
  deleteMutation,
703
691
  folderName,
704
692
  formatMessage,
693
+ getErrorMessage,
705
694
  notify,
706
695
  toggleNotification
707
696
  ]);
708
- const notifyCropError = ()=>{
697
+ const notifyCropError = (error)=>{
709
698
  notify({
710
699
  type: 'danger',
711
- message: formatMessage({
700
+ message: getErrorMessage(error, formatMessage({
712
701
  id: translations.getTranslationKey('asset-details.crop.error'),
713
702
  defaultMessage: 'Failed to crop the file.'
714
- })
703
+ }))
715
704
  });
716
705
  };
717
706
  // Apply: replace the original binary with the cropped file + focal point.
@@ -727,7 +716,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
727
716
  }
728
717
  });
729
718
  if ('error' in res) {
730
- notifyCropError();
719
+ notifyCropError(res.error);
731
720
  return;
732
721
  }
733
722
  trackUsage('didCropFile', {
@@ -758,7 +747,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
758
747
  }
759
748
  });
760
749
  if ('error' in res) {
761
- notifyCropError();
750
+ notifyCropError(res.error);
762
751
  return;
763
752
  }
764
753
  trackUsage('didCropFile', {
@@ -833,8 +822,7 @@ const AssetDetails = ({ asset, closeDetails })=>{
833
822
  /*#__PURE__*/ jsxRuntime.jsx(AssetPreview.AssetPreview, {
834
823
  asset: asset,
835
824
  actions: isImage && canUpdate ? /*#__PURE__*/ jsxRuntime.jsx(AssetImageActions, {
836
- onCrop: ()=>setIsCropOpen(true),
837
- mime: asset.mime
825
+ onCrop: ()=>setIsCropOpen(true)
838
826
  }) : null
839
827
  }),
840
828
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
@@ -987,6 +975,9 @@ const AssetDetails = ({ asset, closeDetails })=>{
987
975
  }),
988
976
  canDownload && /*#__PURE__*/ jsxRuntime.jsx(DownloadAssetButton, {
989
977
  asset: asset
978
+ }),
979
+ canUpdate && /*#__PURE__*/ jsxRuntime.jsx(ReplaceAssetButton, {
980
+ mime: asset.mime
990
981
  })
991
982
  ]
992
983
  }),