@strapi/upload 5.31.0 → 5.31.1

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 (31) hide show
  1. package/dist/admin/ai/components/AIUploadModal.js +8 -1
  2. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  3. package/dist/admin/ai/components/AIUploadModal.mjs +9 -2
  4. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
  5. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +2 -2
  6. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  7. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -2
  8. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  9. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +6 -1
  10. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  11. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +6 -1
  12. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  13. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +4 -0
  14. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  15. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +4 -0
  16. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  17. package/dist/admin/components/TableList/TableRows.js +3 -0
  18. package/dist/admin/components/TableList/TableRows.js.map +1 -1
  19. package/dist/admin/components/TableList/TableRows.mjs +3 -0
  20. package/dist/admin/components/TableList/TableRows.mjs.map +1 -1
  21. package/dist/admin/package.json.js +5 -5
  22. package/dist/admin/package.json.mjs +5 -5
  23. package/dist/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.d.ts +1 -0
  24. package/dist/admin/translations/fr.json.js +8 -8
  25. package/dist/admin/translations/fr.json.mjs +8 -8
  26. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  27. package/dist/server/utils/mime-validation.js +6 -2
  28. package/dist/server/utils/mime-validation.js.map +1 -1
  29. package/dist/server/utils/mime-validation.mjs +5 -1
  30. package/dist/server/utils/mime-validation.mjs.map +1 -1
  31. package/package.json +5 -5
@@ -59,6 +59,7 @@ const StyledAlert = styledComponents.styled(designSystem.Alert)`
59
59
  `;
60
60
  const ModalContent = ({ onClose })=>{
61
61
  const { formatMessage } = reactIntl.useIntl();
62
+ const { toggleNotification } = strapiAdmin.useNotification();
62
63
  const state = useAIUploadModalContext('ModalContent', (s)=>s.state);
63
64
  const dispatch = useAIUploadModalContext('ModalContent', (s)=>s.dispatch);
64
65
  const folderId = useAIUploadModalContext('ModalContent', (s)=>s.folderId);
@@ -117,7 +118,13 @@ const ModalContent = ({ onClose })=>{
117
118
  type: 'clear_unsaved_changes'
118
119
  });
119
120
  } catch (err) {
120
- console.error('Failed to save asset changes:', err);
121
+ toggleNotification({
122
+ type: 'danger',
123
+ message: (err instanceof Error ? err.message : null) || formatMessage({
124
+ id: 'notification.error',
125
+ defaultMessage: 'An error occurred'
126
+ })
127
+ });
121
128
  return; // Don't close modal on error
122
129
  }
