@strapi/upload 5.27.0 → 5.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/ai/components/AIUploadModal.js +8 -0
- package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
- package/dist/admin/ai/components/AIUploadModal.mjs +9 -1
- package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -3
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +4 -4
- package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +2 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +2 -1
- package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.js +11 -6
- package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
- package/dist/admin/components/SelectTree/utils/flattenTree.mjs +11 -6
- package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
- package/dist/admin/package.json.js +5 -5
- package/dist/admin/package.json.mjs +5 -5
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +0 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +0 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +8 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +8 -1
- package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +9 -4
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +9 -4
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +3 -1
- package/dist/admin/utils/getFolderParents.js +2 -1
- package/dist/admin/utils/getFolderParents.js.map +1 -1
- package/dist/admin/utils/getFolderParents.mjs +2 -1
- package/dist/admin/utils/getFolderParents.mjs.map +1 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +11 -1
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +11 -1
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/services/weekly-metrics.js +5 -1
- package/dist/server/services/weekly-metrics.js.map +1 -1
- package/dist/server/services/weekly-metrics.mjs +5 -1
- package/dist/server/services/weekly-metrics.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/weekly-metrics.d.ts +1 -0
- package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -65,6 +65,7 @@ const ModalContent = ({ onClose })=>{
|
|
|
65
65
|
const { edit, isLoading: isSaving } = useBulkEdit.useBulkEdit();
|
|
66
66
|
const [isUploading, setIsUploading] = React__namespace.useState(false);
|
|
67
67
|
const [uploadError, setUploadError] = React__namespace.useState(null);
|
|
68
|
+
const { trackUsage } = strapiAdmin.useTracking();
|
|
68
69
|
const handleCaptionChange = (assetId, caption)=>{
|
|
69
70
|
dispatch({
|
|
70
71
|
type: 'set_uploaded_asset_caption',
|
|
@@ -93,6 +94,13 @@ const ModalContent = ({ onClose })=>{
|
|
|
93
94
|
if (state.hasUnsavedChanges) {
|
|
94
95
|
const assetsToUpdate = state.uploadedAssets.filter((asset)=>(asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id);
|
|
95
96
|
if (assetsToUpdate.length > 0) {
|
|
97
|
+
if (assetsToUpdate.some((asset)=>asset.wasCaptionChanged)) {
|
|
98
|
+
trackUsage('didEditAICaption');
|
|
99
|
+
}
|
|
100
|
+
if (assetsToUpdate.some((asset)=>asset.wasAltTextChanged)) {
|
|
101
|
+
trackUsage('didEditAIAlternativeText');
|
|
102
|
+
}
|
|
103
|
+
// Update assets
|
|
96
104
|
const updates = assetsToUpdate.map((asset)=>({
|
|
97
105
|
id: asset.file.id,
|
|
98
106
|
fileInfo: {
|
|
@@ -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 { 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\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 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","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA;;AAEkG,qGAElG,MAAMA,eAAkBC,GAAAA,uBAAAA,CAAOC,kBAAMC,CAAAA,IAAI,CAAC;;;;;;iBAMzB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;oBAC9B,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;kBACnC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;mBAChC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;;AAEpD,CAAC;AAED,MAAMC,WAAAA,GAAcL,uBAAOM,CAAAA,kBAAAA,CAAM;;;;AAIjC,CAAC;AAED,MAAMC,YAAe,GAAA,CAAC,EAAEC,OAAO,EAAuC,GAAA;IACpE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQC,uBAAwB,CAAA,cAAA,EAAgB,CAACC,CAAAA,GAAMA,EAAEF,KAAK,CAAA;AACpE,IAAA,MAAMG,WAAWF,uBAAwB,CAAA,cAAA,EAAgB,CAACC,CAAAA,GAAMA,EAAEC,QAAQ,CAAA;AAC1E,IAAA,MAAMC,WAAWH,uBAAwB,CAAA,cAAA,EAAgB,CAACC,CAAAA,GAAMA,EAAEE,QAAQ,CAAA;IAC1E,MAAM,EAAEC,MAAM,EAAE,GAAGC,mBAAAA,EAAAA;AACnB,IAAA,MAAM,EAAEC,IAAI,EAAEC,SAAWC,EAAAA,QAAQ,EAAE,GAAGC,uBAAAA,EAAAA;AACtC,IAAA,MAAM,CAACC,WAAaC,EAAAA,cAAAA,CAAe,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACrD,IAAA,MAAM,CAACC,WAAaC,EAAAA,cAAAA,CAAe,GAAGH,gBAAAA,CAAMC,QAAQ,CAAe,IAAA,CAAA;IAEnE,MAAMG,mBAAAA,GAAsB,CAACC,OAAiBC,EAAAA,OAAAA,GAAAA;QAC5ChB,QAAS,CAAA;YACPiB,IAAM,EAAA,4BAAA;YACNC,OAAS,EAAA;gBAAEC,EAAIJ,EAAAA,OAAAA;AAASC,gBAAAA;AAAQ;AAClC,SAAA,CAAA;AACF,KAAA;IAEA,MAAMI,mBAAAA,GAAsB,CAACL,OAAiBM,EAAAA,OAAAA,GAAAA;QAC5CrB,QAAS,CAAA;YACPiB,IAAM,EAAA,6BAAA;YACNC,OAAS,EAAA;gBAAEC,EAAIJ,EAAAA,OAAAA;AAASM,gBAAAA;AAAQ;AAClC,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMC,UAAa,GAAA,IAAA;QACjBtB,QAAS,CAAA;YAAEiB,IAAM,EAAA,qBAAA;AAAuBC,YAAAA,OAAAA,EAAS;AAAG,SAAA,CAAA;AACtD,KAAA;AAEA,IAAA,MAAMK,YAAe,GAAA,UAAA;QACnB,IAAI1B,KAAAA,CAAM2B,iBAAiB,EAAE;YAC3B,MAAMC,cAAAA,GAAiB5B,MAAM6B,cAAc,CAACC,MAAM,CAChD,CAACC,QAAU,CAACA,MAAMC,iBAAiB,IAAID,MAAME,iBAAgB,KAAMF,KAAMG,CAAAA,IAAI,CAACZ,EAAE,CAAA;YAGlF,IAAIM,cAAAA,CAAeO,MAAM,GAAG,CAAG,EAAA;AAC7B,gBAAA,MAAMC,UAAUR,cAAeS,CAAAA,GAAG,CAAC,CAACN,SAAW;wBAC7CT,EAAIS,EAAAA,KAAAA,CAAMG,IAAI,CAACZ,EAAE;wBACjBgB,QAAU,EAAA;4BACRC,IAAMR,EAAAA,KAAAA,CAAMG,IAAI,CAACK,IAAI;AACrBC,4BAAAA,eAAAA,EAAiBT,KAAMG,CAAAA,IAAI,CAACM,eAAe,IAAI,IAAA;AAC/CrB,4BAAAA,OAAAA,EAASY,KAAMG,CAAAA,IAAI,CAACf,OAAO,IAAI,IAAA;4BAC/BsB,MACE,EAAA,OAAOV,MAAMG,IAAI,CAACO,MAAM,KAAK,QAAA,IAAYV,KAAMG,CAAAA,IAAI,CAACO,MAAM,KAAK,IAE3DV,GAAAA,KAAAA,CAAMG,IAAI,CAACO,MAAM,CAACnB,EAAE,GACpBS,KAAAA,CAAMG,IAAI,CAACO;AACnB;qBACF,CAAA,CAAA;gBAEA,IAAI;AACF,oBAAA,MAAMlC,IAAK6B,CAAAA,OAAAA,CAAAA;oBACXjC,QAAS,CAAA;wBAAEiB,IAAM,EAAA;AAAwB,qBAAA,CAAA;AAC3C,iBAAA,CAAE,OAAOsB,GAAK,EAAA;oBACZC,OAAQC,CAAAA,KAAK,CAAC,+BAAiCF,EAAAA,GAAAA,CAAAA;AAC/C,oBAAA,OAAA;AACF;AACF;AACF;AAEAjB,QAAAA,UAAAA,EAAAA;AACA5B,QAAAA,OAAAA,EAAAA;AACF,KAAA;AAEA,IAAA,MAAMgD,YAAe,GAAA,IAAA;AACnBpB,QAAAA,UAAAA,EAAAA;AACA5B,QAAAA,OAAAA,EAAAA;AACF,KAAA;AAEA,IAAA,MAAMiD,eAAe,OAAOC,MAAAA,GAAAA;QAC1B5C,QAAS,CAAA;YAAEiB,IAAM,EAAA,6BAAA;AAA+BC,YAAAA,OAAAA,EAAS0B,OAAOZ;AAAO,SAAA,CAAA;QACvEnB,cAAe,CAAA,IAAA,CAAA;QACfJ,cAAe,CAAA,IAAA,CAAA;QAEf,IAAI;AACF,YAAA,MAAMoC,kBAAkBD,MAAOV,CAAAA,GAAG,CAAC,CAACN,SAAW;AAC7C,oBAAA,GAAGA,KAAK;AACRT,oBAAAA,EAAAA,EAAIS,MAAMT,EAAE,GAAG2B,MAAOlB,CAAAA,KAAAA,CAAMT,EAAE,CAAI4B,GAAAA;iBACpC,CAAA,CAAA;YAEA,MAAMC,aAAAA,GAAgB,MAAM9C,MAAAA,CAAO2C,eAAiB5C,EAAAA,QAAAA,CAAAA;AACpD,YAAA,MAAMgD,kBAAkBD,aAAcd,CAAAA,GAAG,CAAC,CAACH,QAAgB;AACzD,oBAAA,GAAGA,IAAI;;oBAEPO,MAAQrC,EAAAA,QAAAA,IAAY8B,KAAKO;iBAC3B,CAAA,CAAA;YACAtC,QAAS,CAAA;gBAAEiB,IAAM,EAAA,qBAAA;gBAAuBC,OAAS+B,EAAAA;AAAgB,aAAA,CAAA;AACnE,SAAA,CAAE,OAAOR,KAAO,EAAA;YACdD,OAAQC,CAAAA,KAAK,CAAC,gBAAkBA,EAAAA,KAAAA,CAAAA;AAChC5B,YAAAA,cAAAA,CAAe4B,KAAiBS,YAAAA,KAAAA,GAAQT,KAAQ,GAAA,IAAIS,KAAM,CAAA,eAAA,CAAA,CAAA;SAClD,QAAA;YACRzC,cAAe,CAAA,KAAA,CAAA;AACjB;AACF,KAAA;IAEA,IAAIZ,KAAAA,CAAMsD,oBAAoB,KAAK,CAAG,EAAA;QACpC,qBACEC,cAAA,CAACjE,mBAAMkE,OAAO,EAAA;AACZ,YAAA,QAAA,gBAAAD,cAACE,CAAAA,yBAAAA,EAAAA;gBAAa5D,OAASA,EAAAA,OAAAA;gBAAS6D,UAAYZ,EAAAA;;;AAGlD;AAEA,IAAA,IACEnC,WACCX,IAAAA,KAAAA,CAAMsD,oBAAoB,GAAG,CAAKtD,IAAAA,KAAAA,CAAM6B,cAAc,CAACM,MAAM,KAAK,CAAK,IAAA,CAACpB,WACzE,EAAA;QACA,qBACE4C,eAAA,CAACrE,mBAAMkE,OAAO,EAAA;;AACZ,8BAAAD,cAAA,CAACjE,mBAAMsE,MAAM,EAAA;4CACXL,cAAA,CAACjE,mBAAMuE,KAAK,EAAA;kCACT/D,aAAc,CAAA;AACbwB,4BAAAA,EAAAA,EAAIwC,eAAQ,CAAA,0BAAA,CAAA;4BACZC,cAAgB,EAAA;AAClB,yBAAA;;;8BAGJR,cAACnE,CAAAA,eAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAmE,cAACS,CAAAA,gCAAAA,EAAAA;AAAqBC,wBAAAA,KAAAA,EAAOjE,MAAMsD;;;;;AAI3C;AAEA,IAAA,MAAMY,QAAQpE,aACZ,CAAA;AACEwB,QAAAA,EAAAA,EAAIwC,eAAQ,CAAA,gBAAA,CAAA;QACZC,cACE,EAAA;KAEJ,EAAA;QAAEE,KAAOjE,EAAAA,KAAAA,CAAM6B,cAAc,CAACM;AAAO,KAAA,CAAA;AAGvC,IAAA,IAAIpB,WAAa,EAAA;QACf,qBACE4C,eAAA,CAACrE,mBAAMkE,OAAO,EAAA;;AACZ,8BAAAD,cAAA,CAACjE,mBAAMsE,MAAM,EAAA;4CACXL,cAAA,CAACjE,mBAAMuE,KAAK,EAAA;AAAEK,wBAAAA,QAAAA,EAAAA;;;AAEhB,8BAAAX,cAAA,CAACjE,mBAAMC,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAAgE,cAAC7D,CAAAA,WAAAA,EAAAA;wBAAYyE,UAAW,EAAA,EAAA;wBAAGC,OAAQ,EAAA,QAAA;kCAChCtE,aAAc,CAAA;AACbwB,4BAAAA,EAAAA,EAAIwC,eAAQ,CAAA,gBAAA,CAAA;4BACZC,cAAgB,EAAA;AAClB,yBAAA;;;AAGJ,8BAAAJ,eAAA,CAACrE,mBAAM+E,MAAM,EAAA;;sCACXd,cAACe,CAAAA,mBAAAA,EAAAA;4BAAOC,OAAS1B,EAAAA,YAAAA;4BAAcuB,OAAQ,EAAA,UAAA;sCACpCtE,aAAc,CAAA;gCAAEwB,EAAI,EAAA,QAAA;gCAAUyC,cAAgB,EAAA;AAAS,6BAAA;;sCAE1DR,cAACe,CAAAA,mBAAAA,EAAAA;4BAAOC,OAAS7C,EAAAA,YAAAA;4BAAc8C,OAAS/D,EAAAA,QAAAA;sCACrCX,aAAc,CAAA;gCAAEwB,EAAI,EAAA,eAAA;gCAAiByC,cAAgB,EAAA;AAAS,6BAAA;;;;;;AAKzE;IAEA,qBACEJ,eAAA,CAACrE,mBAAMkE,OAAO,EAAA;;AACZ,0BAAAD,cAAA,CAACjE,mBAAMsE,MAAM,EAAA;wCACXL,cAAA,CAACjE,mBAAMuE,KAAK,EAAA;AAAEK,oBAAAA,QAAAA,EAAAA;;;0BAGhBX,cAACnE,CAAAA,eAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAmE,cAACkB,CAAAA,iBAAAA,EAAAA;oBAAKC,GAAK,EAAA,CAAA;oBAAGC,SAAU,EAAA,QAAA;oBAASC,UAAW,EAAA,SAAA;AACzC5E,oBAAAA,QAAAA,EAAAA,KAAAA,CAAM6B,cAAc,CAACQ,GAAG,CAAC,CAAC,EAAEH,IAAAA,EAAMH,KAAK,EAAEC,iBAAiB,EAAEC,iBAAiB,EAAE,iBAC9EsB,cAACsB,CAAAA,uBAAAA,EAAAA;4BAEC9C,KAAOA,EAAAA,KAAAA;4BACP+C,eAAiB,EAAA,CAAC3D,UAChBY,KAAMT,CAAAA,EAAE,IAAIL,mBAAoBc,CAAAA,KAAAA,CAAMT,EAAE,EAAEH,OAAAA,CAAAA;4BAE5C4D,eAAiB,EAAA,CAACvD,UAChBO,KAAMT,CAAAA,EAAE,IAAIC,mBAAoBQ,CAAAA,KAAAA,CAAMT,EAAE,EAAEE,OAAAA,CAAAA;4BAE5CQ,iBAAmBA,EAAAA,iBAAAA;4BACnBC,iBAAmBA,EAAAA;AATdF,yBAAAA,EAAAA,KAAAA,CAAMT,EAAE,CAAA;;;AAerB,0BAAAqC,eAAA,CAACrE,mBAAM+E,MAAM,EAAA;;kCACXd,cAACe,CAAAA,mBAAAA,EAAAA;wBAAOC,OAAS1B,EAAAA,YAAAA;wBAAcuB,OAAQ,EAAA,UAAA;kCACpCtE,aAAc,CAAA;4BAAEwB,EAAI,EAAA,QAAA;4BAAUyC,cAAgB,EAAA;AAAS,yBAAA;;kCAE1DR,cAACe,CAAAA,mBAAAA,EAAAA;wBAAOC,OAAS7C,EAAAA,YAAAA;wBAAc8C,OAAS/D,EAAAA,QAAAA;kCACrCX,aAAc,CAAA;4BAAEwB,EAAI,EAAA,eAAA;4BAAiByC,cAAgB,EAAA;AAAS,yBAAA;;;;;;AAKzE,CAAA;AA+CA,MAAM,CAACiB,oBAAAA,EAAsB/E,uBAAwB,CAAA,GAAGgF,yBAKrD,CAAA,sBAAA;AAEH,MAAMC,OAAAA,GAAU,CAAClF,KAAcmF,EAAAA,MAAAA,GAAAA;IAC7B,OAAOC,aAAAA,CAAQpF,OAAO,CAACqF,KAAAA,GAAAA;QACrB,IAAIF,MAAAA,CAAO/D,IAAI,KAAK,qBAAuB,EAAA;YACzCiE,KAAMxD,CAAAA,cAAc,GAAGsD,MAAO9D,CAAAA,OAAO,CAACgB,GAAG,CAAC,CAACH,IAAAA,IAAU;AACnDA,oBAAAA,IAAAA;oBACAF,iBAAmB,EAAA,KAAA;oBACnBC,iBAAmB,EAAA;iBACrB,CAAA,CAAA;AACAoD,YAAAA,KAAAA,CAAM1D,iBAAiB,GAAG,KAAA;AAC5B;QAEA,IAAIwD,MAAAA,CAAO/D,IAAI,KAAK,6BAA+B,EAAA;YACjDiE,KAAM/B,CAAAA,oBAAoB,GAAG6B,MAAAA,CAAO9D,OAAO;AAC7C;QAEA,IAAI8D,MAAAA,CAAO/D,IAAI,KAAK,4BAA8B,EAAA;AAChD,YAAA,MAAMW,QAAQsD,KAAMxD,CAAAA,cAAc,CAACyD,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAErD,CAAAA,IAAI,CAACZ,EAAE,KAAK6D,MAAO9D,CAAAA,OAAO,CAACC,EAAE,CAAA;YAC9E,IAAIS,KAAAA,IAASA,KAAMG,CAAAA,IAAI,CAACf,OAAO,KAAKgE,MAAO9D,CAAAA,OAAO,CAACF,OAAO,EAAE;AAC1DY,gBAAAA,KAAAA,CAAMG,IAAI,CAACf,OAAO,GAAGgE,MAAO9D,CAAAA,OAAO,CAACF,OAAO;AAC3CY,gBAAAA,KAAAA,CAAMC,iBAAiB,GAAG,IAAA;AAC1BqD,gBAAAA,KAAAA,CAAM1D,iBAAiB,GAAG,IAAA;AAC5B;AACF;QAEA,IAAIwD,MAAAA,CAAO/D,IAAI,KAAK,6BAA+B,EAAA;AACjD,YAAA,MAAMW,QAAQsD,KAAMxD,CAAAA,cAAc,CAACyD,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAErD,CAAAA,IAAI,CAACZ,EAAE,KAAK6D,MAAO9D,CAAAA,OAAO,CAACC,EAAE,CAAA;YAC9E,IAAIS,KAAAA,IAASA,KAAMG,CAAAA,IAAI,CAACM,eAAe,KAAK2C,MAAO9D,CAAAA,OAAO,CAACG,OAAO,EAAE;AAClEO,gBAAAA,KAAAA,CAAMG,IAAI,CAACM,eAAe,GAAG2C,MAAO9D,CAAAA,OAAO,CAACG,OAAO;AACnDO,gBAAAA,KAAAA,CAAME,iBAAiB,GAAG,IAAA;AAC1BoD,gBAAAA,KAAAA,CAAM1D,iBAAiB,GAAG,IAAA;AAC5B;AACF;QAEA,IAAIwD,MAAAA,CAAO/D,IAAI,KAAK,uBAAyB,EAAA;AAC3CiE,YAAAA,KAAAA,CAAMxD,cAAc,GAAGwD,KAAAA,CAAMxD,cAAc,CAACC,MAAM,CAAC,CAACyD,CAAMA,GAAAA,CAAAA,CAAErD,IAAI,CAACZ,EAAE,KAAK6D,MAAO9D,CAAAA,OAAO,CAACC,EAAE,CAAA;AAC3F;QAEA,IAAI6D,MAAAA,CAAO/D,IAAI,KAAK,qBAAuB,EAAA;AACzC,YAAA,MAAMoE,aAAaH,KAAMxD,CAAAA,cAAc,CAAC4D,SAAS,CAC/C,CAACF,CAAMA,GAAAA,CAAAA,CAAErD,IAAI,CAACZ,EAAE,KAAK6D,MAAAA,CAAO9D,OAAO,CAACqE,WAAW,CAACpE,EAAE,CAAA;YAEpD,IAAIkE,UAAAA,KAAe,CAAC,CAAG,EAAA;gBACrBH,KAAMxD,CAAAA,cAAc,CAAC2D,UAAAA,CAAW,GAAG;oBACjCtD,IAAMiD,EAAAA,MAAAA,CAAO9D,OAAO,CAACqE,WAAW;AAChC1D,oBAAAA,iBAAAA,EAAmBqD,KAAMxD,CAAAA,cAAc,CAAC2D,UAAAA,CAAW,CAACxD,iBAAiB;AACrEC,oBAAAA,iBAAAA,EAAmBoD,KAAMxD,CAAAA,cAAc,CAAC2D,UAAAA,CAAW,CAACvD;AACtD,iBAAA;AACF;AACF;QAEA,IAAIkD,MAAAA,CAAO/D,IAAI,KAAK,uBAAyB,EAAA;AAC3CiE,YAAAA,KAAAA,CAAM1D,iBAAiB,GAAG,KAAA;AAC1B0D,YAAAA,KAAAA,CAAMxD,cAAc,CAAC8D,OAAO,CAAC,CAAC5D,KAAAA,GAAAA;AAC5BA,gBAAAA,KAAAA,CAAMC,iBAAiB,GAAG,KAAA;AAC1BD,gBAAAA,KAAAA,CAAME,iBAAiB,GAAG,KAAA;AAC5B,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF,CAAA;AAEO,MAAM2D,aAAgB,GAAA,CAAC,EAAEC,IAAI,EAAEhG,OAAO,EAAEO,QAAW,GAAA,IAAI,EAAsB,GAAA;AAClF,IAAA,MAAM,CAACJ,KAAOG,EAAAA,QAAAA,CAAS,GAAGU,gBAAMiF,CAAAA,UAAU,CAACZ,OAAS,EAAA;AAClDrD,QAAAA,cAAAA,EAAgB,EAAE;QAClByB,oBAAsB,EAAA,CAAA;QACtB3B,iBAAmB,EAAA;AACrB,KAAA,CAAA;IAEA,MAAMoE,WAAAA,GAAclF,gBAAMmF,CAAAA,WAAW,CAAC,IAAA;;QAEpC7F,QAAS,CAAA;YAAEiB,IAAM,EAAA,qBAAA;AAAuBC,YAAAA,OAAAA,EAAS;AAAG,SAAA,CAAA;AACpDxB,QAAAA,OAAAA,EAAAA;KACC,EAAA;AAACA,QAAAA;AAAQ,KAAA,CAAA;AAEZ,IAAA,qBACE0D,cAACyB,CAAAA,oBAAAA,EAAAA;QACChF,KAAOA,EAAAA,KAAAA;QACPG,QAAUA,EAAAA,QAAAA;QACVC,QAAUA,EAAAA,QAAAA;QACVP,OAASkG,EAAAA,WAAAA;gCAETxC,cAAA,CAACjE,mBAAM2G,IAAI,EAAA;YAACJ,IAAMA,EAAAA,IAAAA;YAAMK,YAAcH,EAAAA,WAAAA;AACpC,YAAA,QAAA,gBAAAxC,cAAC3D,CAAAA,YAAAA,EAAAA;gBAAaC,OAASkG,EAAAA;;;;AAI/B;;;;;"}
|
|
1
|
+
{"version":3,"file":"AIUploadModal.js","sources":["../../../../admin/src/ai/components/AIUploadModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useTracking } 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 { AssetType } from '../../constants';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad, typeFromMime } 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,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, useTracking } 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';
|
|
@@ -44,6 +44,7 @@ const ModalContent = ({ onClose })=>{
|
|
|
44
44
|
const { edit, isLoading: isSaving } = useBulkEdit();
|
|
45
45
|
const [isUploading, setIsUploading] = React.useState(false);
|
|
46
46
|
const [uploadError, setUploadError] = React.useState(null);
|
|
47
|
+
const { trackUsage } = useTracking();
|
|
47
48
|
const handleCaptionChange = (assetId, caption)=>{
|
|
48
49
|
dispatch({
|
|
49
50
|
type: 'set_uploaded_asset_caption',
|
|
@@ -72,6 +73,13 @@ const ModalContent = ({ onClose })=>{
|
|
|
72
73
|
if (state.hasUnsavedChanges) {
|
|
73
74
|
const assetsToUpdate = state.uploadedAssets.filter((asset)=>(asset.wasCaptionChanged || asset.wasAltTextChanged) && asset.file.id);
|
|
74
75
|
if (assetsToUpdate.length > 0) {
|
|
76
|
+
if (assetsToUpdate.some((asset)=>asset.wasCaptionChanged)) {
|
|
77
|
+
trackUsage('didEditAICaption');
|
|
78
|
+
}
|
|
79
|
+
if (assetsToUpdate.some((asset)=>asset.wasAltTextChanged)) {
|
|
80
|
+
trackUsage('didEditAIAlternativeText');
|
|
81
|
+
}
|
|
82
|
+
// Update assets
|
|
75
83
|
const updates = assetsToUpdate.map((asset)=>({
|
|
76
84
|
id: asset.file.id,
|
|
77
85
|
fileInfo: {
|
|
@@ -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 { 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\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 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","handleCaptionChange","assetId","caption","type","payload","id","handleAltTextChange","altText","resetState","handleFinish","hasUnsavedChanges","assetsToUpdate","uploadedAssets","filter","asset","wasCaptionChanged","wasAltTextChanged","file","length","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, useTracking } 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 { AssetType } from '../../constants';\nimport { useBulkEdit } from '../../hooks/useBulkEdit';\nimport { useUpload } from '../../hooks/useUpload';\nimport { getTrad, typeFromMime } 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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"}
|
|
@@ -40,6 +40,7 @@ const CrumbSimpleMenuAsync = ({ parentsToOmit = [], currentFolderId, onChangeFol
|
|
|
40
40
|
enabled: shouldFetch
|
|
41
41
|
});
|
|
42
42
|
const { pathname } = reactRouterDom.useLocation();
|
|
43
|
+
const navigate = reactRouterDom.useNavigate();
|
|
43
44
|
const [{ query }] = strapiAdmin.useQueryParams();
|
|
44
45
|
const { formatMessage } = reactIntl.useIntl();
|
|
45
46
|
const allAscendants = data && getFolderParents.getFolderParents(data, currentFolderId);
|
|
@@ -72,12 +73,11 @@ const CrumbSimpleMenuAsync = ({ parentsToOmit = [], currentFolderId, onChangeFol
|
|
|
72
73
|
}, ascendant.id);
|
|
73
74
|
}
|
|
74
75
|
const url = getFolderURL.getFolderURL(pathname, query, {
|
|
75
|
-
folder:
|
|
76
|
+
folder: String(ascendant.id),
|
|
76
77
|
folderPath: ascendant?.path
|
|
77
78
|
});
|
|
78
79
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.MenuItem, {
|
|
79
|
-
|
|
80
|
-
href: url,
|
|
80
|
+
onClick: ()=>navigate(url),
|
|
81
81
|
children: ascendant.label
|
|
82
82
|
}, ascendant.id);
|
|
83
83
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrumbSimpleMenuAsync.js","sources":["../../../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId!);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(Number(ascendant.id), ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder:
|
|
1
|
+
{"version":3,"file":"CrumbSimpleMenuAsync.js","sources":["../../../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const navigate = useNavigate();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId!);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(Number(ascendant.id), ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder: String(ascendant.id),\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem key={ascendant.id} onClick={() => navigate(url)}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n"],"names":["CrumbSimpleMenuAsync","parentsToOmit","currentFolderId","onChangeFolder","shouldFetch","setShouldFetch","React","useState","data","isLoading","useFolderStructure","enabled","pathname","useLocation","navigate","useNavigate","query","useQueryParams","formatMessage","useIntl","allAscendants","getFolderParents","filteredAscendants","filter","ascendant","id","includes","_jsxs","CrumbSimpleMenu","onOpen","onClose","aria-label","getTrad","defaultMessage","label","_jsx","MenuItem","Loader","small","map","tag","type","onClick","Number","path","url","getFolderURL","folder","String","folderPath"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBO,MAAMA,oBAAuB,GAAA,CAAC,EACnCC,aAAAA,GAAgB,EAAE,EAClBC,eAAe,EACfC,cAAc,EACY,GAAA;AAC1B,IAAA,MAAM,CAACC,WAAaC,EAAAA,cAAAA,CAAe,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACrD,IAAA,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAE,GAAGC,qCAAmB,CAAA;QAAEC,OAASP,EAAAA;AAAY,KAAA,CAAA;IACtE,MAAM,EAAEQ,QAAQ,EAAE,GAAGC,0BAAAA,EAAAA;AACrB,IAAA,MAAMC,QAAWC,GAAAA,0BAAAA,EAAAA;AACjB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;IACpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,MAAMC,aAAAA,GAAgBZ,IAAQa,IAAAA,iCAAAA,CAAiBb,IAAMN,EAAAA,eAAAA,CAAAA;IACrD,MAAMoB,kBAAAA,GACJF,iBACAA,aAAcG,CAAAA,MAAM,CAClB,CAACC,SAAAA,GACC,OAAOA,SAAUC,CAAAA,EAAE,KAAK,QACxB,IAAA,CAACxB,cAAcyB,QAAQ,CAACF,UAAUC,EAAE,CAAA,IACpCD,SAAUC,CAAAA,EAAE,KAAK,IAAA,CAAA;AAGvB,IAAA,qBACEE,eAACC,CAAAA,4BAAAA,EAAAA;AACCC,QAAAA,MAAAA,EAAQ,IAAMxB,cAAe,CAAA,IAAA,CAAA;AAC7ByB,QAAAA,OAAAA,EAAS,IAAMzB,cAAe,CAAA,KAAA,CAAA;AAC9B0B,QAAAA,YAAAA,EAAYb,aAAc,CAAA;AACxBO,YAAAA,EAAAA,EAAIO,eAAQ,CAAA,+BAAA,CAAA;YACZC,cAAgB,EAAA;AAClB,SAAA,CAAA;QACAC,KAAM,EAAA,KAAA;;AAELzB,YAAAA,SAAAA,kBACC0B,cAACC,CAAAA,qBAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAD,cAACE,CAAAA,mBAAAA,EAAAA;oBAAOC,KAAK,EAAA,IAAA;8BACVpB,aAAc,CAAA;AACbO,wBAAAA,EAAAA,EAAIO,eAAQ,CAAA,mBAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;;YAILX,kBACCA,IAAAA,kBAAAA,CAAmBiB,GAAG,CAAC,CAACf,SAAAA,GAAAA;AACtB,gBAAA,IAAIrB,cAAgB,EAAA;AAClB,oBAAA,qBACEgC,cAACC,CAAAA,qBAAAA,EAAAA;wBACCI,GAAI,EAAA,QAAA;wBACJC,IAAK,EAAA,QAAA;AACLC,wBAAAA,OAAAA,EAAS,IAAMvC,cAAewC,CAAAA,MAAAA,CAAOnB,UAAUC,EAAE,CAAA,EAAGD,UAAUoB,IAAI,CAAA;AAGjEpB,wBAAAA,QAAAA,EAAAA,SAAAA,CAAUU;AAFNV,qBAAAA,EAAAA,SAAAA,CAAUC,EAAE,CAAA;AAKvB;gBAEA,MAAMoB,GAAAA,GAAMC,yBAAalC,CAAAA,QAAAA,EAAUI,KAAO,EAAA;oBACxC+B,MAAQC,EAAAA,MAAAA,CAAOxB,UAAUC,EAAE,CAAA;AAC3BwB,oBAAAA,UAAAA,EAAYzB,SAAWoB,EAAAA;AACzB,iBAAA,CAAA;AAEA,gBAAA,qBACET,cAACC,CAAAA,qBAAAA,EAAAA;AAA4BM,oBAAAA,OAAAA,EAAS,IAAM5B,QAAS+B,CAAAA,GAAAA,CAAAA;AAClDrB,oBAAAA,QAAAA,EAAAA,SAAAA,CAAUU;AADEV,iBAAAA,EAAAA,SAAAA,CAAUC,EAAE,CAAA;AAI/B,aAAA;;;AAGR;;;;"}
|
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { useQueryParams } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { CrumbSimpleMenu, MenuItem, Loader } from '@strapi/design-system';
|
|
5
5
|
import { useIntl } from 'react-intl';
|
|
6
|
-
import { useLocation } from 'react-router-dom';
|
|
6
|
+
import { useLocation, useNavigate } from 'react-router-dom';
|
|
7
7
|
import { useFolderStructure } from '../../hooks/useFolderStructure.mjs';
|
|
8
8
|
import 'byte-size';
|
|
9
9
|
import 'date-fns';
|
|
@@ -19,6 +19,7 @@ const CrumbSimpleMenuAsync = ({ parentsToOmit = [], currentFolderId, onChangeFol
|
|
|
19
19
|
enabled: shouldFetch
|
|
20
20
|
});
|
|
21
21
|
const { pathname } = useLocation();
|
|
22
|
+
const navigate = useNavigate();
|
|
22
23
|
const [{ query }] = useQueryParams();
|
|
23
24
|
const { formatMessage } = useIntl();
|
|
24
25
|
const allAscendants = data && getFolderParents(data, currentFolderId);
|
|
@@ -51,12 +52,11 @@ const CrumbSimpleMenuAsync = ({ parentsToOmit = [], currentFolderId, onChangeFol
|
|
|
51
52
|
}, ascendant.id);
|
|
52
53
|
}
|
|
53
54
|
const url = getFolderURL(pathname, query, {
|
|
54
|
-
folder:
|
|
55
|
+
folder: String(ascendant.id),
|
|
55
56
|
folderPath: ascendant?.path
|
|
56
57
|
});
|
|
57
58
|
return /*#__PURE__*/ jsx(MenuItem, {
|
|
58
|
-
|
|
59
|
-
href: url,
|
|
59
|
+
onClick: ()=>navigate(url),
|
|
60
60
|
children: ascendant.label
|
|
61
61
|
}, ascendant.id);
|
|
62
62
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrumbSimpleMenuAsync.mjs","sources":["../../../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId!);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(Number(ascendant.id), ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder:
|
|
1
|
+
{"version":3,"file":"CrumbSimpleMenuAsync.mjs","sources":["../../../../admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { CrumbSimpleMenu, Loader, MenuItem } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { useFolderStructure } from '../../hooks/useFolderStructure';\nimport { getFolderParents, getFolderURL, getTrad } from '../../utils';\n\ninterface CrumbSimpleMenuAsyncProps {\n parentsToOmit?: number[];\n currentFolderId?: number;\n onChangeFolder?: (id: number, path?: string) => void;\n}\n\nexport const CrumbSimpleMenuAsync = ({\n parentsToOmit = [],\n currentFolderId,\n onChangeFolder,\n}: CrumbSimpleMenuAsyncProps) => {\n const [shouldFetch, setShouldFetch] = React.useState(false);\n const { data, isLoading } = useFolderStructure({ enabled: shouldFetch });\n const { pathname } = useLocation();\n const navigate = useNavigate();\n const [{ query }] = useQueryParams();\n const { formatMessage } = useIntl();\n\n const allAscendants = data && getFolderParents(data, currentFolderId!);\n const filteredAscendants =\n allAscendants &&\n allAscendants.filter(\n (ascendant) =>\n typeof ascendant.id === 'number' &&\n !parentsToOmit.includes(ascendant.id) &&\n ascendant.id !== null\n );\n\n return (\n <CrumbSimpleMenu\n onOpen={() => setShouldFetch(true)}\n onClose={() => setShouldFetch(false)}\n aria-label={formatMessage({\n id: getTrad('header.breadcrumbs.menu.label'),\n defaultMessage: 'Get more ascendants folders',\n })}\n label=\"...\"\n >\n {isLoading && (\n <MenuItem>\n <Loader small>\n {formatMessage({\n id: getTrad('content.isLoading'),\n defaultMessage: 'Content is loading.',\n })}\n </Loader>\n </MenuItem>\n )}\n {filteredAscendants &&\n filteredAscendants.map((ascendant) => {\n if (onChangeFolder) {\n return (\n <MenuItem\n tag=\"button\"\n type=\"button\"\n onClick={() => onChangeFolder(Number(ascendant.id), ascendant.path)}\n key={ascendant.id}\n >\n {ascendant.label}\n </MenuItem>\n );\n }\n\n const url = getFolderURL(pathname, query, {\n folder: String(ascendant.id),\n folderPath: ascendant?.path,\n });\n\n return (\n <MenuItem key={ascendant.id} onClick={() => navigate(url)}>\n {ascendant.label}\n </MenuItem>\n );\n })}\n </CrumbSimpleMenu>\n );\n};\n"],"names":["CrumbSimpleMenuAsync","parentsToOmit","currentFolderId","onChangeFolder","shouldFetch","setShouldFetch","React","useState","data","isLoading","useFolderStructure","enabled","pathname","useLocation","navigate","useNavigate","query","useQueryParams","formatMessage","useIntl","allAscendants","getFolderParents","filteredAscendants","filter","ascendant","id","includes","_jsxs","CrumbSimpleMenu","onOpen","onClose","aria-label","getTrad","defaultMessage","label","_jsx","MenuItem","Loader","small","map","tag","type","onClick","Number","path","url","getFolderURL","folder","String","folderPath"],"mappings":";;;;;;;;;;;;;;;AAgBO,MAAMA,oBAAuB,GAAA,CAAC,EACnCC,aAAAA,GAAgB,EAAE,EAClBC,eAAe,EACfC,cAAc,EACY,GAAA;AAC1B,IAAA,MAAM,CAACC,WAAaC,EAAAA,cAAAA,CAAe,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACrD,IAAA,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAE,GAAGC,kBAAmB,CAAA;QAAEC,OAASP,EAAAA;AAAY,KAAA,CAAA;IACtE,MAAM,EAAEQ,QAAQ,EAAE,GAAGC,WAAAA,EAAAA;AACrB,IAAA,MAAMC,QAAWC,GAAAA,WAAAA,EAAAA;AACjB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IACpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B,MAAMC,aAAAA,GAAgBZ,IAAQa,IAAAA,gBAAAA,CAAiBb,IAAMN,EAAAA,eAAAA,CAAAA;IACrD,MAAMoB,kBAAAA,GACJF,iBACAA,aAAcG,CAAAA,MAAM,CAClB,CAACC,SAAAA,GACC,OAAOA,SAAUC,CAAAA,EAAE,KAAK,QACxB,IAAA,CAACxB,cAAcyB,QAAQ,CAACF,UAAUC,EAAE,CAAA,IACpCD,SAAUC,CAAAA,EAAE,KAAK,IAAA,CAAA;AAGvB,IAAA,qBACEE,IAACC,CAAAA,eAAAA,EAAAA;AACCC,QAAAA,MAAAA,EAAQ,IAAMxB,cAAe,CAAA,IAAA,CAAA;AAC7ByB,QAAAA,OAAAA,EAAS,IAAMzB,cAAe,CAAA,KAAA,CAAA;AAC9B0B,QAAAA,YAAAA,EAAYb,aAAc,CAAA;AACxBO,YAAAA,EAAAA,EAAIO,OAAQ,CAAA,+BAAA,CAAA;YACZC,cAAgB,EAAA;AAClB,SAAA,CAAA;QACAC,KAAM,EAAA,KAAA;;AAELzB,YAAAA,SAAAA,kBACC0B,GAACC,CAAAA,QAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,MAAAA,EAAAA;oBAAOC,KAAK,EAAA,IAAA;8BACVpB,aAAc,CAAA;AACbO,wBAAAA,EAAAA,EAAIO,OAAQ,CAAA,mBAAA,CAAA;wBACZC,cAAgB,EAAA;AAClB,qBAAA;;;YAILX,kBACCA,IAAAA,kBAAAA,CAAmBiB,GAAG,CAAC,CAACf,SAAAA,GAAAA;AACtB,gBAAA,IAAIrB,cAAgB,EAAA;AAClB,oBAAA,qBACEgC,GAACC,CAAAA,QAAAA,EAAAA;wBACCI,GAAI,EAAA,QAAA;wBACJC,IAAK,EAAA,QAAA;AACLC,wBAAAA,OAAAA,EAAS,IAAMvC,cAAewC,CAAAA,MAAAA,CAAOnB,UAAUC,EAAE,CAAA,EAAGD,UAAUoB,IAAI,CAAA;AAGjEpB,wBAAAA,QAAAA,EAAAA,SAAAA,CAAUU;AAFNV,qBAAAA,EAAAA,SAAAA,CAAUC,EAAE,CAAA;AAKvB;gBAEA,MAAMoB,GAAAA,GAAMC,YAAalC,CAAAA,QAAAA,EAAUI,KAAO,EAAA;oBACxC+B,MAAQC,EAAAA,MAAAA,CAAOxB,UAAUC,EAAE,CAAA;AAC3BwB,oBAAAA,UAAAA,EAAYzB,SAAWoB,EAAAA;AACzB,iBAAA,CAAA;AAEA,gBAAA,qBACET,GAACC,CAAAA,QAAAA,EAAAA;AAA4BM,oBAAAA,OAAAA,EAAS,IAAM5B,QAAS+B,CAAAA,GAAAA,CAAAA;AAClDrB,oBAAAA,QAAAA,EAAAA,SAAAA,CAAUU;AADEV,iBAAAA,EAAAA,SAAAA,CAAUC,EAAE,CAAA;AAI/B,aAAA;;;AAGR;;;;"}
|
|
@@ -33,6 +33,7 @@ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disa
|
|
|
33
33
|
const { formatMessage } = reactIntl.useIntl();
|
|
34
34
|
const [isEditingAsset, setIsEditingAsset] = React__namespace.useState(false);
|
|
35
35
|
const currentAsset = assets[selectedAssetIndex];
|
|
36
|
+
const canEditMedia = !disabled && onEditAsset;
|
|
36
37
|
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
37
38
|
children: [
|
|
38
39
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.CarouselInput, {
|
|
@@ -58,7 +59,7 @@ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disa
|
|
|
58
59
|
asset: currentAsset,
|
|
59
60
|
onDeleteAsset: disabled ? undefined : onDeleteAsset,
|
|
60
61
|
onAddAsset: disabled ? undefined : onAddAsset,
|
|
61
|
-
onEditAsset:
|
|
62
|
+
onEditAsset: canEditMedia ? ()=>setIsEditingAsset(true) : undefined
|
|
62
63
|
}) : undefined,
|
|
63
64
|
children: assets.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.CarouselSlide, {
|
|
64
65
|
label: formatMessage({
|
|
@@ -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\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={
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyCaA,cAAiBC,iBAAAA,gBAAAA,CAAMC,UAAU,CAC5C,CACE,EACEC,MAAM,EACNC,QAAW,GAAA,KAAK,EAChBC,KAAK,EACLC,IAAI,EACJC,KAAK,EACLC,WAAW,EACXC,UAAU,EACVC,aAAa,EACbC,6BAA6B,EAC7BC,WAAW,EACXC,WAAW,EACXC,MAAM,EACNC,UAAU,EACVC,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,GAAGtB,gBAAAA,CAAMuB,QAAQ,CAAC,KAAA,CAAA;IAE3D,MAAMC,YAAAA,GAAetB,MAAM,CAACc,kBAAmB,CAAA;IAC/C,MAAMS,YAAAA,GAAe,CAACtB,QAAYS,IAAAA,WAAAA;IAElC,qBACEc,eAAA,CAAAC,mBAAA,EAAA;;0BACEC,cAACC,CAAAA,0BAAAA,EAAAA;gBACCC,GAAKZ,EAAAA,YAAAA;gBACLZ,KAAOA,EAAAA,KAAAA;gBACPC,WAAaA,EAAAA,WAAAA;AACbwB,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;gBACAxB,MAAQA,EAAAA,MAAAA;gBACRC,UAAYA,EAAAA,UAAAA;gBACZT,IAAMA,EAAAA,IAAAA;gBACND,KAAOA,EAAAA,KAAAA;gBACPW,QAAUA,EAAAA,QAAAA;AACVwB,gBAAAA,OAAAA,EACEf,6BACEI,cAACY,CAAAA,yCAAAA,EAAAA;oBACCC,KAAOjB,EAAAA,YAAAA;AACPf,oBAAAA,aAAAA,EAAeN,WAAWuC,SAAYjC,GAAAA,aAAAA;AACtCD,oBAAAA,UAAAA,EAAYL,WAAWuC,SAAYlC,GAAAA,UAAAA;oBACnCI,WAAaa,EAAAA,YAAAA,GAAe,IAAMH,iBAAAA,CAAkB,IAAQoB,CAAAA,GAAAA;AAE5DA,iBAAAA,CAAAA,GAAAA,SAAAA;0BAGLxC,MAAOyC,CAAAA,MAAM,KAAK,CAAA,iBACjBf,cAACgB,CAAAA,0BAAAA,EAAAA;AACCtC,oBAAAA,KAAAA,EAAOa,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;wBACC5C,QAAUA,EAAAA,QAAAA;wBACV6C,OAASxC,EAAAA,UAAAA;wBACTG,WAAaA,EAAAA;;AAIjBT,iBAAAA,CAAAA,GAAAA,MAAAA,CAAO+C,GAAG,CAAC,CAACR,KAAAA,EAAOS,sBACjBtB,cAACgB,CAAAA,0BAAAA,EAAAA;AAECtC,wBAAAA,KAAAA,EAAOa,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,EAAG5C,OAAOyC;AAAO,yBAAA,CAAA;AAGnC,wBAAA,QAAA,gBAAAf,cAACuB,CAAAA,2BAAAA,EAAAA;4BAAcV,KAAOA,EAAAA;;AATjBA,qBAAAA,EAAAA,KAAAA,CAAMN,EAAE,CAAA;;0BAcrBP,cAACwB,CAAAA,gCAAAA,EAAAA;gBACCC,IAAMhC,EAAAA,cAAAA;AACNiC,gBAAAA,OAAAA,EAAS,CAACC,WAAAA,GAAAA;oBACRjC,iBAAkB,CAAA,KAAA,CAAA;;AAGlB,oBAAA,IAAIiC,gBAAgB,IAAM,EAAA;AACxB7C,wBAAAA,6BAAAA,EAAAA;AACF;oBACA,IAAI6C,WAAAA,IAAe,OAAOA,WAAAA,KAAgB,SAAW,EAAA;wBACnD3C,WAAc2C,GAAAA,WAAAA,CAAAA;AAChB;AACF,iBAAA;gBACAd,KAAOjB,EAAAA,YAAAA;gBACPgC,SAAS,EAAA,IAAA;gBACTC,WAAW,EAAA,IAAA;gBACXC,WAAW,EAAA,IAAA;gBACXzC,eAAiBA,EAAAA;;;;AAIzB,CACA;;;;"}
|
|
@@ -12,6 +12,7 @@ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = fals
|
|
|
12
12
|
const { formatMessage } = useIntl();
|
|
13
13
|
const [isEditingAsset, setIsEditingAsset] = React.useState(false);
|
|
14
14
|
const currentAsset = assets[selectedAssetIndex];
|
|
15
|
+
const canEditMedia = !disabled && onEditAsset;
|
|
15
16
|
return /*#__PURE__*/ jsxs(Fragment, {
|
|
16
17
|
children: [
|
|
17
18
|
/*#__PURE__*/ jsx(CarouselInput, {
|
|
@@ -37,7 +38,7 @@ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = fals
|
|
|
37
38
|
asset: currentAsset,
|
|
38
39
|
onDeleteAsset: disabled ? undefined : onDeleteAsset,
|
|
39
40
|
onAddAsset: disabled ? undefined : onAddAsset,
|
|
40
|
-
onEditAsset:
|
|
41
|
+
onEditAsset: canEditMedia ? ()=>setIsEditingAsset(true) : undefined
|
|
41
42
|
}) : undefined,
|
|
42
43
|
children: assets.length === 0 ? /*#__PURE__*/ jsx(CarouselSlide, {
|
|
43
44
|
label: formatMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselAssets.mjs","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\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={
|
|
1
|
+
{"version":3,"file":"CarouselAssets.mjs","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,18 +1,23 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
function flattenTree(tree, parent = null, depth = 0) {
|
|
4
|
-
return tree.flatMap((item)=>
|
|
3
|
+
function flattenTree(tree, parent = null, depth = 0, path = '') {
|
|
4
|
+
return tree.flatMap((item)=>{
|
|
5
|
+
const newPath = item.value ? `${path}/${item.value}` : path;
|
|
6
|
+
return item.children ? [
|
|
5
7
|
{
|
|
6
8
|
...item,
|
|
7
9
|
parent: parent?.value,
|
|
8
|
-
depth
|
|
10
|
+
depth,
|
|
11
|
+
path: newPath
|
|
9
12
|
},
|
|
10
|
-
...flattenTree(item.children, item, depth + 1)
|
|
13
|
+
...flattenTree(item.children, item, depth + 1, newPath)
|
|
11
14
|
] : {
|
|
12
15
|
...item,
|
|
13
16
|
depth,
|
|
14
|
-
parent: parent?.value
|
|
15
|
-
|
|
17
|
+
parent: parent?.value,
|
|
18
|
+
path: newPath
|
|
19
|
+
};
|
|
20
|
+
});
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
exports.flattenTree = flattenTree;
|