@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
@@ -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 ?{URL_PARAM}={id}
44
+ * useAssetDetailsParam - sync drawer visibility with URL ?{ASSET_DETAILS_URL_PARAM}={id}
45
45
  * -----------------------------------------------------------------------------------------------*/ const useAssetDetailsParam = ()=>{
46
46
  const [{ query }, setQuery] = useQueryParams();
47
- const detailsId = query?.[URL_PARAM];
48
- const assetId = detailsId ? parseInt(detailsId, 10) : null;
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
- [URL_PARAM]: String(id)
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
- [URL_PARAM]: undefined
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, mime })=>{
522
+ const AssetImageActions = ({ onCrop })=>{
527
523
  const { formatMessage } = useIntl();
528
524
  const isSubmitting = useForm('AssetImageActions', (state)=>state.isSubmitting);
529
- return /*#__PURE__*/ jsxs(Flex, {
525
+ return /*#__PURE__*/ jsx(Flex, {
530
526
  direction: "column",
531
527
  gap: 2,
532
- children: [
533
- /*#__PURE__*/ jsx(IconButton, {
534
- withTooltip: false,
535
- label: formatMessage({
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
- /*#__PURE__*/ jsx(ReplaceAssetButton, {
545
- mime: mime
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
  }),