123
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AIUploadModal.js","sources":["../../../../admin/src/ai/components/AIUploadModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext } from '@strapi/admin/strapi-admin';\nimport { Alert, Button, Flex, Modal } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AddAssetStep,\n FileWithRawFile,\n} from '../../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useTracking } from '../../hooks/useTracking';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\n\nimport { AIAssetCard, AIAssetCardSkeletons } from './AIAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * ModalBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledModalBody = styled(Modal.Body)`\n padding: 0;\n display: flex;\n justify-content: center;\n\n [data-radix-scroll-area-viewport] {\n padding-top: ${({ theme }) => theme.spaces[6]};\n padding-bottom: ${({ theme }) => theme.spaces[6]};\n padding-left: ${({ theme }) => theme.spaces[7]};\n padding-right: ${({ theme }) => theme.spaces[7]};\n }\n`;\n\nconst StyledAlert = styled(Alert)`\n & > button {\n display: none;\n }\n`;\n\nconst ModalContent = ({ onClose }: Pick<AIUploadModalProps, 'onClose'>) => {\n const { formatMessage } = useIntl();\n const state = useAIUploadModalContext('ModalContent', (s) => s.state);\n const dispatch = useAIUploadModalContext('ModalContent', (s) => s.dispatch);\n const folderId = useAIUploadModalContext('ModalContent', (s) => s.folderId);\n const { upload } = useUpload();\n const { edit, isLoading: isSaving } = useBulkEdit();\n const [isUploading, setIsUploading] = React.useState(false);\n const [uploadError, setUploadError] = React.useState<Error | null>(null);\n const { trackUsage } = useTracking();\n\n const handleCaptionChange = (assetId: number, caption: string) => {\n dispatch({\n type: 'set_uploaded_asset_caption',\n payload: { id: assetId, caption },\n });\n };\n\n const handleAltTextChange = (assetId: number, altText: string) => {\n dispatch({\n type: 'set_uploaded_asset_alt_text',\n payload: { id: assetId, altText },\n });\n };\n\n const resetState = () => {\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n };\n\n const handleFinish = async () => {\n if (state.hasUnsavedChanges) {\n const assetsToUpdate = state.uploadedAssets.filter(\n (asset) => (asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id\n );\n\n if (assetsToUpdate.length > 0) {\n if (assetsToUpdate.some((asset) => asset.wasCaptionChanged)) {\n trackUsage('didEditAICaption');\n }\n\n if (assetsToUpdate.some((asset) => asset.wasAltTextChanged)) {\n trackUsage('didEditAIAlternativeText');\n }\n\n // Update assets\n const updates = assetsToUpdate.map((asset) => ({\n id: asset.file.id!,\n fileInfo: {\n name: asset.file.name,\n alternativeText: asset.file.alternativeText ?? null,\n caption: asset.file.caption ?? null,\n folder:\n typeof asset.file.folder === 'object' && asset.file.folder !== null\n ? // @ts-expect-error types are wrong\n asset.file.folder.id\n : asset.file.folder,\n },\n }));\n\n try {\n await edit(updates);\n dispatch({ type: 'clear_unsaved_changes' });\n } catch (err) {\n console.error('Failed to save asset changes:', err);\n return; // Don't close modal on error\n }\n }\n }\n\n resetState();\n onClose();\n };\n\n const handleCancel = () => {\n resetState();\n onClose();\n };\n\n const handleUpload = async (assets: FileWithRawFile[]) => {\n dispatch({ type: 'set_assets_to_upload_length', payload: assets.length });\n setUploadError(null);\n setIsUploading(true);\n\n try {\n const assetsForUpload = assets.map((asset) => ({\n ...asset,\n id: asset.id ? Number(asset.id) : undefined,\n }));\n\n const uploadedFiles = await upload(assetsForUpload, folderId);\n const filesWithFolder = uploadedFiles.map((file: File) => ({\n ...file,\n // The upload API doesn't populate the folder relation, so we add it manually\n folder: folderId || file.folder,\n }));\n dispatch({ type: 'set_uploaded_assets', payload: filesWithFolder });\n } catch (error) {\n console.error('Upload failed:', error);\n setUploadError(error instanceof Error ? error : new Error('Upload failed'));\n } finally {\n setIsUploading(false);\n }\n };\n\n if (state.assetsToUploadLength === 0) {\n return (\n <Modal.Content>\n <AddAssetStep onClose={onClose} onAddAsset={handleUpload} />\n </Modal.Content>\n );\n }\n\n if (\n isUploading ||\n (state.assetsToUploadLength > 0 && state.uploadedAssets.length === 0 && !uploadError)\n ) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('ai.modal.uploading.title'),\n defaultMessage: 'Uploading and processing with AI...',\n })}\n </Modal.Title>\n </Modal.Header>\n <StyledModalBody>\n <AIAssetCardSkeletons count={state.assetsToUploadLength} />\n </StyledModalBody>\n </Modal.Content>\n );\n }\n\n const title = formatMessage(\n {\n id: getTrad('ai.modal.title'),\n defaultMessage:\n '{count, plural, one {# asset uploaded} other {# assets uploaded}}, review AI generated metadata',\n },\n { count: state.uploadedAssets.length }\n );\n\n if (uploadError) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <StyledAlert closeLabel=\"\" variant=\"danger\">\n {formatMessage({\n id: getTrad('ai.modal.error'),\n defaultMessage: 'Could not generate AI metadata for the uploaded files.',\n })}\n </StyledAlert>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n }\n\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n\n <StyledModalBody>\n <Flex gap={6} direction=\"column\" alignItems=\"stretch\">\n {state.uploadedAssets.map(({ file: asset, wasCaptionChanged, wasAltTextChanged }) => (\n <AIAssetCard\n key={asset.id}\n asset={asset}\n onCaptionChange={(caption: string) =>\n asset.id && handleCaptionChange(asset.id, caption)\n }\n onAltTextChange={(altText: string) =>\n asset.id && handleAltTextChange(asset.id, altText)\n }\n wasCaptionChanged={wasCaptionChanged}\n wasAltTextChanged={wasAltTextChanged}\n />\n ))}\n </Flex>\n </StyledModalBody>\n\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AIUploadModalProps {\n open: boolean;\n onClose: () => void;\n folderId?: number | null;\n}\n\ntype State = {\n uploadedAssets: Array<{ file: File; wasCaptionChanged: boolean; wasAltTextChanged: boolean }>;\n assetsToUploadLength: number;\n hasUnsavedChanges: boolean;\n};\n\ntype Action =\n | {\n type: 'set_uploaded_assets';\n payload: File[];\n }\n | {\n type: 'set_assets_to_upload_length';\n payload: number;\n }\n | {\n type: 'set_uploaded_asset_caption';\n payload: { id: number; caption: string };\n }\n | {\n type: 'set_uploaded_asset_alt_text';\n payload: { id: number; altText: string };\n }\n | {\n type: 'remove_uploaded_asset';\n payload: { id: number };\n }\n | {\n type: 'edit_uploaded_asset';\n payload: { editedAsset: File };\n }\n | {\n type: 'clear_unsaved_changes';\n };\n\nconst [AIUploadModalContext, useAIUploadModalContext] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n folderId: number | null;\n onClose: () => void;\n}>('AIUploadModalContext');\n\nconst reducer = (state: State, action: Action): State => {\n return produce(state, (draft: State) => {\n if (action.type === 'set_uploaded_assets') {\n draft.uploadedAssets = action.payload.map((file) => ({\n file,\n wasCaptionChanged: false,\n wasAltTextChanged: false,\n }));\n draft.hasUnsavedChanges = false;\n }\n\n if (action.type === 'set_assets_to_upload_length') {\n draft.assetsToUploadLength = action.payload;\n }\n\n if (action.type === 'set_uploaded_asset_caption') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.caption !== action.payload.caption) {\n asset.file.caption = action.payload.caption;\n asset.wasCaptionChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'set_uploaded_asset_alt_text') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.alternativeText !== action.payload.altText) {\n asset.file.alternativeText = action.payload.altText;\n asset.wasAltTextChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'remove_uploaded_asset') {\n draft.uploadedAssets = draft.uploadedAssets.filter((a) => a.file.id !== action.payload.id);\n }\n\n if (action.type === 'edit_uploaded_asset') {\n const assetIndex = draft.uploadedAssets.findIndex(\n (a) => a.file.id === action.payload.editedAsset.id\n );\n if (assetIndex !== -1) {\n draft.uploadedAssets[assetIndex] = {\n file: action.payload.editedAsset,\n wasCaptionChanged: draft.uploadedAssets[assetIndex].wasCaptionChanged,\n wasAltTextChanged: draft.uploadedAssets[assetIndex].wasAltTextChanged,\n };\n }\n }\n\n if (action.type === 'clear_unsaved_changes') {\n draft.hasUnsavedChanges = false;\n draft.uploadedAssets.forEach((asset) => {\n asset.wasCaptionChanged = false;\n asset.wasAltTextChanged = false;\n });\n }\n });\n};\n\nexport const AIUploadModal = ({ open, onClose, folderId = null }: AIUploadModalProps) => {\n const [state, dispatch] = React.useReducer(reducer, {\n uploadedAssets: [],\n assetsToUploadLength: 0,\n hasUnsavedChanges: false,\n });\n\n const handleClose = React.useCallback(() => {\n // Reset state when modal closes\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n onClose();\n }, [onClose]);\n\n return (\n <AIUploadModalContext\n state={state}\n dispatch={dispatch}\n folderId={folderId}\n onClose={handleClose}\n >\n <Modal.Root open={open} onOpenChange={handleClose}>\n <ModalContent onClose={handleClose} />\n </Modal.Root>\n </AIUploadModalContext>\n );\n};\n\nexport { useAIUploadModalContext };\n"],"names":["StyledModalBody","styled","Modal","Body","theme","spaces","StyledAlert","Alert","ModalContent","onClose","formatMessage","useIntl","state","useAIUploadModalContext","s","dispatch","folderId","upload","useUpload","edit","isLoading","isSaving","useBulkEdit","isUploading","setIsUploading","React","useState","uploadError","setUploadError","trackUsage","useTracking","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","some","updates","map","fileInfo","name","alternativeText","folder","err","console","error","handleCancel","handleUpload","assets","assetsForUpload","Number","undefined","uploadedFiles","filesWithFolder","Error","assetsToUploadLength","_jsx","Content","AddAssetStep","onAddAsset","_jsxs","Header","Title","getTrad","defaultMessage","AIAssetCardSkeletons","count","title","closeLabel","variant","Footer","Button","onClick","loading","Flex","gap","direction","alignItems","AIAssetCard","onCaptionChange","onAltTextChange","AIUploadModalContext","createContext","reducer","action","produce","draft","find","a","assetIndex","findIndex","editedAsset","forEach","AIUploadModal","open","useReducer","handleClose","useCallback","Root","onOpenChange"],"mappings":"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"}
1
+ {"version":3,"file":"AIUploadModal.js","sources":["../../../../admin/src/ai/components/AIUploadModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Alert, Button, Flex, Modal } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AddAssetStep,\n FileWithRawFile,\n} from '../../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useTracking } from '../../hooks/useTracking';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\n\nimport { AIAssetCard, AIAssetCardSkeletons } from './AIAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * ModalBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledModalBody = styled(Modal.Body)`\n padding: 0;\n display: flex;\n justify-content: center;\n\n [data-radix-scroll-area-viewport] {\n padding-top: ${({ theme }) => theme.spaces[6]};\n padding-bottom: ${({ theme }) => theme.spaces[6]};\n padding-left: ${({ theme }) => theme.spaces[7]};\n padding-right: ${({ theme }) => theme.spaces[7]};\n }\n`;\n\nconst StyledAlert = styled(Alert)`\n & > button {\n display: none;\n }\n`;\n\nconst ModalContent = ({ onClose }: Pick<AIUploadModalProps, 'onClose'>) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const state = useAIUploadModalContext('ModalContent', (s) => s.state);\n const dispatch = useAIUploadModalContext('ModalContent', (s) => s.dispatch);\n const folderId = useAIUploadModalContext('ModalContent', (s) => s.folderId);\n const { upload } = useUpload();\n const { edit, isLoading: isSaving } = useBulkEdit();\n const [isUploading, setIsUploading] = React.useState(false);\n const [uploadError, setUploadError] = React.useState<Error | null>(null);\n const { trackUsage } = useTracking();\n\n const handleCaptionChange = (assetId: number, caption: string) => {\n dispatch({\n type: 'set_uploaded_asset_caption',\n payload: { id: assetId, caption },\n });\n };\n\n const handleAltTextChange = (assetId: number, altText: string) => {\n dispatch({\n type: 'set_uploaded_asset_alt_text',\n payload: { id: assetId, altText },\n });\n };\n\n const resetState = () => {\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n };\n\n const handleFinish = async () => {\n if (state.hasUnsavedChanges) {\n const assetsToUpdate = state.uploadedAssets.filter(\n (asset) => (asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id\n );\n\n if (assetsToUpdate.length > 0) {\n if (assetsToUpdate.some((asset) => asset.wasCaptionChanged)) {\n trackUsage('didEditAICaption');\n }\n\n if (assetsToUpdate.some((asset) => asset.wasAltTextChanged)) {\n trackUsage('didEditAIAlternativeText');\n }\n\n // Update assets\n const updates = assetsToUpdate.map((asset) => ({\n id: asset.file.id!,\n fileInfo: {\n name: asset.file.name,\n alternativeText: asset.file.alternativeText ?? null,\n caption: asset.file.caption ?? null,\n folder:\n typeof asset.file.folder === 'object' && asset.file.folder !== null\n ? // @ts-expect-error types are wrong\n asset.file.folder.id\n : asset.file.folder,\n },\n }));\n\n try {\n await edit(updates);\n dispatch({ type: 'clear_unsaved_changes' });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message:\n (err instanceof Error ? err.message : null) ||\n formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n return; // Don't close modal on error\n }\n }\n }\n\n resetState();\n onClose();\n };\n\n const handleCancel = () => {\n resetState();\n onClose();\n };\n\n const handleUpload = async (assets: FileWithRawFile[]) => {\n dispatch({ type: 'set_assets_to_upload_length', payload: assets.length });\n setUploadError(null);\n setIsUploading(true);\n\n try {\n const assetsForUpload = assets.map((asset) => ({\n ...asset,\n id: asset.id ? Number(asset.id) : undefined,\n }));\n\n const uploadedFiles = await upload(assetsForUpload, folderId);\n const filesWithFolder = uploadedFiles.map((file: File) => ({\n ...file,\n // The upload API doesn't populate the folder relation, so we add it manually\n folder: folderId || file.folder,\n }));\n dispatch({ type: 'set_uploaded_assets', payload: filesWithFolder });\n } catch (error) {\n console.error('Upload failed:', error);\n setUploadError(error instanceof Error ? error : new Error('Upload failed'));\n } finally {\n setIsUploading(false);\n }\n };\n\n if (state.assetsToUploadLength === 0) {\n return (\n <Modal.Content>\n <AddAssetStep onClose={onClose} onAddAsset={handleUpload} />\n </Modal.Content>\n );\n }\n\n if (\n isUploading ||\n (state.assetsToUploadLength > 0 && state.uploadedAssets.length === 0 && !uploadError)\n ) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('ai.modal.uploading.title'),\n defaultMessage: 'Uploading and processing with AI...',\n })}\n </Modal.Title>\n </Modal.Header>\n <StyledModalBody>\n <AIAssetCardSkeletons count={state.assetsToUploadLength} />\n </StyledModalBody>\n </Modal.Content>\n );\n }\n\n const title = formatMessage(\n {\n id: getTrad('ai.modal.title'),\n defaultMessage:\n '{count, plural, one {# asset uploaded} other {# assets uploaded}}, review AI generated metadata',\n },\n { count: state.uploadedAssets.length }\n );\n\n if (uploadError) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <StyledAlert closeLabel=\"\" variant=\"danger\">\n {formatMessage({\n id: getTrad('ai.modal.error'),\n defaultMessage: 'Could not generate AI metadata for the uploaded files.',\n })}\n </StyledAlert>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n }\n\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n\n <StyledModalBody>\n <Flex gap={6} direction=\"column\" alignItems=\"stretch\">\n {state.uploadedAssets.map(({ file: asset, wasCaptionChanged, wasAltTextChanged }) => (\n <AIAssetCard\n key={asset.id}\n asset={asset}\n onCaptionChange={(caption: string) =>\n asset.id && handleCaptionChange(asset.id, caption)\n }\n onAltTextChange={(altText: string) =>\n asset.id && handleAltTextChange(asset.id, altText)\n }\n wasCaptionChanged={wasCaptionChanged}\n wasAltTextChanged={wasAltTextChanged}\n />\n ))}\n </Flex>\n </StyledModalBody>\n\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AIUploadModalProps {\n open: boolean;\n onClose: () => void;\n folderId?: number | null;\n}\n\ntype State = {\n uploadedAssets: Array<{ file: File; wasCaptionChanged: boolean; wasAltTextChanged: boolean }>;\n assetsToUploadLength: number;\n hasUnsavedChanges: boolean;\n};\n\ntype Action =\n | {\n type: 'set_uploaded_assets';\n payload: File[];\n }\n | {\n type: 'set_assets_to_upload_length';\n payload: number;\n }\n | {\n type: 'set_uploaded_asset_caption';\n payload: { id: number; caption: string };\n }\n | {\n type: 'set_uploaded_asset_alt_text';\n payload: { id: number; altText: string };\n }\n | {\n type: 'remove_uploaded_asset';\n payload: { id: number };\n }\n | {\n type: 'edit_uploaded_asset';\n payload: { editedAsset: File };\n }\n | {\n type: 'clear_unsaved_changes';\n };\n\nconst [AIUploadModalContext, useAIUploadModalContext] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n folderId: number | null;\n onClose: () => void;\n}>('AIUploadModalContext');\n\nconst reducer = (state: State, action: Action): State => {\n return produce(state, (draft: State) => {\n if (action.type === 'set_uploaded_assets') {\n draft.uploadedAssets = action.payload.map((file) => ({\n file,\n wasCaptionChanged: false,\n wasAltTextChanged: false,\n }));\n draft.hasUnsavedChanges = false;\n }\n\n if (action.type === 'set_assets_to_upload_length') {\n draft.assetsToUploadLength = action.payload;\n }\n\n if (action.type === 'set_uploaded_asset_caption') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.caption !== action.payload.caption) {\n asset.file.caption = action.payload.caption;\n asset.wasCaptionChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'set_uploaded_asset_alt_text') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.alternativeText !== action.payload.altText) {\n asset.file.alternativeText = action.payload.altText;\n asset.wasAltTextChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'remove_uploaded_asset') {\n draft.uploadedAssets = draft.uploadedAssets.filter((a) => a.file.id !== action.payload.id);\n }\n\n if (action.type === 'edit_uploaded_asset') {\n const assetIndex = draft.uploadedAssets.findIndex(\n (a) => a.file.id === action.payload.editedAsset.id\n );\n if (assetIndex !== -1) {\n draft.uploadedAssets[assetIndex] = {\n file: action.payload.editedAsset,\n wasCaptionChanged: draft.uploadedAssets[assetIndex].wasCaptionChanged,\n wasAltTextChanged: draft.uploadedAssets[assetIndex].wasAltTextChanged,\n };\n }\n }\n\n if (action.type === 'clear_unsaved_changes') {\n draft.hasUnsavedChanges = false;\n draft.uploadedAssets.forEach((asset) => {\n asset.wasCaptionChanged = false;\n asset.wasAltTextChanged = false;\n });\n }\n });\n};\n\nexport const AIUploadModal = ({ open, onClose, folderId = null }: AIUploadModalProps) => {\n const [state, dispatch] = React.useReducer(reducer, {\n uploadedAssets: [],\n assetsToUploadLength: 0,\n hasUnsavedChanges: false,\n });\n\n const handleClose = React.useCallback(() => {\n // Reset state when modal closes\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n onClose();\n }, [onClose]);\n\n return (\n <AIUploadModalContext\n state={state}\n dispatch={dispatch}\n folderId={folderId}\n onClose={handleClose}\n >\n <Modal.Root open={open} onOpenChange={handleClose}>\n <ModalContent onClose={handleClose} />\n </Modal.Root>\n </AIUploadModalContext>\n );\n};\n\nexport { useAIUploadModalContext };\n"],"names":["StyledModalBody","styled","Modal","Body","theme","spaces","StyledAlert","Alert","ModalContent","onClose","formatMessage","useIntl","toggleNotification","useNotification","state","useAIUploadModalContext","s","dispatch","folderId","upload","useUpload","edit","isLoading","isSaving","useBulkEdit","isUploading","setIsUploading","React","useState","uploadError","setUploadError","trackUsage","useTracking","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","some","updates","map","fileInfo","name","alternativeText","folder","err","message","Error","defaultMessage","handleCancel","handleUpload","assets","assetsForUpload","Number","undefined","uploadedFiles","filesWithFolder","error","console","assetsToUploadLength","_jsx","Content","AddAssetStep","onAddAsset","_jsxs","Header","Title","getTrad","AIAssetCardSkeletons","count","title","closeLabel","variant","Footer","Button","onClick","loading","Flex","gap","direction","alignItems","AIAssetCard","onCaptionChange","onAltTextChange","AIUploadModalContext","createContext","reducer","action","produce","draft","find","a","assetIndex","findIndex","editedAsset","forEach","AIUploadModal","open","useReducer","handleClose","useCallback","Root","onOpenChange"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { createContext } from '@strapi/admin/strapi-admin';
3
+ import { createContext, useNotification } from '@strapi/admin/strapi-admin';
4
4
  import { Modal, Alert, Button, Flex } from '@strapi/design-system';
5
5
  import { produce } from 'immer';
6
6
  import { useIntl } from 'react-intl';
@@ -38,6 +38,7 @@ const StyledAlert = styled(Alert)`
38
38
  `;
39
39
  const ModalContent = ({ onClose })=>{
40
40
  const { formatMessage } = useIntl();
41
+ const { toggleNotification } = useNotification();
41
42
  const state = useAIUploadModalContext('ModalContent', (s)=>s.state);
42
43
  const dispatch = useAIUploadModalContext('ModalContent', (s)=>s.dispatch);
43
44
  const folderId = useAIUploadModalContext('ModalContent', (s)=>s.folderId);
@@ -96,7 +97,13 @@ const ModalContent = ({ onClose })=>{
96
97
  type: 'clear_unsaved_changes'
97
98
  });
98
99
  } catch (err) {
99
- console.error('Failed to save asset changes:', err);
100
+ toggleNotification({
101
+ type: 'danger',
102
+ message: (err instanceof Error ? err.message : null) || formatMessage({
103
+ id: 'notification.error',
104
+ defaultMessage: 'An error occurred'
105
+ })
106
+ });
100
107
  return; // Don't close modal on error
101
108
  }
102
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AIUploadModal.mjs","sources":["../../../../admin/src/ai/components/AIUploadModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext } from '@strapi/admin/strapi-admin';\nimport { Alert, Button, Flex, Modal } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AddAssetStep,\n FileWithRawFile,\n} from '../../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useTracking } from '../../hooks/useTracking';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\n\nimport { AIAssetCard, AIAssetCardSkeletons } from './AIAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * ModalBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledModalBody = styled(Modal.Body)`\n padding: 0;\n display: flex;\n justify-content: center;\n\n [data-radix-scroll-area-viewport] {\n padding-top: ${({ theme }) => theme.spaces[6]};\n padding-bottom: ${({ theme }) => theme.spaces[6]};\n padding-left: ${({ theme }) => theme.spaces[7]};\n padding-right: ${({ theme }) => theme.spaces[7]};\n }\n`;\n\nconst StyledAlert = styled(Alert)`\n & > button {\n display: none;\n }\n`;\n\nconst ModalContent = ({ onClose }: Pick<AIUploadModalProps, 'onClose'>) => {\n const { formatMessage } = useIntl();\n const state = useAIUploadModalContext('ModalContent', (s) => s.state);\n const dispatch = useAIUploadModalContext('ModalContent', (s) => s.dispatch);\n const folderId = useAIUploadModalContext('ModalContent', (s) => s.folderId);\n const { upload } = useUpload();\n const { edit, isLoading: isSaving } = useBulkEdit();\n const [isUploading, setIsUploading] = React.useState(false);\n const [uploadError, setUploadError] = React.useState<Error | null>(null);\n const { trackUsage } = useTracking();\n\n const handleCaptionChange = (assetId: number, caption: string) => {\n dispatch({\n type: 'set_uploaded_asset_caption',\n payload: { id: assetId, caption },\n });\n };\n\n const handleAltTextChange = (assetId: number, altText: string) => {\n dispatch({\n type: 'set_uploaded_asset_alt_text',\n payload: { id: assetId, altText },\n });\n };\n\n const resetState = () => {\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n };\n\n const handleFinish = async () => {\n if (state.hasUnsavedChanges) {\n const assetsToUpdate = state.uploadedAssets.filter(\n (asset) => (asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id\n );\n\n if (assetsToUpdate.length > 0) {\n if (assetsToUpdate.some((asset) => asset.wasCaptionChanged)) {\n trackUsage('didEditAICaption');\n }\n\n if (assetsToUpdate.some((asset) => asset.wasAltTextChanged)) {\n trackUsage('didEditAIAlternativeText');\n }\n\n // Update assets\n const updates = assetsToUpdate.map((asset) => ({\n id: asset.file.id!,\n fileInfo: {\n name: asset.file.name,\n alternativeText: asset.file.alternativeText ?? null,\n caption: asset.file.caption ?? null,\n folder:\n typeof asset.file.folder === 'object' && asset.file.folder !== null\n ? // @ts-expect-error types are wrong\n asset.file.folder.id\n : asset.file.folder,\n },\n }));\n\n try {\n await edit(updates);\n dispatch({ type: 'clear_unsaved_changes' });\n } catch (err) {\n console.error('Failed to save asset changes:', err);\n return; // Don't close modal on error\n }\n }\n }\n\n resetState();\n onClose();\n };\n\n const handleCancel = () => {\n resetState();\n onClose();\n };\n\n const handleUpload = async (assets: FileWithRawFile[]) => {\n dispatch({ type: 'set_assets_to_upload_length', payload: assets.length });\n setUploadError(null);\n setIsUploading(true);\n\n try {\n const assetsForUpload = assets.map((asset) => ({\n ...asset,\n id: asset.id ? Number(asset.id) : undefined,\n }));\n\n const uploadedFiles = await upload(assetsForUpload, folderId);\n const filesWithFolder = uploadedFiles.map((file: File) => ({\n ...file,\n // The upload API doesn't populate the folder relation, so we add it manually\n folder: folderId || file.folder,\n }));\n dispatch({ type: 'set_uploaded_assets', payload: filesWithFolder });\n } catch (error) {\n console.error('Upload failed:', error);\n setUploadError(error instanceof Error ? error : new Error('Upload failed'));\n } finally {\n setIsUploading(false);\n }\n };\n\n if (state.assetsToUploadLength === 0) {\n return (\n <Modal.Content>\n <AddAssetStep onClose={onClose} onAddAsset={handleUpload} />\n </Modal.Content>\n );\n }\n\n if (\n isUploading ||\n (state.assetsToUploadLength > 0 && state.uploadedAssets.length === 0 && !uploadError)\n ) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('ai.modal.uploading.title'),\n defaultMessage: 'Uploading and processing with AI...',\n })}\n </Modal.Title>\n </Modal.Header>\n <StyledModalBody>\n <AIAssetCardSkeletons count={state.assetsToUploadLength} />\n </StyledModalBody>\n </Modal.Content>\n );\n }\n\n const title = formatMessage(\n {\n id: getTrad('ai.modal.title'),\n defaultMessage:\n '{count, plural, one {# asset uploaded} other {# assets uploaded}}, review AI generated metadata',\n },\n { count: state.uploadedAssets.length }\n );\n\n if (uploadError) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <StyledAlert closeLabel=\"\" variant=\"danger\">\n {formatMessage({\n id: getTrad('ai.modal.error'),\n defaultMessage: 'Could not generate AI metadata for the uploaded files.',\n })}\n </StyledAlert>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n }\n\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n\n <StyledModalBody>\n <Flex gap={6} direction=\"column\" alignItems=\"stretch\">\n {state.uploadedAssets.map(({ file: asset, wasCaptionChanged, wasAltTextChanged }) => (\n <AIAssetCard\n key={asset.id}\n asset={asset}\n onCaptionChange={(caption: string) =>\n asset.id && handleCaptionChange(asset.id, caption)\n }\n onAltTextChange={(altText: string) =>\n asset.id && handleAltTextChange(asset.id, altText)\n }\n wasCaptionChanged={wasCaptionChanged}\n wasAltTextChanged={wasAltTextChanged}\n />\n ))}\n </Flex>\n </StyledModalBody>\n\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AIUploadModalProps {\n open: boolean;\n onClose: () => void;\n folderId?: number | null;\n}\n\ntype State = {\n uploadedAssets: Array<{ file: File; wasCaptionChanged: boolean; wasAltTextChanged: boolean }>;\n assetsToUploadLength: number;\n hasUnsavedChanges: boolean;\n};\n\ntype Action =\n | {\n type: 'set_uploaded_assets';\n payload: File[];\n }\n | {\n type: 'set_assets_to_upload_length';\n payload: number;\n }\n | {\n type: 'set_uploaded_asset_caption';\n payload: { id: number; caption: string };\n }\n | {\n type: 'set_uploaded_asset_alt_text';\n payload: { id: number; altText: string };\n }\n | {\n type: 'remove_uploaded_asset';\n payload: { id: number };\n }\n | {\n type: 'edit_uploaded_asset';\n payload: { editedAsset: File };\n }\n | {\n type: 'clear_unsaved_changes';\n };\n\nconst [AIUploadModalContext, useAIUploadModalContext] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n folderId: number | null;\n onClose: () => void;\n}>('AIUploadModalContext');\n\nconst reducer = (state: State, action: Action): State => {\n return produce(state, (draft: State) => {\n if (action.type === 'set_uploaded_assets') {\n draft.uploadedAssets = action.payload.map((file) => ({\n file,\n wasCaptionChanged: false,\n wasAltTextChanged: false,\n }));\n draft.hasUnsavedChanges = false;\n }\n\n if (action.type === 'set_assets_to_upload_length') {\n draft.assetsToUploadLength = action.payload;\n }\n\n if (action.type === 'set_uploaded_asset_caption') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.caption !== action.payload.caption) {\n asset.file.caption = action.payload.caption;\n asset.wasCaptionChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'set_uploaded_asset_alt_text') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.alternativeText !== action.payload.altText) {\n asset.file.alternativeText = action.payload.altText;\n asset.wasAltTextChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'remove_uploaded_asset') {\n draft.uploadedAssets = draft.uploadedAssets.filter((a) => a.file.id !== action.payload.id);\n }\n\n if (action.type === 'edit_uploaded_asset') {\n const assetIndex = draft.uploadedAssets.findIndex(\n (a) => a.file.id === action.payload.editedAsset.id\n );\n if (assetIndex !== -1) {\n draft.uploadedAssets[assetIndex] = {\n file: action.payload.editedAsset,\n wasCaptionChanged: draft.uploadedAssets[assetIndex].wasCaptionChanged,\n wasAltTextChanged: draft.uploadedAssets[assetIndex].wasAltTextChanged,\n };\n }\n }\n\n if (action.type === 'clear_unsaved_changes') {\n draft.hasUnsavedChanges = false;\n draft.uploadedAssets.forEach((asset) => {\n asset.wasCaptionChanged = false;\n asset.wasAltTextChanged = false;\n });\n }\n });\n};\n\nexport const AIUploadModal = ({ open, onClose, folderId = null }: AIUploadModalProps) => {\n const [state, dispatch] = React.useReducer(reducer, {\n uploadedAssets: [],\n assetsToUploadLength: 0,\n hasUnsavedChanges: false,\n });\n\n const handleClose = React.useCallback(() => {\n // Reset state when modal closes\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n onClose();\n }, [onClose]);\n\n return (\n <AIUploadModalContext\n state={state}\n dispatch={dispatch}\n folderId={folderId}\n onClose={handleClose}\n >\n <Modal.Root open={open} onOpenChange={handleClose}>\n <ModalContent onClose={handleClose} />\n </Modal.Root>\n </AIUploadModalContext>\n );\n};\n\nexport { useAIUploadModalContext };\n"],"names":["StyledModalBody","styled","Modal","Body","theme","spaces","StyledAlert","Alert","ModalContent","onClose","formatMessage","useIntl","state","useAIUploadModalContext","s","dispatch","folderId","upload","useUpload","edit","isLoading","isSaving","useBulkEdit","isUploading","setIsUploading","React","useState","uploadError","setUploadError","trackUsage","useTracking","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","some","updates","map","fileInfo","name","alternativeText","folder","err","console","error","handleCancel","handleUpload","assets","assetsForUpload","Number","undefined","uploadedFiles","filesWithFolder","Error","assetsToUploadLength","_jsx","Content","AddAssetStep","onAddAsset","_jsxs","Header","Title","getTrad","defaultMessage","AIAssetCardSkeletons","count","title","closeLabel","variant","Footer","Button","onClick","loading","Flex","gap","direction","alignItems","AIAssetCard","onCaptionChange","onAltTextChange","AIUploadModalContext","createContext","reducer","action","produce","draft","find","a","assetIndex","findIndex","editedAsset","forEach","AIUploadModal","open","useReducer","handleClose","useCallback","Root","onOpenChange"],"mappings":"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"}
1
+ {"version":3,"file":"AIUploadModal.mjs","sources":["../../../../admin/src/ai/components/AIUploadModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useNotification } from '@strapi/admin/strapi-admin';\nimport { Alert, Button, Flex, Modal } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n AddAssetStep,\n FileWithRawFile,\n} from '../../components/UploadAssetDialog/AddAssetStep/AddAssetStep';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useTracking } from '../../hooks/useTracking';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad } from '../../utils';\n\nimport { AIAssetCard, AIAssetCardSkeletons } from './AIAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * ModalBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledModalBody = styled(Modal.Body)`\n padding: 0;\n display: flex;\n justify-content: center;\n\n [data-radix-scroll-area-viewport] {\n padding-top: ${({ theme }) => theme.spaces[6]};\n padding-bottom: ${({ theme }) => theme.spaces[6]};\n padding-left: ${({ theme }) => theme.spaces[7]};\n padding-right: ${({ theme }) => theme.spaces[7]};\n }\n`;\n\nconst StyledAlert = styled(Alert)`\n & > button {\n display: none;\n }\n`;\n\nconst ModalContent = ({ onClose }: Pick<AIUploadModalProps, 'onClose'>) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const state = useAIUploadModalContext('ModalContent', (s) => s.state);\n const dispatch = useAIUploadModalContext('ModalContent', (s) => s.dispatch);\n const folderId = useAIUploadModalContext('ModalContent', (s) => s.folderId);\n const { upload } = useUpload();\n const { edit, isLoading: isSaving } = useBulkEdit();\n const [isUploading, setIsUploading] = React.useState(false);\n const [uploadError, setUploadError] = React.useState<Error | null>(null);\n const { trackUsage } = useTracking();\n\n const handleCaptionChange = (assetId: number, caption: string) => {\n dispatch({\n type: 'set_uploaded_asset_caption',\n payload: { id: assetId, caption },\n });\n };\n\n const handleAltTextChange = (assetId: number, altText: string) => {\n dispatch({\n type: 'set_uploaded_asset_alt_text',\n payload: { id: assetId, altText },\n });\n };\n\n const resetState = () => {\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n };\n\n const handleFinish = async () => {\n if (state.hasUnsavedChanges) {\n const assetsToUpdate = state.uploadedAssets.filter(\n (asset) => (asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id\n );\n\n if (assetsToUpdate.length > 0) {\n if (assetsToUpdate.some((asset) => asset.wasCaptionChanged)) {\n trackUsage('didEditAICaption');\n }\n\n if (assetsToUpdate.some((asset) => asset.wasAltTextChanged)) {\n trackUsage('didEditAIAlternativeText');\n }\n\n // Update assets\n const updates = assetsToUpdate.map((asset) => ({\n id: asset.file.id!,\n fileInfo: {\n name: asset.file.name,\n alternativeText: asset.file.alternativeText ?? null,\n caption: asset.file.caption ?? null,\n folder:\n typeof asset.file.folder === 'object' && asset.file.folder !== null\n ? // @ts-expect-error types are wrong\n asset.file.folder.id\n : asset.file.folder,\n },\n }));\n\n try {\n await edit(updates);\n dispatch({ type: 'clear_unsaved_changes' });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message:\n (err instanceof Error ? err.message : null) ||\n formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n return; // Don't close modal on error\n }\n }\n }\n\n resetState();\n onClose();\n };\n\n const handleCancel = () => {\n resetState();\n onClose();\n };\n\n const handleUpload = async (assets: FileWithRawFile[]) => {\n dispatch({ type: 'set_assets_to_upload_length', payload: assets.length });\n setUploadError(null);\n setIsUploading(true);\n\n try {\n const assetsForUpload = assets.map((asset) => ({\n ...asset,\n id: asset.id ? Number(asset.id) : undefined,\n }));\n\n const uploadedFiles = await upload(assetsForUpload, folderId);\n const filesWithFolder = uploadedFiles.map((file: File) => ({\n ...file,\n // The upload API doesn't populate the folder relation, so we add it manually\n folder: folderId || file.folder,\n }));\n dispatch({ type: 'set_uploaded_assets', payload: filesWithFolder });\n } catch (error) {\n console.error('Upload failed:', error);\n setUploadError(error instanceof Error ? error : new Error('Upload failed'));\n } finally {\n setIsUploading(false);\n }\n };\n\n if (state.assetsToUploadLength === 0) {\n return (\n <Modal.Content>\n <AddAssetStep onClose={onClose} onAddAsset={handleUpload} />\n </Modal.Content>\n );\n }\n\n if (\n isUploading ||\n (state.assetsToUploadLength > 0 && state.uploadedAssets.length === 0 && !uploadError)\n ) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('ai.modal.uploading.title'),\n defaultMessage: 'Uploading and processing with AI...',\n })}\n </Modal.Title>\n </Modal.Header>\n <StyledModalBody>\n <AIAssetCardSkeletons count={state.assetsToUploadLength} />\n </StyledModalBody>\n </Modal.Content>\n );\n }\n\n const title = formatMessage(\n {\n id: getTrad('ai.modal.title'),\n defaultMessage:\n '{count, plural, one {# asset uploaded} other {# assets uploaded}}, review AI generated metadata',\n },\n { count: state.uploadedAssets.length }\n );\n\n if (uploadError) {\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <StyledAlert closeLabel=\"\" variant=\"danger\">\n {formatMessage({\n id: getTrad('ai.modal.error'),\n defaultMessage: 'Could not generate AI metadata for the uploaded files.',\n })}\n </StyledAlert>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n }\n\n return (\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n\n <StyledModalBody>\n <Flex gap={6} direction=\"column\" alignItems=\"stretch\">\n {state.uploadedAssets.map(({ file: asset, wasCaptionChanged, wasAltTextChanged }) => (\n <AIAssetCard\n key={asset.id}\n asset={asset}\n onCaptionChange={(caption: string) =>\n asset.id && handleCaptionChange(asset.id, caption)\n }\n onAltTextChange={(altText: string) =>\n asset.id && handleAltTextChange(asset.id, altText)\n }\n wasCaptionChanged={wasCaptionChanged}\n wasAltTextChanged={wasAltTextChanged}\n />\n ))}\n </Flex>\n </StyledModalBody>\n\n <Modal.Footer>\n <Button onClick={handleCancel} variant=\"tertiary\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleFinish} loading={isSaving}>\n {formatMessage({ id: 'global.finish', defaultMessage: 'Finish' })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * UploadModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AIUploadModalProps {\n open: boolean;\n onClose: () => void;\n folderId?: number | null;\n}\n\ntype State = {\n uploadedAssets: Array<{ file: File; wasCaptionChanged: boolean; wasAltTextChanged: boolean }>;\n assetsToUploadLength: number;\n hasUnsavedChanges: boolean;\n};\n\ntype Action =\n | {\n type: 'set_uploaded_assets';\n payload: File[];\n }\n | {\n type: 'set_assets_to_upload_length';\n payload: number;\n }\n | {\n type: 'set_uploaded_asset_caption';\n payload: { id: number; caption: string };\n }\n | {\n type: 'set_uploaded_asset_alt_text';\n payload: { id: number; altText: string };\n }\n | {\n type: 'remove_uploaded_asset';\n payload: { id: number };\n }\n | {\n type: 'edit_uploaded_asset';\n payload: { editedAsset: File };\n }\n | {\n type: 'clear_unsaved_changes';\n };\n\nconst [AIUploadModalContext, useAIUploadModalContext] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n folderId: number | null;\n onClose: () => void;\n}>('AIUploadModalContext');\n\nconst reducer = (state: State, action: Action): State => {\n return produce(state, (draft: State) => {\n if (action.type === 'set_uploaded_assets') {\n draft.uploadedAssets = action.payload.map((file) => ({\n file,\n wasCaptionChanged: false,\n wasAltTextChanged: false,\n }));\n draft.hasUnsavedChanges = false;\n }\n\n if (action.type === 'set_assets_to_upload_length') {\n draft.assetsToUploadLength = action.payload;\n }\n\n if (action.type === 'set_uploaded_asset_caption') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.caption !== action.payload.caption) {\n asset.file.caption = action.payload.caption;\n asset.wasCaptionChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'set_uploaded_asset_alt_text') {\n const asset = draft.uploadedAssets.find((a) => a.file.id === action.payload.id);\n if (asset && asset.file.alternativeText !== action.payload.altText) {\n asset.file.alternativeText = action.payload.altText;\n asset.wasAltTextChanged = true;\n draft.hasUnsavedChanges = true;\n }\n }\n\n if (action.type === 'remove_uploaded_asset') {\n draft.uploadedAssets = draft.uploadedAssets.filter((a) => a.file.id !== action.payload.id);\n }\n\n if (action.type === 'edit_uploaded_asset') {\n const assetIndex = draft.uploadedAssets.findIndex(\n (a) => a.file.id === action.payload.editedAsset.id\n );\n if (assetIndex !== -1) {\n draft.uploadedAssets[assetIndex] = {\n file: action.payload.editedAsset,\n wasCaptionChanged: draft.uploadedAssets[assetIndex].wasCaptionChanged,\n wasAltTextChanged: draft.uploadedAssets[assetIndex].wasAltTextChanged,\n };\n }\n }\n\n if (action.type === 'clear_unsaved_changes') {\n draft.hasUnsavedChanges = false;\n draft.uploadedAssets.forEach((asset) => {\n asset.wasCaptionChanged = false;\n asset.wasAltTextChanged = false;\n });\n }\n });\n};\n\nexport const AIUploadModal = ({ open, onClose, folderId = null }: AIUploadModalProps) => {\n const [state, dispatch] = React.useReducer(reducer, {\n uploadedAssets: [],\n assetsToUploadLength: 0,\n hasUnsavedChanges: false,\n });\n\n const handleClose = React.useCallback(() => {\n // Reset state when modal closes\n dispatch({ type: 'set_uploaded_assets', payload: [] });\n onClose();\n }, [onClose]);\n\n return (\n <AIUploadModalContext\n state={state}\n dispatch={dispatch}\n folderId={folderId}\n onClose={handleClose}\n >\n <Modal.Root open={open} onOpenChange={handleClose}>\n <ModalContent onClose={handleClose} />\n </Modal.Root>\n </AIUploadModalContext>\n );\n};\n\nexport { useAIUploadModalContext };\n"],"names":["StyledModalBody","styled","Modal","Body","theme","spaces","StyledAlert","Alert","ModalContent","onClose","formatMessage","useIntl","toggleNotification","useNotification","state","useAIUploadModalContext","s","dispatch","folderId","upload","useUpload","edit","isLoading","isSaving","useBulkEdit","isUploading","setIsUploading","React","useState","uploadError","setUploadError","trackUsage","useTracking","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","some","updates","map","fileInfo","name","alternativeText","folder","err","message","Error","defaultMessage","handleCancel","handleUpload","assets","assetsForUpload","Number","undefined","uploadedFiles","filesWithFolder","error","console","assetsToUploadLength","_jsx","Content","AddAssetStep","onAddAsset","_jsxs","Header","Title","getTrad","AIAssetCardSkeletons","count","title","closeLabel","variant","Footer","Button","onClick","loading","Flex","gap","direction","alignItems","AIAssetCard","onCaptionChange","onAltTextChange","AIUploadModalContext","createContext","reducer","action","produce","draft","find","a","assetIndex","findIndex","editedAsset","forEach","AIUploadModal","open","useReducer","handleClose","useCallback","Root","onOpenChange"],"mappings":"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"}
@@ -129,7 +129,7 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder })=>{
129
129
  variant: "tertiary",
130
130
  name: "cancel",
131
131
  children: formatMessage({
132
- id: 'cancel',
132
+ id: 'global.cancel',
133
133
  defaultMessage: 'Cancel'
134
134
  })
135
135
  })
@@ -138,7 +138,7 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder })=>{
138
138
  type: "submit",
139
139
  loading: isLoading,
140
140
  children: formatMessage({
141
- id: 'modal.folder.move.submit',
141
+ id: 'global.move',
142
142
  defaultMessage: 'Move'
143
143
  })
144
144
  })
@@ -1 +1 @@
1
- {"version":3,"file":"BulkMoveDialog.js","sources":["../../../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx"],"sourcesContent":["import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n"],"names":["BulkMoveDialog","onClose","selected","currentFolder","formatMessage","useIntl","data","folderStructure","isLoading","useFolderStructure","move","useBulkMove","handleSubmit","values","setErrors","destination","destinationValue","value","error","normalizedError","normalizeAPIError","formikErrors","errors","reduce","acc","path","length","defaultMessage","isEmpty","_jsx","Modal","Content","Body","Flex","justifyContent","paddingTop","paddingBottom","Loader","id","getTrad","initialFormData","label","name","Formik","validateOnChange","onSubmit","initialValues","setFieldValue","_jsxs","Form","noValidate","Header","Title","Grid","Root","gap","Item","xs","col","direction","alignItems","Field","Label","SelectTree","options","onChange","defaultValue","undefined","menuPortalTarget","document","querySelector","inputId","ariaErrorMessage","Typography","variant","tag","textColor","Footer","Close","Button","type","loading"],"mappings":"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"}
1
+ {"version":3,"file":"BulkMoveDialog.js","sources":["../../../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx"],"sourcesContent":["import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'global.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n"],"names":["BulkMoveDialog","onClose","selected","currentFolder","formatMessage","useIntl","data","folderStructure","isLoading","useFolderStructure","move","useBulkMove","handleSubmit","values","setErrors","destination","destinationValue","value","error","normalizedError","normalizeAPIError","formikErrors","errors","reduce","acc","path","length","defaultMessage","isEmpty","_jsx","Modal","Content","Body","Flex","justifyContent","paddingTop","paddingBottom","Loader","id","getTrad","initialFormData","label","name","Formik","validateOnChange","onSubmit","initialValues","setFieldValue","_jsxs","Form","noValidate","Header","Title","Grid","Root","gap","Item","xs","col","direction","alignItems","Field","Label","SelectTree","options","onChange","defaultValue","undefined","menuPortalTarget","document","querySelector","inputId","ariaErrorMessage","Typography","variant","tag","textColor","Footer","Close","Button","type","loading"],"mappings":"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"}
@@ -127,7 +127,7 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder })=>{
127
127
  variant: "tertiary",
128
128
  name: "cancel",
129
129
  children: formatMessage({
130
- id: 'cancel',
130
+ id: 'global.cancel',
131
131
  defaultMessage: 'Cancel'
132
132
  })
133
133
  })
