@strapi/upload 5.56.0 → 5.58.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.
- package/dist/admin/hooks/useTracking.js +2 -8
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +3 -8
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js +9 -1
- package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.js.map +1 -1
- package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs +9 -1
- package/dist/admin/legacy/components/AssetCard/UploadingAssetCard.mjs.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js +20 -6
- package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +20 -6
- package/dist/admin/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/legacy/hooks/useEditAsset.js +11 -6
- package/dist/admin/legacy/hooks/useEditAsset.js.map +1 -1
- package/dist/admin/legacy/hooks/useEditAsset.mjs +12 -7
- package/dist/admin/legacy/hooks/useEditAsset.mjs.map +1 -1
- package/dist/admin/legacy/hooks/useTracking.js +3 -1
- package/dist/admin/legacy/hooks/useTracking.js.map +1 -1
- package/dist/admin/legacy/hooks/useTracking.mjs +3 -1
- package/dist/admin/legacy/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/legacy/hooks/useUpload.js +6 -4
- package/dist/admin/legacy/hooks/useUpload.js.map +1 -1
- package/dist/admin/legacy/hooks/useUpload.mjs +6 -4
- package/dist/admin/legacy/hooks/useUpload.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs +2 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.js +2 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.js.map +1 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs +2 -1
- package/dist/admin/legacy/pages/App/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +24 -12
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +25 -13
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActions.js +326 -0
- package/dist/admin/pages/Assets/components/AssetActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs +324 -0
- package/dist/admin/pages/Assets/components/AssetActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js +28 -309
- package/dist/admin/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs +31 -312
- package/dist/admin/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetContextMenu.js +79 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs +77 -0
- package/dist/admin/pages/Assets/components/AssetContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js +87 -5
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +89 -7
- package/dist/admin/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +3 -3
- package/dist/admin/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js +62 -5
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs +60 -6
- package/dist/admin/pages/Assets/components/AssetDetails/useCropImg.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +27 -4
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js +77 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs +75 -0
- package/dist/admin/pages/Assets/components/CursorAnchoredMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActions.js +139 -0
- package/dist/admin/pages/Assets/components/FolderActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs +137 -0
- package/dist/admin/pages/Assets/components/FolderActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js +25 -119
- package/dist/admin/pages/Assets/components/FolderActionsMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs +27 -121
- package/dist/admin/pages/Assets/components/FolderActionsMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderContextMenu.js +67 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs +65 -0
- package/dist/admin/pages/Assets/components/FolderContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +139 -45
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +140 -47
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js +115 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs +113 -0
- package/dist/admin/pages/Assets/components/FolderTree/FolderTreeRowMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js +125 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs +122 -0
- package/dist/admin/pages/Assets/components/ItemContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.js.map +1 -1
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs +88 -63
- package/dist/admin/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/SelectionActions.js +111 -0
- package/dist/admin/pages/Assets/components/SelectionActions.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs +109 -0
- package/dist/admin/pages/Assets/components/SelectionActions.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js +82 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.js.map +1 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs +80 -0
- package/dist/admin/pages/Assets/components/SelectionContextMenu.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +10 -0
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +8 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +8 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/src/hooks/useTracking.d.ts +0 -7
- package/dist/admin/src/legacy/hooks/useEditAsset.d.ts +13 -22
- package/dist/admin/src/legacy/hooks/useUpload.d.ts +1 -1
- package/dist/admin/src/pages/Assets/components/AssetActions.d.ts +70 -0
- package/dist/admin/src/pages/Assets/components/AssetActionsMenu.d.ts +5 -14
- package/dist/admin/src/pages/Assets/components/AssetContextMenu.d.ts +27 -0
- package/dist/admin/src/pages/Assets/components/AssetDetails/useCropImg.d.ts +16 -0
- package/dist/admin/src/pages/Assets/components/CursorAnchoredMenu.d.ts +32 -0
- package/dist/admin/src/pages/Assets/components/FolderActions.d.ts +48 -0
- package/dist/admin/src/pages/Assets/components/FolderActionsMenu.d.ts +4 -8
- package/dist/admin/src/pages/Assets/components/FolderContextMenu.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +5 -1
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTreeRowMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/components/ItemContextMenu.d.ts +53 -0
- package/dist/admin/src/pages/Assets/components/MainAreaContextMenu.d.ts +15 -1
- package/dist/admin/src/pages/Assets/components/SelectionActions.d.ts +40 -0
- package/dist/admin/src/pages/Assets/components/SelectionContextMenu.d.ts +25 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +5 -0
- package/dist/admin/src/utils/mediaLibraryVersion.d.ts +18 -0
- package/dist/admin/translations/en.json.js +8 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +8 -3
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/mediaLibraryVersion.js +24 -0
- package/dist/admin/utils/mediaLibraryVersion.js.map +1 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs +20 -0
- package/dist/admin/utils/mediaLibraryVersion.mjs.map +1 -0
- package/dist/server/controllers/admin-file.js +2 -2
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +2 -2
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-folder.js +5 -5
- package/dist/server/controllers/admin-folder.js.map +1 -1
- package/dist/server/controllers/admin-folder.mjs +5 -5
- package/dist/server/controllers/admin-folder.mjs.map +1 -1
- package/dist/server/controllers/content-api.js +30 -7
- package/dist/server/controllers/content-api.js.map +1 -1
- package/dist/server/controllers/content-api.mjs +30 -7
- package/dist/server/controllers/content-api.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.js +4 -4
- package/dist/server/controllers/validation/admin/folder-file.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder-file.mjs +2 -2
- package/dist/server/controllers/validation/admin/folder-file.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/folder.js +3 -4
- package/dist/server/controllers/validation/admin/folder.js.map +1 -1
- package/dist/server/controllers/validation/admin/folder.mjs +3 -4
- package/dist/server/controllers/validation/admin/folder.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js +1 -2
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs +1 -2
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/utils.js +1 -2
- package/dist/server/controllers/validation/admin/utils.js.map +1 -1
- package/dist/server/controllers/validation/admin/utils.mjs +1 -2
- package/dist/server/controllers/validation/admin/utils.mjs.map +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js +2 -2
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.js.map +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs +1 -1
- package/dist/server/migrations/unsign-richtext-and-blocks-urls.mjs.map +1 -1
- package/dist/server/routes/content-api.js +3 -3
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +3 -3
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/routes/validation/upload.js +8 -0
- package/dist/server/routes/validation/upload.js.map +1 -1
- package/dist/server/routes/validation/upload.mjs +8 -0
- package/dist/server/routes/validation/upload.mjs.map +1 -1
- package/dist/server/services/api-upload-folder.js +3 -3
- package/dist/server/services/api-upload-folder.js.map +1 -1
- package/dist/server/services/api-upload-folder.mjs +3 -3
- package/dist/server/services/api-upload-folder.mjs.map +1 -1
- package/dist/server/services/extensions/utils.js +20 -16
- package/dist/server/services/extensions/utils.js.map +1 -1
- package/dist/server/services/extensions/utils.mjs +20 -16
- package/dist/server/services/extensions/utils.mjs.map +1 -1
- package/dist/server/services/file.js +2 -2
- package/dist/server/services/file.js.map +1 -1
- package/dist/server/services/file.mjs +1 -1
- package/dist/server/services/file.mjs.map +1 -1
- package/dist/server/services/folder.js +5 -5
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs +5 -5
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/provider.js +3 -4
- package/dist/server/services/provider.js.map +1 -1
- package/dist/server/services/provider.mjs +3 -4
- package/dist/server/services/provider.mjs.map +1 -1
- package/dist/server/services/upload.js +5 -6
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +4 -5
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +2 -2
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +2 -2
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/controllers/admin-folder.d.ts.map +1 -1
- package/dist/server/src/controllers/content-api.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/folder.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/routes/validation/upload.d.ts +4 -0
- package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +34 -2
- package/dist/server/src/services/extensions/utils.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/provider.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/utils/mime-validation.js +1 -1
- package/dist/server/utils/mime-validation.js.map +1 -1
- package/dist/server/utils/mime-validation.mjs +1 -1
- package/dist/server/utils/mime-validation.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -3,14 +3,9 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
5
|
var settings = require('../services/settings.js');
|
|
6
|
+
var mediaLibraryVersion = require('../utils/mediaLibraryVersion.js');
|
|
6
7
|
var useAIMetadataAvailability = require('./useAIMetadataAvailability.js');
|
|
7
8
|
|
|
8
|
-
/**
|
|
9
|
-
* Media Library version tag stamped on every event fired from the current
|
|
10
|
-
* Media Library. Events from `legacy/` omit it, so analytics can filter new
|
|
11
|
-
* usage from the old plan while both trees emit the SAME event names. Bump
|
|
12
|
-
* this if a future revamp ever needs its own bucket.
|
|
13
|
-
*/ const MEDIA_LIBRARY_VERSION = 'v2';
|
|
14
9
|
/**
|
|
15
10
|
* `location` value for every new Media Library event. The new tree is the
|
|
16
11
|
* standalone Media Library page, which the legacy plan tags `'upload'` (as
|
|
@@ -39,7 +34,7 @@ var useAIMetadataAvailability = require('./useAIMetadataAvailability.js');
|
|
|
39
34
|
...isAiAvailable ? {
|
|
40
35
|
isAiMediaLibraryConfigured: Boolean(data?.data?.aiMetadata)
|
|
41
36
|
} : {},
|
|
42
|
-
mediaLibraryVersion:
|
|
37
|
+
mediaLibraryVersion: mediaLibraryVersion.getMediaLibraryVersion()
|
|
43
38
|
});
|
|
44
39
|
}, [
|
|
45
40
|
trackStrapiUsage,
|
|
@@ -52,6 +47,5 @@ var useAIMetadataAvailability = require('./useAIMetadataAvailability.js');
|
|
|
52
47
|
};
|
|
53
48
|
|
|
54
49
|
exports.MEDIA_LIBRARY_LOCATION = MEDIA_LIBRARY_LOCATION;
|
|
55
|
-
exports.MEDIA_LIBRARY_VERSION = MEDIA_LIBRARY_VERSION;
|
|
56
50
|
exports.useTracking = useTracking;
|
|
57
51
|
//# sourceMappingURL=useTracking.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTracking.js","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking as useStrapiTracking, type TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useGetUploadSettingsQuery } from '../services/settings';\
|
|
1
|
+
{"version":3,"file":"useTracking.js","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking as useStrapiTracking, type TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useGetUploadSettingsQuery } from '../services/settings';\nimport { getMediaLibraryVersion } from '../utils/mediaLibraryVersion';\n\nimport { useAIMetadataAvailability } from './useAIMetadataAvailability';\n\n/**\n * `location` value for every new Media Library event. The new tree is the\n * standalone Media Library page, which the legacy plan tags `'upload'` (as\n * opposed to `'content-manager'` for the asset-picker modal). Kept identical so\n * migrated events line up with the legacy ones on the `location` axis.\n */\nexport const MEDIA_LIBRARY_LOCATION = 'upload';\n\n/**\n * Tracking wrapper scoped to the new Media Library. Mirrors the legacy\n * `admin/src/hooks/useTracking` — it forwards to the admin `trackUsage` and\n * injects `isAiMediaLibraryConfigured` when AI is available — and additionally\n * stamps `mediaLibraryVersion` on every event so the migrated plan stays\n * distinguishable from the legacy one.\n *\n * The cast mirrors the legacy wrapper: these two properties are cross-cutting\n * media-tracking metadata that the admin `TrackingEvent` type does not (and\n * should not) enumerate per event.\n */\nexport const useTracking = () => {\n const { trackUsage: trackStrapiUsage } = useStrapiTracking();\n const { data } = useGetUploadSettingsQuery();\n const isAiAvailable = useAIMetadataAvailability();\n\n // Memoised so consumers can safely list `trackUsage` in effect deps (the\n // search-input debounce commit does) without re-firing every render.\n const trackUsage = useCallback(\n <TEvent extends TrackingEvent>(event: TEvent['name'], properties?: TEvent['properties']) => {\n return trackStrapiUsage(event, {\n ...properties,\n ...(isAiAvailable ? { isAiMediaLibraryConfigured: Boolean(data?.data?.aiMetadata) } : {}),\n mediaLibraryVersion: getMediaLibraryVersion(),\n } as TEvent['properties']);\n },\n [trackStrapiUsage, isAiAvailable, data]\n );\n\n return { trackUsage };\n};\n"],"names":["MEDIA_LIBRARY_LOCATION","useTracking","trackUsage","trackStrapiUsage","useStrapiTracking","data","useGetUploadSettingsQuery","isAiAvailable","useAIMetadataAvailability","useCallback","event","properties","isAiMediaLibraryConfigured","Boolean","aiMetadata","mediaLibraryVersion","getMediaLibraryVersion"],"mappings":";;;;;;;;AASA;;;;;IAMO,MAAMA,sBAAAA,GAAyB;AAEtC;;;;;;;;;;UAWaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAM,EAAEC,UAAAA,EAAYC,gBAAgB,EAAE,GAAGC,uBAAAA,EAAAA;IACzC,MAAM,EAAEC,IAAI,EAAE,GAAGC,kCAAAA,EAAAA;AACjB,IAAA,MAAMC,aAAAA,GAAgBC,mDAAAA,EAAAA;;;IAItB,MAAMN,UAAAA,GAAaO,iBAAAA,CACjB,CAA+BC,KAAAA,EAAuBC,UAAAA,GAAAA;AACpD,QAAA,OAAOR,iBAAiBO,KAAAA,EAAO;AAC7B,YAAA,GAAGC,UAAU;AACb,YAAA,GAAIJ,aAAAA,GAAgB;gBAAEK,0BAAAA,EAA4BC,OAAAA,CAAQR,MAAMA,IAAAA,EAAMS,UAAAA;AAAY,aAAA,GAAI,EAAE;YACxFC,mBAAAA,EAAqBC,0CAAAA;AACvB,SAAA,CAAA;IACF,CAAA,EACA;AAACb,QAAAA,gBAAAA;AAAkBI,QAAAA,aAAAA;AAAeF,QAAAA;AAAK,KAAA,CAAA;IAGzC,OAAO;AAAEH,QAAAA;AAAW,KAAA;AACtB;;;;;"}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
import { useTracking as useTracking$1 } from '@strapi/admin/strapi-admin';
|
|
3
3
|
import { useGetUploadSettingsQuery } from '../services/settings.mjs';
|
|
4
|
+
import { getMediaLibraryVersion } from '../utils/mediaLibraryVersion.mjs';
|
|
4
5
|
import { useAIMetadataAvailability } from './useAIMetadataAvailability.mjs';
|
|
5
6
|
|
|
6
|
-
/**
|
|
7
|
-
* Media Library version tag stamped on every event fired from the current
|
|
8
|
-
* Media Library. Events from `legacy/` omit it, so analytics can filter new
|
|
9
|
-
* usage from the old plan while both trees emit the SAME event names. Bump
|
|
10
|
-
* this if a future revamp ever needs its own bucket.
|
|
11
|
-
*/ const MEDIA_LIBRARY_VERSION = 'v2';
|
|
12
7
|
/**
|
|
13
8
|
* `location` value for every new Media Library event. The new tree is the
|
|
14
9
|
* standalone Media Library page, which the legacy plan tags `'upload'` (as
|
|
@@ -37,7 +32,7 @@ import { useAIMetadataAvailability } from './useAIMetadataAvailability.mjs';
|
|
|
37
32
|
...isAiAvailable ? {
|
|
38
33
|
isAiMediaLibraryConfigured: Boolean(data?.data?.aiMetadata)
|
|
39
34
|
} : {},
|
|
40
|
-
mediaLibraryVersion:
|
|
35
|
+
mediaLibraryVersion: getMediaLibraryVersion()
|
|
41
36
|
});
|
|
42
37
|
}, [
|
|
43
38
|
trackStrapiUsage,
|
|
@@ -49,5 +44,5 @@ import { useAIMetadataAvailability } from './useAIMetadataAvailability.mjs';
|
|
|
49
44
|
};
|
|
50
45
|
};
|
|
51
46
|
|
|
52
|
-
export { MEDIA_LIBRARY_LOCATION,
|
|
47
|
+
export { MEDIA_LIBRARY_LOCATION, useTracking };
|
|
53
48
|
//# sourceMappingURL=useTracking.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTracking.mjs","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking as useStrapiTracking, type TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useGetUploadSettingsQuery } from '../services/settings';\
|
|
1
|
+
{"version":3,"file":"useTracking.mjs","sources":["../../../admin/src/hooks/useTracking.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useTracking as useStrapiTracking, type TrackingEvent } from '@strapi/admin/strapi-admin';\n\nimport { useGetUploadSettingsQuery } from '../services/settings';\nimport { getMediaLibraryVersion } from '../utils/mediaLibraryVersion';\n\nimport { useAIMetadataAvailability } from './useAIMetadataAvailability';\n\n/**\n * `location` value for every new Media Library event. The new tree is the\n * standalone Media Library page, which the legacy plan tags `'upload'` (as\n * opposed to `'content-manager'` for the asset-picker modal). Kept identical so\n * migrated events line up with the legacy ones on the `location` axis.\n */\nexport const MEDIA_LIBRARY_LOCATION = 'upload';\n\n/**\n * Tracking wrapper scoped to the new Media Library. Mirrors the legacy\n * `admin/src/hooks/useTracking` — it forwards to the admin `trackUsage` and\n * injects `isAiMediaLibraryConfigured` when AI is available — and additionally\n * stamps `mediaLibraryVersion` on every event so the migrated plan stays\n * distinguishable from the legacy one.\n *\n * The cast mirrors the legacy wrapper: these two properties are cross-cutting\n * media-tracking metadata that the admin `TrackingEvent` type does not (and\n * should not) enumerate per event.\n */\nexport const useTracking = () => {\n const { trackUsage: trackStrapiUsage } = useStrapiTracking();\n const { data } = useGetUploadSettingsQuery();\n const isAiAvailable = useAIMetadataAvailability();\n\n // Memoised so consumers can safely list `trackUsage` in effect deps (the\n // search-input debounce commit does) without re-firing every render.\n const trackUsage = useCallback(\n <TEvent extends TrackingEvent>(event: TEvent['name'], properties?: TEvent['properties']) => {\n return trackStrapiUsage(event, {\n ...properties,\n ...(isAiAvailable ? { isAiMediaLibraryConfigured: Boolean(data?.data?.aiMetadata) } : {}),\n mediaLibraryVersion: getMediaLibraryVersion(),\n } as TEvent['properties']);\n },\n [trackStrapiUsage, isAiAvailable, data]\n );\n\n return { trackUsage };\n};\n"],"names":["MEDIA_LIBRARY_LOCATION","useTracking","trackUsage","trackStrapiUsage","useStrapiTracking","data","useGetUploadSettingsQuery","isAiAvailable","useAIMetadataAvailability","useCallback","event","properties","isAiMediaLibraryConfigured","Boolean","aiMetadata","mediaLibraryVersion","getMediaLibraryVersion"],"mappings":";;;;;;AASA;;;;;IAMO,MAAMA,sBAAAA,GAAyB;AAEtC;;;;;;;;;;UAWaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAM,EAAEC,UAAAA,EAAYC,gBAAgB,EAAE,GAAGC,aAAAA,EAAAA;IACzC,MAAM,EAAEC,IAAI,EAAE,GAAGC,yBAAAA,EAAAA;AACjB,IAAA,MAAMC,aAAAA,GAAgBC,yBAAAA,EAAAA;;;IAItB,MAAMN,UAAAA,GAAaO,WAAAA,CACjB,CAA+BC,KAAAA,EAAuBC,UAAAA,GAAAA;AACpD,QAAA,OAAOR,iBAAiBO,KAAAA,EAAO;AAC7B,YAAA,GAAGC,UAAU;AACb,YAAA,GAAIJ,aAAAA,GAAgB;gBAAEK,0BAAAA,EAA4BC,OAAAA,CAAQR,MAAMA,IAAAA,EAAMS,UAAAA;AAAY,aAAA,GAAI,EAAE;YACxFC,mBAAAA,EAAqBC,sBAAAA;AACvB,SAAA,CAAA;IACF,CAAA,EACA;AAACb,QAAAA,gBAAAA;AAAkBI,QAAAA,aAAAA;AAAeF,QAAAA;AAAK,KAAA,CAAA;IAGzC,OAAO;AAAEH,QAAAA;AAAW,KAAA;AACtB;;;;"}
|
|
@@ -6,6 +6,7 @@ var designSystem = require('@strapi/design-system');
|
|
|
6
6
|
var reactIntl = require('react-intl');
|
|
7
7
|
var styledComponents = require('styled-components');
|
|
8
8
|
var enums = require('../../../enums.js');
|
|
9
|
+
var uploadFileViaXHR = require('../../../services/uploadFileViaXHR.js');
|
|
9
10
|
var useUpload = require('../../hooks/useUpload.js');
|
|
10
11
|
require('byte-size');
|
|
11
12
|
require('date-fns');
|
|
@@ -67,7 +68,14 @@ const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles,
|
|
|
67
68
|
}
|
|
68
69
|
React__namespace.useEffect(()=>{
|
|
69
70
|
const uploadFile = async ()=>{
|
|
70
|
-
|
|
71
|
+
let files;
|
|
72
|
+
try {
|
|
73
|
+
files = await upload(asset, folderId ? Number(folderId) : null);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// The user cancelled the upload: nothing to report.
|
|
76
|
+
if (error instanceof uploadFileViaXHR.UploadAbortedError) return;
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
71
79
|
if (addUploadedFiles) {
|
|
72
80
|
addUploadedFiles(files);
|
|
73
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadingAssetCard.js","sources":["../../../../../admin/src/legacy/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType, ASSET_TYPES } from '../../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === ASSET_TYPES.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === ASSET_TYPES.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === ASSET_TYPES.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n
|
|
1
|
+
{"version":3,"file":"UploadingAssetCard.js","sources":["../../../../../admin/src/legacy/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType, ASSET_TYPES } from '../../../enums';\nimport { UploadAbortedError } from '../../../services/uploadFileViaXHR';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === ASSET_TYPES.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === ASSET_TYPES.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === ASSET_TYPES.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n let files;\n\n try {\n files = await upload(asset, folderId ? Number(folderId) : null);\n } catch (error) {\n // The user cancelled the upload: nothing to report.\n if (error instanceof UploadAbortedError) return;\n\n throw error;\n }\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occurred while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","ASSET_TYPES","Image","Video","Audio","React","useEffect","uploadFile","files","Number","UploadAbortedError","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { Flex, Card, CardHeader, CardBody, CardContent, Box, Typography, CardTit
|
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
5
|
import { styled } from 'styled-components';
|
|
6
6
|
import { ASSET_TYPES } from '../../../enums.mjs';
|
|
7
|
+
import { UploadAbortedError } from '../../../services/uploadFileViaXHR.mjs';
|
|
7
8
|
import { useUpload } from '../../hooks/useUpload.mjs';
|
|
8
9
|
import 'byte-size';
|
|
9
10
|
import 'date-fns';
|
|
@@ -45,7 +46,14 @@ const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles,
|
|
|
45
46
|
}
|
|
46
47
|
React.useEffect(()=>{
|
|
47
48
|
const uploadFile = async ()=>{
|
|
48
|
-
|
|
49
|
+
let files;
|
|
50
|
+
try {
|
|
51
|
+
files = await upload(asset, folderId ? Number(folderId) : null);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
// The user cancelled the upload: nothing to report.
|
|
54
|
+
if (error instanceof UploadAbortedError) return;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
49
57
|
if (addUploadedFiles) {
|
|
50
58
|
addUploadedFiles(files);
|
|
51
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadingAssetCard.mjs","sources":["../../../../../admin/src/legacy/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType, ASSET_TYPES } from '../../../enums';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === ASSET_TYPES.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === ASSET_TYPES.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === ASSET_TYPES.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n
|
|
1
|
+
{"version":3,"file":"UploadingAssetCard.mjs","sources":["../../../../../admin/src/legacy/components/AssetCard/UploadingAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Card,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n Flex,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetType, ASSET_TYPES } from '../../../enums';\nimport { UploadAbortedError } from '../../../services/uploadFileViaXHR';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\nimport { UploadProgress } from '../UploadProgress/UploadProgress';\n\nimport type { RawFile, File } from '../../../../../shared/contracts/files';\n\nconst UploadProgressWrapper = styled.div`\n height: 8.8rem;\n width: 100%;\n`;\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\ninterface UploadingAssetCardProps {\n onCancel: (rawFile: RawFile) => void;\n onStatusChange: (status: string) => void;\n addUploadedFiles: (files: File[]) => void;\n folderId?: string | number | null;\n asset: Asset;\n id?: string;\n size?: 'S' | 'M';\n}\n\ninterface Asset extends File {\n rawFile?: RawFile;\n type?: AssetType;\n}\n\nexport const UploadingAssetCard = ({\n asset,\n onCancel,\n onStatusChange,\n addUploadedFiles,\n folderId = null,\n}: UploadingAssetCardProps) => {\n const { upload, cancel, error, progress, status } = useUpload();\n const { formatMessage } = useIntl();\n\n let badgeContent = formatMessage({\n id: getTrad('settings.section.doc.label'),\n defaultMessage: 'Doc',\n });\n\n if (asset.type === ASSET_TYPES.Image) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.image.label'),\n defaultMessage: 'Image',\n });\n } else if (asset.type === ASSET_TYPES.Video) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.video.label'),\n defaultMessage: 'Video',\n });\n } else if (asset.type === ASSET_TYPES.Audio) {\n badgeContent = formatMessage({\n id: getTrad('settings.section.audio.label'),\n defaultMessage: 'Audio',\n });\n }\n\n React.useEffect(() => {\n const uploadFile = async () => {\n let files;\n\n try {\n files = await upload(asset, folderId ? Number(folderId) : null);\n } catch (error) {\n // The user cancelled the upload: nothing to report.\n if (error instanceof UploadAbortedError) return;\n\n throw error;\n }\n\n if (addUploadedFiles) {\n addUploadedFiles(files);\n }\n };\n\n uploadFile();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onStatusChange(status);\n }, [status, onStatusChange]);\n\n const handleCancel = () => {\n cancel();\n onCancel(asset.rawFile!);\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Card borderColor={error ? 'danger600' : 'neutral150'}>\n <CardHeader>\n <UploadProgressWrapper>\n <UploadProgress\n error={error || undefined}\n onCancel={handleCancel}\n progress={progress}\n />\n </UploadProgressWrapper>\n </CardHeader>\n <CardBody>\n <CardContent>\n <Box paddingTop={1}>\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n </Box>\n <CardSubtitle>\n <Extension>{asset.ext}</Extension>\n </CardSubtitle>\n </CardContent>\n <Flex paddingTop={1} grow={1}>\n <CardBadge>{badgeContent}</CardBadge>\n </Flex>\n </CardBody>\n </Card>\n {error ? (\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"danger600\">\n {formatMessage(\n error?.message\n ? {\n id: getTrad(`apiError.${error.message}`),\n defaultMessage: error.message,\n /* See issue: https://github.com/strapi/strapi/issues/13867\n A proxy might return an error, before the request reaches Strapi\n and therefore we need to handle errors gracefully.\n */\n }\n : {\n id: getTrad('upload.generic-error'),\n defaultMessage: 'An error occurred while uploading the file.',\n }\n )}\n </Typography>\n ) : undefined}\n </Flex>\n );\n};\n"],"names":["UploadProgressWrapper","styled","div","Extension","span","UploadingAssetCard","asset","onCancel","onStatusChange","addUploadedFiles","folderId","upload","cancel","error","progress","status","useUpload","formatMessage","useIntl","badgeContent","id","getTrad","defaultMessage","type","ASSET_TYPES","Image","Video","Audio","React","useEffect","uploadFile","files","Number","UploadAbortedError","handleCancel","rawFile","_jsxs","Flex","direction","alignItems","gap","Card","borderColor","_jsx","CardHeader","UploadProgress","undefined","CardBody","CardContent","Box","paddingTop","Typography","tag","CardTitle","name","CardSubtitle","ext","grow","CardBadge","variant","fontWeight","textColor","message"],"mappings":"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"}
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
6
|
var designSystem = require('@strapi/design-system');
|
|
6
7
|
var icons = require('@strapi/icons');
|
|
7
8
|
var cropperjscss = require('cropperjs/dist/cropper.css?raw');
|
|
8
9
|
var reactIntl = require('react-intl');
|
|
9
10
|
var styledComponents = require('styled-components');
|
|
10
11
|
var enums = require('../../../../enums.js');
|
|
12
|
+
var uploadFileViaXHR = require('../../../../services/uploadFileViaXHR.js');
|
|
11
13
|
var useCropImg = require('../../../hooks/useCropImg.js');
|
|
12
14
|
var useEditAsset = require('../../../hooks/useEditAsset.js');
|
|
13
15
|
var useTracking = require('../../../hooks/useTracking.js');
|
|
@@ -18,7 +20,6 @@ var downloadFile = require('../../../utils/downloadFile.js');
|
|
|
18
20
|
require('byte-size');
|
|
19
21
|
require('date-fns');
|
|
20
22
|
var getTrad = require('../../../utils/getTrad.js');
|
|
21
|
-
require('@strapi/admin/strapi-admin');
|
|
22
23
|
require('qs');
|
|
23
24
|
require('../../../utils/urlYupSchema.js');
|
|
24
25
|
var CopyLinkButton = require('../../CopyLinkButton/CopyLinkButton.js');
|
|
@@ -150,7 +151,14 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
|
|
|
150
151
|
location: trackedLocation
|
|
151
152
|
});
|
|
152
153
|
} else {
|
|
153
|
-
|
|
154
|
+
let updatedAsset;
|
|
155
|
+
try {
|
|
156
|
+
updatedAsset = await editAsset(nextAsset, file);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
// The user cancelled the edit: nothing to report.
|
|
159
|
+
if (strapiAdmin.isAbortError(error)) return;
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
154
162
|
optimizedCachingImage = createAssetUrl.createAssetUrl(updatedAsset, false);
|
|
155
163
|
optimizedCachingThumbnailImage = createAssetUrl.createAssetUrl(updatedAsset, true);
|
|
156
164
|
trackUsage('didCropFile', {
|
|
@@ -167,10 +175,16 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
|
|
|
167
175
|
const nextAsset = {
|
|
168
176
|
...asset};
|
|
169
177
|
const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
try {
|
|
179
|
+
await upload({
|
|
180
|
+
name: file.name,
|
|
181
|
+
rawFile: file
|
|
182
|
+
}, asset.folder?.id ? asset.folder.id : null);
|
|
183
|
+
} catch (error) {
|
|
184
|
+
// The user cancelled the upload: nothing to report.
|
|
185
|
+
if (error instanceof uploadFileViaXHR.UploadAbortedError) return;
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
174
188
|
trackUsage('didCropFile', {
|
|
175
189
|
duplicatedFile: true,
|
|
176
190
|
location: trackedLocation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewBox.js","sources":["../../../../../../admin/src/legacy/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { appendSearchParamsToUrl, createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n\n // When loading a cross-origin image for cropping, append a cache-busting parameter\n // so the browser makes a fresh request with CORS headers instead of serving a\n // previously cached non-CORS response (which would taint the canvas and break\n // cropping). Signed URLs are excluded because modifying them invalidates the signature.\n const cropUrl = React.useMemo(() => {\n if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {\n return appendSearchParamsToUrl({ url: assetUrl, params: { updatedAt: asset.updatedAt } });\n }\n\n return assetUrl;\n }, [assetUrl, asset.isLocal, asset.isUrlSigned, asset.updatedAt]);\n\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n const updatedAsset = await editAsset(nextAsset, file);\n optimizedCachingImage = createAssetUrl(updatedAsset, false);\n optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n }\n\n setAssetUrl(optimizedCachingImage);\n setThumbnailUrl(optimizedCachingThumbnailImage);\n setHasCropIntent(false);\n };\n\n const isInCroppingMode = isCropping && !isLoading;\n\n const handleDuplication = async () => {\n const nextAsset = { ...asset, width, height };\n const file = (await produceFile(\n nextAsset.name,\n nextAsset.mime!,\n nextAsset.updatedAt!\n )) as RawFile;\n\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(ASSET_TYPES.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(ASSET_TYPES.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? cropUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","cropUrl","useMemo","isLocal","isUrlSigned","appendSearchParamsToUrl","url","params","updatedAt","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","current","handleCropping","nextAsset","folder","id","file","name","mime","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","ASSET_TYPES","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewBox.js","sources":["../../../../../../admin/src/legacy/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 { isAbortError } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { UploadAbortedError } from '../../../../services/uploadFileViaXHR';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { appendSearchParamsToUrl, createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n ActionRow,\n BadgeOverride,\n RelativeBox,\n UploadProgressWrapper,\n Wrapper,\n FocalPointImageWrapper,\n FocalPointAim,\n FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n File as FileDefinition,\n RawFile,\n FocalPoint,\n} from '../../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n asset: Asset;\n canUpdate: boolean;\n canCopyLink: boolean;\n canDownload: boolean;\n replacementFile?: File;\n onDelete: (asset?: Asset | null) => void;\n onCropFinish: () => void;\n onCropStart: () => void;\n onCropCancel: () => void;\n trackedLocation?: string;\n formFocalPoint?: FocalPoint | null;\n onFocalPointStart: () => void;\n onFocalPointFinish: (focalPoint: FocalPoint) => void;\n onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n asset,\n canUpdate,\n canCopyLink,\n canDownload,\n onDelete,\n onCropFinish,\n onCropStart,\n onCropCancel,\n replacementFile,\n trackedLocation,\n formFocalPoint,\n onFocalPointStart,\n onFocalPointFinish,\n onFocalPointCancel,\n}: PreviewBoxProps) => {\n const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n const { trackUsage } = useTracking();\n const previewRef = React.useRef(null);\n const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n\n // When loading a cross-origin image for cropping, append a cache-busting parameter\n // so the browser makes a fresh request with CORS headers instead of serving a\n // previously cached non-CORS response (which would taint the canvas and break\n // cropping). Signed URLs are excluded because modifying them invalidates the signature.\n const cropUrl = React.useMemo(() => {\n if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {\n return appendSearchParamsToUrl({ url: assetUrl, params: { updatedAt: asset.updatedAt } });\n }\n\n return assetUrl;\n }, [assetUrl, asset.isLocal, asset.isUrlSigned, asset.updatedAt]);\n\n const { formatMessage } = useIntl();\n const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n useCropImg();\n const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n formFocalPoint ?? { x: 50, y: 50 }\n );\n\n const {\n upload,\n isLoading: isLoadingUpload,\n cancel: cancelUpload,\n error: uploadError,\n progress: progressUpload,\n } = useUpload();\n\n React.useEffect(() => {\n // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n // the locally generated one\n if (replacementFile) {\n const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n if (asset.isLocal) {\n asset.url = fileLocalUrl;\n }\n\n setAssetUrl(fileLocalUrl);\n setThumbnailUrl(fileLocalUrl);\n }\n }, [replacementFile, asset]);\n\n React.useEffect(() => {\n if (hasCropIntent === false) {\n stopCropping();\n onCropCancel();\n }\n }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n React.useEffect(() => {\n if (hasCropIntent && isCropImageReady) {\n crop(previewRef.current!);\n onCropStart();\n }\n }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n const handleCropping = async () => {\n const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n // Making sure that when persisting the new asset, the URL changes with width and height\n // So that the browser makes a request and handle the image caching correctly at the good size\n let optimizedCachingImage;\n let optimizedCachingThumbnailImage;\n\n if (asset.isLocal) {\n optimizedCachingImage = URL.createObjectURL(file);\n optimizedCachingThumbnailImage = optimizedCachingImage;\n asset.url = optimizedCachingImage;\n asset.rawFile = file;\n\n trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n } else {\n let updatedAsset;\n\n try {\n updatedAsset = await editAsset(nextAsset, file);\n } catch (error) {\n // The user cancelled the edit: nothing to report.\n if (isAbortError(error)) return;\n\n throw error;\n }\n\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 try {\n await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n } catch (error) {\n // The user cancelled the upload: nothing to report.\n if (error instanceof UploadAbortedError) return;\n\n throw error;\n }\n\n trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n setHasCropIntent(false);\n onCropFinish();\n };\n\n const handleCropCancel = () => {\n setHasCropIntent(false);\n };\n\n const handleCropStart = () => {\n setHasCropIntent(true);\n };\n\n const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n const { clientX, clientY } = e;\n const rect = e.currentTarget.getBoundingClientRect();\n const posX = clientX - rect.left;\n const posY = clientY - rect.top;\n\n return {\n x: Number(((posX / rect.width) * 100).toFixed(2)),\n y: Number(((posY / rect.height) * 100).toFixed(2)),\n };\n };\n\n const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n if (!isInFocalPointMode) return;\n setFocalPoint(calculateFocalPointFromEvent(e));\n };\n\n const handleFocalPointCancel = () => {\n setIsInFocalPointMode(false);\n setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n onFocalPointCancel();\n };\n\n const handleFocalPointStart = () => {\n onFocalPointStart();\n setIsInFocalPointMode(true);\n };\n\n const handleFocalPointValidate = () => {\n setIsInFocalPointMode(false);\n onFocalPointFinish(focalPoint);\n };\n\n const handleFocalPointReset = () => {\n setFocalPoint({ x: 50, y: 50 });\n };\n\n return (\n <>\n <CropperjsStyle />\n <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n {isCropperReady && isInCroppingMode && (\n <CroppingActions\n onValidate={handleCropping}\n onDuplicate={asset.isLocal ? undefined : handleDuplication}\n onCancel={handleCropCancel}\n />\n )}\n\n {isInFocalPointMode && (\n <FocalPointActions\n onValidate={handleFocalPointValidate}\n onCancel={handleFocalPointCancel}\n onReset={handleFocalPointReset}\n />\n )}\n\n <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n <Flex gap={1}>\n {canUpdate && !asset.isLocal && (\n <IconButton\n label={formatMessage({\n id: 'global.delete',\n defaultMessage: 'Delete',\n })}\n onClick={() => setShowConfirmDialog(true)}\n >\n <Trash />\n </IconButton>\n )}\n\n {canDownload && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.download'),\n defaultMessage: 'Download',\n })}\n onClick={() => downloadFile(assetUrl!, asset.name)}\n >\n <DownloadIcon />\n </IconButton>\n )}\n\n {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n {canUpdate && asset.mime?.includes(ASSET_TYPES.Image) && (\n <IconButton\n label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n onClick={handleCropStart}\n >\n <Resize />\n </IconButton>\n )}\n\n {canUpdate && asset.mime?.includes(ASSET_TYPES.Image) && (\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.set-focal-point'),\n defaultMessage: 'Set focal point',\n })}\n onClick={handleFocalPointStart}\n >\n <PinMap />\n </IconButton>\n )}\n </Flex>\n </ActionRow>\n\n <Wrapper>\n {/* This one is for editting an asset */}\n {isLoading && (\n <UploadProgressWrapper>\n <UploadProgress error={error} onCancel={cancel} progress={progress} />\n </UploadProgressWrapper>\n )}\n\n {/* This one is for duplicating an asset after cropping */}\n {isLoadingUpload && (\n <UploadProgressWrapper>\n <UploadProgress\n error={uploadError}\n onCancel={cancelUpload}\n progress={progressUpload}\n />\n </UploadProgressWrapper>\n )}\n\n <FocalPointImageWrapper>\n <AssetPreview\n ref={previewRef}\n mime={asset.mime!}\n name={asset.name}\n url={hasCropIntent ? cropUrl! : thumbnailUrl!}\n onLoad={() => {\n if (asset.isLocal || hasCropIntent) {\n setIsCropImageReady(true);\n }\n }}\n onClick={handleFocalPointClick}\n style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n />\n\n {/* Show the set focal point marker */}\n {isInFocalPointMode && (\n <FocalPointAim $focalPoint={focalPoint}>\n <FocalPointHalo />\n </FocalPointAim>\n )}\n </FocalPointImageWrapper>\n </Wrapper>\n\n <ActionRow\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"flex-end\"\n $blurry={isInCroppingMode || isInFocalPointMode}\n >\n {isInCroppingMode && width && height && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {width && height ? `${height}✕${width}` : 'N/A'}\n </BadgeOverride>\n )}\n {isInFocalPointMode && (\n <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n </BadgeOverride>\n )}\n </ActionRow>\n </RelativeBox>\n\n <RemoveAssetDialog\n open={showConfirmDialog}\n onClose={(value) => {\n setShowConfirmDialog(false);\n if (value === null) {\n onDelete(null);\n }\n }}\n asset={asset}\n />\n </>\n );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","cropUrl","useMemo","isLocal","isUrlSigned","appendSearchParamsToUrl","url","params","updatedAt","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","current","handleCropping","nextAsset","folder","id","file","name","mime","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isAbortError","isInCroppingMode","handleDuplication","UploadAbortedError","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","ASSET_TYPES","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
import { isAbortError } from '@strapi/admin/strapi-admin';
|
|
3
4
|
import { Flex, IconButton } from '@strapi/design-system';
|
|
4
5
|
import { Trash, Download, Crop, PinMap } from '@strapi/icons';
|
|
5
6
|
import cropperjscss from 'cropperjs/dist/cropper.css?raw';
|
|
6
7
|
import { useIntl } from 'react-intl';
|
|
7
8
|
import { createGlobalStyle } from 'styled-components';
|
|
8
9
|
import { ASSET_TYPES } from '../../../../enums.mjs';
|
|
10
|
+
import { UploadAbortedError } from '../../../../services/uploadFileViaXHR.mjs';
|
|
9
11
|
import { useCropImg } from '../../../hooks/useCropImg.mjs';
|
|
10
12
|
import { useEditAsset } from '../../../hooks/useEditAsset.mjs';
|
|
11
13
|
import { useTracking } from '../../../hooks/useTracking.mjs';
|
|
@@ -16,7 +18,6 @@ import { downloadFile } from '../../../utils/downloadFile.mjs';
|
|
|
16
18
|
import 'byte-size';
|
|
17
19
|
import 'date-fns';
|
|
18
20
|
import { getTrad } from '../../../utils/getTrad.mjs';
|
|
19
|
-
import '@strapi/admin/strapi-admin';
|
|
20
21
|
import 'qs';
|
|
21
22
|
import '../../../utils/urlYupSchema.mjs';
|
|
22
23
|
import { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton.mjs';
|
|
@@ -125,7 +126,14 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
|
|
|
125
126
|
location: trackedLocation
|
|
126
127
|
});
|
|
127
128
|
} else {
|
|
128
|
-
|
|
129
|
+
let updatedAsset;
|
|
130
|
+
try {
|
|
131
|
+
updatedAsset = await editAsset(nextAsset, file);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// The user cancelled the edit: nothing to report.
|
|
134
|
+
if (isAbortError(error)) return;
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
129
137
|
optimizedCachingImage = createAssetUrl(updatedAsset, false);
|
|
130
138
|
optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);
|
|
131
139
|
trackUsage('didCropFile', {
|
|
@@ -142,10 +150,16 @@ const PreviewBox = ({ asset, canUpdate, canCopyLink, canDownload, onDelete, onCr
|
|
|
142
150
|
const nextAsset = {
|
|
143
151
|
...asset};
|
|
144
152
|
const file = await produceFile(nextAsset.name, nextAsset.mime, nextAsset.updatedAt);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
153
|
+
try {
|
|
154
|
+
await upload({
|
|
155
|
+
name: file.name,
|
|
156
|
+
rawFile: file
|
|
157
|
+
}, asset.folder?.id ? asset.folder.id : null);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
// The user cancelled the upload: nothing to report.
|
|
160
|
+
if (error instanceof UploadAbortedError) return;
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
149
163
|
trackUsage('didCropFile', {
|
|
150
164
|
duplicatedFile: true,
|
|
151
165
|
location: trackedLocation
|