@@ -136,7 +136,7 @@ const BulkMoveDialog = ({ onClose, selected = [], currentFolder })=>{
136
136
  type: "submit",
137
137
  loading: isLoading,
138
138
  children: formatMessage({
139
- id: 'modal.folder.move.submit',
139
+ id: 'global.move',
140
140
  defaultMessage: 'Move'
141
141
  })
142
142
  })
@@ -1 +1 @@
1
- {"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx"],"sourcesContent":["import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'modal.folder.move.submit', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n"],"names":["BulkMoveDialog","onClose","selected","currentFolder","formatMessage","useIntl","data","folderStructure","isLoading","useFolderStructure","move","useBulkMove","handleSubmit","values","setErrors","destination","destinationValue","value","error","normalizedError","normalizeAPIError","formikErrors","errors","reduce","acc","path","length","defaultMessage","isEmpty","_jsx","Modal","Content","Body","Flex","justifyContent","paddingTop","paddingBottom","Loader","id","getTrad","initialFormData","label","name","Formik","validateOnChange","onSubmit","initialValues","setFieldValue","_jsxs","Form","noValidate","Header","Title","Grid","Root","gap","Item","xs","col","direction","alignItems","Field","Label","SelectTree","options","onChange","defaultValue","undefined","menuPortalTarget","document","querySelector","inputId","ariaErrorMessage","Typography","variant","tag","textColor","Footer","Close","Button","type","loading"],"mappings":"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"}
1
+ {"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../admin/src/components/BulkMoveDialog/BulkMoveDialog.tsx"],"sourcesContent":["import { Button, Flex, Grid, Field, Loader, Modal, Typography } from '@strapi/design-system';\nimport { Form, Formik, FormikErrors } from 'formik';\nimport isEmpty from 'lodash/isEmpty';\nimport { useIntl } from 'react-intl';\n\nimport { File } from '../../../../shared/contracts/files';\nimport { useBulkMove } from '../../hooks/useBulkMove';\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getTrad, normalizeAPIError } from '../../utils';\nimport { SelectTree } from '../SelectTree/SelectTree';\n\nimport type { Folder } from '../../../../shared/contracts/folders';\nimport type { OptionSelectTree } from '../SelectTree/SelectTree';\nimport type { FetchError } from '@strapi/admin/strapi-admin';\n\ntype InitialFormData = {\n destination:\n | {\n value: string | number;\n label: string;\n }\n | string;\n};\n\ninterface FolderWithType extends Folder {\n type: string;\n}\n\ninterface FileWithType extends File {\n type: string;\n}\n\nexport interface BulkMoveDialogProps {\n onClose: () => void;\n selected?: Array<FolderWithType | FileWithType>;\n currentFolder?: FolderWithType;\n}\n\nexport const BulkMoveDialog = ({ onClose, selected = [], currentFolder }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure, isLoading } = useFolderStructure();\n const { move } = useBulkMove();\n\n if (!folderStructure) {\n return null;\n }\n\n const handleSubmit = async (\n values: InitialFormData,\n { setErrors }: { setErrors: (errors: FormikErrors<InitialFormData>) => void }\n ) => {\n try {\n if (typeof values.destination !== 'string') {\n const destinationValue = values.destination.value;\n await move(destinationValue, selected);\n onClose();\n }\n } catch (error) {\n const normalizedError = normalizeAPIError(error as FetchError)!;\n\n if (normalizedError && 'errors' in normalizedError) {\n const formikErrors = normalizedError.errors?.reduce<Record<string, string>>(\n (acc, error) => {\n acc[error.values?.path?.length || 'destination'] = error.defaultMessage;\n\n return acc;\n },\n {}\n );\n\n if (!isEmpty(formikErrors)) {\n setErrors(formikErrors);\n }\n }\n }\n };\n\n if (isLoading) {\n return (\n <Modal.Content>\n <Modal.Body>\n <Flex justifyContent=\"center\" paddingTop={4} paddingBottom={4}>\n <Loader>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </Flex>\n </Modal.Body>\n </Modal.Content>\n );\n }\n\n const initialFormData: InitialFormData = {\n destination: {\n value: currentFolder?.id || '',\n label: currentFolder?.name || folderStructure[0].label,\n },\n };\n\n return (\n <Modal.Content>\n <Formik validateOnChange={false} onSubmit={handleSubmit} initialValues={initialFormData}>\n {({ values, errors, setFieldValue }) => (\n <Form noValidate>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('modal.folder.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n\n <Modal.Body>\n <Grid.Root gap={4}>\n <Grid.Item xs={12} col={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root id=\"folder-destination\">\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.folder-location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n\n <SelectTree\n options={folderStructure as OptionSelectTree[]}\n onChange={(value: Record<string, string | number>) => {\n setFieldValue('destination', value);\n }}\n defaultValue={\n typeof values.destination !== 'string' ? values.destination : undefined\n }\n name=\"destination\"\n menuPortalTarget={document.querySelector('body')}\n inputId=\"folder-destination\"\n error={errors?.destination}\n ariaErrorMessage=\"destination-error\"\n />\n\n {errors.destination && (\n <Typography variant=\"pi\" tag=\"p\" textColor=\"danger600\">\n {errors.destination}\n </Typography>\n )}\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Modal.Body>\n\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'global.cancel', defaultMessage: 'Cancel' })}\n </Button>\n </Modal.Close>\n <Button type=\"submit\" loading={isLoading}>\n {formatMessage({ id: 'global.move', defaultMessage: 'Move' })}\n </Button>\n </Modal.Footer>\n </Form>\n )}\n </Formik>\n </Modal.Content>\n );\n};\n"],"names":["BulkMoveDialog","onClose","selected","currentFolder","formatMessage","useIntl","data","folderStructure","isLoading","useFolderStructure","move","useBulkMove","handleSubmit","values","setErrors","destination","destinationValue","value","error","normalizedError","normalizeAPIError","formikErrors","errors","reduce","acc","path","length","defaultMessage","isEmpty","_jsx","Modal","Content","Body","Flex","justifyContent","paddingTop","paddingBottom","Loader","id","getTrad","initialFormData","label","name","Formik","validateOnChange","onSubmit","initialValues","setFieldValue","_jsxs","Form","noValidate","Header","Title","Grid","Root","gap","Item","xs","col","direction","alignItems","Field","Label","SelectTree","options","onChange","defaultValue","undefined","menuPortalTarget","document","querySelector","inputId","ariaErrorMessage","Typography","variant","tag","textColor","Footer","Close","Button","type","loading"],"mappings":"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"}
@@ -29,7 +29,7 @@ function _interopNamespaceDefault(e) {
29
29
 
30
30
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
31
31
 
32
- const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disabled = false, error, hint, label, labelAction, onAddAsset, onDeleteAsset, onDeleteAssetFromMediaLibrary, onDropAsset, onEditAsset, onNext, onPrevious, required = false, selectedAssetIndex, trackedLocation }, forwardedRef)=>{
32
+ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disabled = false, error, hint, label, labelAction, onAddAsset, onDeleteAsset, onDeleteAssetFromMediaLibrary, onDropAsset, onEditAsset, onNext, onPrevious, onDoubleClickAsset, required = false, selectedAssetIndex, trackedLocation }, forwardedRef)=>{
33
33
  const { formatMessage } = reactIntl.useIntl();
34
34
  const [isEditingAsset, setIsEditingAsset] = React__namespace.useState(false);
35
35
  const currentAsset = assets[selectedAssetIndex];
@@ -82,6 +82,11 @@ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disa
82
82
  n: index + 1,
83
83
  m: assets.length
84
84
  }),
85
+ onDoubleClick: (event)=>{
86
+ setIsEditingAsset(true);
87
+ onDoubleClickAsset(asset, event);
88
+ },
89
+ "aria-selected": currentAsset.id === asset.id,
85
90
  children: /*#__PURE__*/ jsxRuntime.jsx(CarouselAsset.CarouselAsset, {
86
91
  asset: asset
87
92
  })
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselAssets.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n const canEditMedia = !disabled && onEditAsset;\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={canEditMedia ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","canEditMedia","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":"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"}
1
+ {"version":3,"file":"CarouselAssets.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n onDoubleClickAsset: (asset: FileAsset, event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n onDoubleClickAsset,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n const canEditMedia = !disabled && onEditAsset;\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={canEditMedia ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n onDoubleClick={(event) => {\n setIsEditingAsset(true);\n onDoubleClickAsset(asset, event);\n }}\n aria-selected={currentAsset.id === asset.id}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","onDoubleClickAsset","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","canEditMedia","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","onDoubleClick","event","aria-selected","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0CaA,cAAiBC,iBAAAA,gBAAAA,CAAMC,UAAU,CAC5C,CACE,EACEC,MAAM,EACNC,WAAW,KAAK,EAChBC,KAAK,EACLC,IAAI,EACJC,KAAK,EACLC,WAAW,EACXC,UAAU,EACVC,aAAa,EACbC,6BAA6B,EAC7BC,WAAW,EACXC,WAAW,EACXC,MAAM,EACNC,UAAU,EACVC,kBAAkB,EAClBC,WAAW,KAAK,EAChBC,kBAAkB,EAClBC,eAAe,EACK,EACtBC,YAAAA,GAAAA;IAEA,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,cAAgBC,EAAAA,iBAAAA,CAAkB,GAAGvB,gBAAAA,CAAMwB,QAAQ,CAAC,KAAA,CAAA;IAE3D,MAAMC,YAAAA,GAAevB,MAAM,CAACe,kBAAmB,CAAA;IAC/C,MAAMS,YAAAA,GAAe,CAACvB,QAAYS,IAAAA,WAAAA;IAElC,qBACEe,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAACC,CAAAA,0BAAAA,EAAAA;gBACCC,GAAKZ,EAAAA,YAAAA;gBACLb,KAAOA,EAAAA,KAAAA;gBACPC,WAAaA,EAAAA,WAAAA;AACbyB,gBAAAA,cAAAA,EAAgBP,YAAcQ,EAAAA,IAAAA;gBAC9BC,aAAejB,EAAAA,kBAAAA;AACfkB,gBAAAA,aAAAA,EAAef,aAAc,CAAA;AAC3BgB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,yCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACAC,gBAAAA,SAAAA,EAAWnB,aAAc,CAAA;AACvBgB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,qCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA,CAAA;gBACAzB,MAAQA,EAAAA,MAAAA;gBACRC,UAAYA,EAAAA,UAAAA;gBACZT,IAAMA,EAAAA,IAAAA;gBACND,KAAOA,EAAAA,KAAAA;gBACPY,QAAUA,EAAAA,QAAAA;AACVwB,gBAAAA,OAAAA,EACEf,6BACEI,cAACY,CAAAA,yCAAAA,EAAAA;oBACCC,KAAOjB,EAAAA,YAAAA;AACPhB,oBAAAA,aAAAA,EAAeN,WAAWwC,SAAYlC,GAAAA,aAAAA;AACtCD,oBAAAA,UAAAA,EAAYL,WAAWwC,SAAYnC,GAAAA,UAAAA;oBACnCI,WAAac,EAAAA,YAAAA,GAAe,IAAMH,iBAAAA,CAAkB,IAAQoB,CAAAA,GAAAA;AAE5DA,iBAAAA,CAAAA,GAAAA,SAAAA;0BAGLzC,MAAO0C,CAAAA,MAAM,KAAK,CAAA,iBACjBf,cAACgB,CAAAA,0BAAAA,EAAAA;AACCvC,oBAAAA,KAAAA,EAAOc,aACL,CAAA;AACEgB,wBAAAA,EAAAA,EAAIC,eAAQ,CAAA,8BAAA,CAAA;wBACZC,cAAgB,EAAA;qBAElB,EAAA;wBAAEQ,CAAG,EAAA,CAAA;wBAAGC,CAAG,EAAA;AAAE,qBAAA,CAAA;AAGf,oBAAA,QAAA,gBAAAlB,cAACmB,CAAAA,+BAAAA,EAAAA;wBACC7C,QAAUA,EAAAA,QAAAA;wBACV8C,OAASzC,EAAAA,UAAAA;wBACTG,WAAaA,EAAAA;;AAIjBT,iBAAAA,CAAAA,GAAAA,MAAAA,CAAOgD,GAAG,CAAC,CAACR,KAAAA,EAAOS,sBACjBtB,cAACgB,CAAAA,0BAAAA,EAAAA;AAECvC,wBAAAA,KAAAA,EAAOc,aACL,CAAA;AACEgB,4BAAAA,EAAAA,EAAIC,eAAQ,CAAA,8BAAA,CAAA;4BACZC,cAAgB,EAAA;yBAElB,EAAA;AAAEQ,4BAAAA,CAAAA,EAAGK,KAAQ,GAAA,CAAA;AAAGJ,4BAAAA,CAAAA,EAAG7C,OAAO0C;AAAO,yBAAA,CAAA;AAEnCQ,wBAAAA,aAAAA,EAAe,CAACC,KAAAA,GAAAA;4BACd9B,iBAAkB,CAAA,IAAA,CAAA;AAClBR,4BAAAA,kBAAAA,CAAmB2B,KAAOW,EAAAA,KAAAA,CAAAA;AAC5B,yBAAA;AACAC,wBAAAA,eAAAA,EAAe7B,YAAaW,CAAAA,EAAE,KAAKM,KAAAA,CAAMN,EAAE;AAE3C,wBAAA,QAAA,gBAAAP,cAAC0B,CAAAA,2BAAAA,EAAAA;4BAAcb,KAAOA,EAAAA;;AAdjBA,qBAAAA,EAAAA,KAAAA,CAAMN,EAAE,CAAA;;0BAmBrBP,cAAC2B,CAAAA,gCAAAA,EAAAA;gBACCC,IAAMnC,EAAAA,cAAAA;AACNoC,gBAAAA,OAAAA,EAAS,CAACC,WAAAA,GAAAA;oBACRpC,iBAAkB,CAAA,KAAA,CAAA;;AAGlB,oBAAA,IAAIoC,gBAAgB,IAAM,EAAA;AACxBjD,wBAAAA,6BAAAA,EAAAA;AACF;oBACA,IAAIiD,WAAAA,IAAe,OAAOA,WAAAA,KAAgB,SAAW,EAAA;wBACnD/C,WAAc+C,GAAAA,WAAAA,CAAAA;AAChB;AACF,iBAAA;gBACAjB,KAAOjB,EAAAA,YAAAA;gBACPmC,SAAS,EAAA,IAAA;gBACTC,WAAW,EAAA,IAAA;gBACXC,WAAW,EAAA,IAAA;gBACX5C,eAAiBA,EAAAA;;;;AAIzB,CACA;;;;"}
@@ -8,7 +8,7 @@ import { CarouselAsset } from './CarouselAsset.mjs';
8
8
  import { CarouselAssetActions } from './CarouselAssetActions.mjs';
9
9
  import { EmptyStateAsset } from './EmptyStateAsset.mjs';
10
10
 
11
- const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = false, error, hint, label, labelAction, onAddAsset, onDeleteAsset, onDeleteAssetFromMediaLibrary, onDropAsset, onEditAsset, onNext, onPrevious, required = false, selectedAssetIndex, trackedLocation }, forwardedRef)=>{
11
+ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = false, error, hint, label, labelAction, onAddAsset, onDeleteAsset, onDeleteAssetFromMediaLibrary, onDropAsset, onEditAsset, onNext, onPrevious, onDoubleClickAsset, required = false, selectedAssetIndex, trackedLocation }, forwardedRef)=>{
12
12
  const { formatMessage } = useIntl();
13
13
  const [isEditingAsset, setIsEditingAsset] = React.useState(false);
14
14
  const currentAsset = assets[selectedAssetIndex];
@@ -61,6 +61,11 @@ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = fals
61
61
  n: index + 1,
62
62
  m: assets.length
63
63
  }),
64
+ onDoubleClick: (event)=>{
65
+ setIsEditingAsset(true);
66
+ onDoubleClickAsset(asset, event);
67
+ },
68
+ "aria-selected": currentAsset.id === asset.id,
64
69
  children: /*#__PURE__*/ jsx(CarouselAsset, {
65
70
  asset: asset
66
71
  })