@payloadcms/ui 4.0.0-canary.26 → 4.0.0-canary.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/elements/BulkUpload/AddFilesView/index.css +10 -4
  2. package/dist/elements/BulkUpload/AddFilesView/index.d.ts.map +1 -1
  3. package/dist/elements/BulkUpload/AddFilesView/index.js +71 -51
  4. package/dist/elements/BulkUpload/AddFilesView/index.js.map +1 -1
  5. package/dist/elements/Button/index.d.ts.map +1 -1
  6. package/dist/elements/Button/index.js +2 -0
  7. package/dist/elements/Button/index.js.map +1 -1
  8. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  9. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +10 -3
  10. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  11. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +345 -1
  12. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -1
  13. package/dist/elements/Dropzone/index.css +10 -4
  14. package/dist/elements/FileManager/index.css +0 -30
  15. package/dist/elements/FileManager/index.d.ts.map +1 -1
  16. package/dist/elements/FileManager/index.js +379 -287
  17. package/dist/elements/FileManager/index.js.map +1 -1
  18. package/dist/elements/Upload/UploadFromURLModal/index.d.ts +1 -1
  19. package/dist/elements/Upload/UploadFromURLModal/index.d.ts.map +1 -1
  20. package/dist/elements/Upload/UploadFromURLModal/index.js.map +1 -1
  21. package/dist/elements/Upload/index.css +39 -32
  22. package/dist/elements/Upload/index.d.ts.map +1 -1
  23. package/dist/elements/Upload/index.js +37 -99
  24. package/dist/elements/Upload/index.js.map +1 -1
  25. package/dist/elements/Upload/usePasteFromClipboard.d.ts +14 -0
  26. package/dist/elements/Upload/usePasteFromClipboard.d.ts.map +1 -0
  27. package/dist/elements/Upload/usePasteFromClipboard.js +93 -0
  28. package/dist/elements/Upload/usePasteFromClipboard.js.map +1 -0
  29. package/dist/elements/Upload/useUploadFromUrl.d.ts +20 -0
  30. package/dist/elements/Upload/useUploadFromUrl.d.ts.map +1 -0
  31. package/dist/elements/Upload/useUploadFromUrl.js +201 -0
  32. package/dist/elements/Upload/useUploadFromUrl.js.map +1 -0
  33. package/dist/elements/UploadDropzoneContent/index.css +31 -0
  34. package/dist/elements/UploadDropzoneContent/index.d.ts +17 -0
  35. package/dist/elements/UploadDropzoneContent/index.d.ts.map +1 -0
  36. package/dist/elements/UploadDropzoneContent/index.js +62 -0
  37. package/dist/elements/UploadDropzoneContent/index.js.map +1 -0
  38. package/dist/elements/WhereBuilder/conditionValue.d.ts +32 -0
  39. package/dist/elements/WhereBuilder/conditionValue.d.ts.map +1 -0
  40. package/dist/elements/WhereBuilder/conditionValue.js +32 -0
  41. package/dist/elements/WhereBuilder/conditionValue.js.map +1 -0
  42. package/dist/elements/WhereBuilder/conditionValue.spec.js +65 -0
  43. package/dist/elements/WhereBuilder/conditionValue.spec.js.map +1 -0
  44. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  45. package/dist/elements/WhereBuilder/index.js +15 -4
  46. package/dist/elements/WhereBuilder/index.js.map +1 -1
  47. package/dist/fields/Upload/Input.d.ts.map +1 -1
  48. package/dist/fields/Upload/Input.js +26 -0
  49. package/dist/fields/Upload/Input.js.map +1 -1
  50. package/dist/styles.css +1 -1
  51. package/dist/utilities/formatMetadata.d.ts.map +1 -1
  52. package/dist/utilities/formatMetadata.js +0 -5
  53. package/dist/utilities/formatMetadata.js.map +1 -1
  54. package/dist/utilities/getFilesFromClipboard.d.ts +10 -0
  55. package/dist/utilities/getFilesFromClipboard.d.ts.map +1 -0
  56. package/dist/utilities/getFilesFromClipboard.js +49 -0
  57. package/dist/utilities/getFilesFromClipboard.js.map +1 -0
  58. package/dist/utilities/slugify.d.ts.map +1 -1
  59. package/dist/utilities/slugify.js +1 -0
  60. package/dist/utilities/slugify.js.map +1 -1
  61. package/dist/views/Root/getCustomCollectionViewByRoute.d.ts.map +1 -1
  62. package/dist/views/Root/getCustomCollectionViewByRoute.js.map +1 -1
  63. package/dist/views/Root/getCustomGlobalViewByRoute.d.ts.map +1 -1
  64. package/dist/views/Root/getCustomGlobalViewByRoute.js.map +1 -1
  65. package/dist/views/Root/getCustomViewByKey.d.ts.map +1 -1
  66. package/dist/views/Root/getCustomViewByKey.js.map +1 -1
  67. package/dist/views/Version/generateVersionViewMetadata.js.map +1 -1
  68. package/dist/views/Versions/generateVersionsViewMetadata.js.map +1 -1
  69. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useModal","formatAdminURL","formatFilesize","isImage","React","Fragment","useCallback","useEffect","useRef","useState","toast","FieldError","fieldBaseClass","TextInput","useForm","useField","useConfig","useDocumentInfo","EditDepthProvider","useTranslation","useUploadControls","useUploadEdits","Button","Drawer","Dropzone","EditUpload","PreviewSizes","Thumbnail","editDrawerSlug","sizePreviewSlug","pasteURLDrawerSlug","UploadFromURLModal","AudioPreview","FilePreview","PdfPreview","VideoPreview","FileToolbar","baseClass","validate","value","undefined","name","FileManager","collectionSlug","initialState","resetUploadEdits","resetUploadEditsFromProps","updateUploadEdits","updateUploadEditsFromProps","uploadConfig","UploadControls","uploadEdits","uploadEditsFromProps","UploadFilePreview","closeModal","openModal","t","setModified","id","data","setUploadStatus","errorMessage","setValue","showError","path","config","routes","api","setUploadControlFile","setUploadControlFileName","setUploadControlFileUrl","uploadControlFile","uploadControlFileName","uploadControlFileUrl","uploadEditsContext","fileSrc","setFileSrc","removedFile","setRemovedFile","filename","setFilename","fileUrl","setFileUrl","selectedSize","setSelectedSize","inputRef","useServerSideFetch","pasteURL","allowList","length","acceptMimeTypes","mimeTypes","join","imageCacheTag","cacheTags","updatedAt","hasImageSizes","imageSizes","hasResizeOptions","Boolean","resizeOptions","focalPointEnabled","focalPoint","crop","showCrop","showFocalPoint","selectedSizeData","sizes","sidePanelFileSrc","url","thumbnailURL","sidePanelMimeType","mimeType","fileTypeIsAdjustable","renameFile","fileToChange","newName","File","type","lastModified","handleFileChange","file","isNewFile","URL","createObjectURL","handleFileNameChange","e","updatedFileName","target","handleFileRemoval","handleFileSelection","files","isValidUrl","canParse","handleUrlSubmit","clientResponse","fetch","ok","Error","status","blob","rawSegment","split","pop","fileName","decodeURIComponent","_clientError","error","encodeURIComponent","serverResponse","apiRoute","_serverError","onEditsSave","args","startsWith","revokeObjectURL","handleControlFileUrl","renderSelectedFilePreview","src","fileType","_jsx","className","title","size","drawers","_jsxs","initialCrop","initialFocalPoint","x","focalX","y","focalY","onSave","hoverTitle","slug","label","doc","showUploadInput","hideFileInputOnCreate","filter","message","hideRemoveFile","isAdjustable","onEditImage","onReplace","buttonStyle","icon","onClick","round","tooltip","onChange","current","click","accept","hidden","ref"],"sources":["../../../src/elements/FileManager/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig, UploadEdits } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { formatAdminURL, formatFilesize, isImage } from 'payload/shared'\nimport React, { Fragment, useCallback, useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { fieldBaseClass } from '../../fields/shared/index.js'\nimport { TextInput } from '../../fields/Text/Input.js'\nimport { useForm } from '../../forms/Form/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { EditDepthProvider } from '../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { useUploadControls } from '../../providers/UploadControls/index.js'\nimport { useUploadEdits } from '../../providers/UploadEdits/index.js'\nimport { Button } from '../Button/index.js'\nimport { Drawer } from '../Drawer/index.js'\nimport { Dropzone } from '../Dropzone/index.js'\nimport { EditUpload } from '../EditUpload/index.js'\nimport { PreviewSizes } from '../PreviewSizes/index.js'\nimport { Thumbnail } from '../Thumbnail/index.js'\nimport { editDrawerSlug, sizePreviewSlug } from '../Upload/index.js'\nimport { pasteURLDrawerSlug, UploadFromURLModal } from '../Upload/UploadFromURLModal/index.js'\nimport { AudioPreview } from './FilePreview/AudioPreview/index.js'\nimport { FilePreview } from './FilePreview/index.js'\nimport { PdfPreview } from './FilePreview/PdfPreview/index.js'\nimport { VideoPreview } from './FilePreview/VideoPreview/index.js'\nimport { FileToolbar } from './FileToolbar/index.js'\nimport './index.css'\n\nconst baseClass = 'file-manager'\n\nconst validate = (value) => {\n if (!value && value !== undefined) {\n return 'A file is required.'\n }\n if (value && (!value.name || value.name === '')) {\n return 'A file name is required.'\n }\n return true\n}\n\nexport type FileManagerProps = {\n readonly collectionSlug: string\n readonly initialState?: import('payload').FormState\n /**\n * When provided, upload edits are sourced from these props instead of the `useUploadEdits`\n * context. The bulk upload drawer uses this to drive per-file edits from its FormsManager.\n */\n readonly resetUploadEdits?: () => void\n readonly updateUploadEdits?: (args: UploadEdits) => void\n readonly uploadConfig: Omit<SanitizedCollectionConfig['upload'], 'uploadInstructions'>\n readonly UploadControls?: React.ReactNode\n readonly uploadEdits?: UploadEdits\n readonly UploadFilePreview?: React.ReactNode\n}\n\nexport const FileManager: React.FC<FileManagerProps> = ({\n collectionSlug,\n initialState,\n resetUploadEdits: resetUploadEditsFromProps,\n updateUploadEdits: updateUploadEditsFromProps,\n uploadConfig,\n UploadControls,\n uploadEdits: uploadEditsFromProps,\n UploadFilePreview,\n}) => {\n const { closeModal, openModal } = useModal()\n const { t } = useTranslation()\n const { setModified } = useForm()\n const { id, data, setUploadStatus } = useDocumentInfo()\n const { errorMessage, setValue, showError, value } = useField<File>({\n path: 'file',\n validate,\n })\n const {\n config: {\n routes: { api },\n },\n } = useConfig()\n const {\n setUploadControlFile,\n setUploadControlFileName,\n setUploadControlFileUrl,\n uploadControlFile,\n uploadControlFileName,\n uploadControlFileUrl,\n } = useUploadControls()\n const uploadEditsContext = useUploadEdits()\n const resetUploadEdits = resetUploadEditsFromProps ?? uploadEditsContext.resetUploadEdits\n const updateUploadEdits = updateUploadEditsFromProps ?? uploadEditsContext.updateUploadEdits\n const uploadEdits = uploadEditsFromProps ?? uploadEditsContext.uploadEdits\n\n const [fileSrc, setFileSrc] = useState<null | string>(null)\n const [removedFile, setRemovedFile] = useState(false)\n const [filename, setFilename] = useState<string>(value?.name || '')\n const [fileUrl, setFileUrl] = useState<string>('')\n const [selectedSize, setSelectedSize] = useState<null | string>(null)\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n const useServerSideFetch =\n typeof uploadConfig?.pasteURL === 'object' && uploadConfig.pasteURL.allowList?.length > 0\n\n const acceptMimeTypes = uploadConfig.mimeTypes?.join(', ')\n const imageCacheTag = uploadConfig?.cacheTags && data?.updatedAt\n\n const hasImageSizes = uploadConfig?.imageSizes?.length > 0\n const hasResizeOptions = Boolean(uploadConfig?.resizeOptions)\n const focalPointEnabled = uploadConfig?.focalPoint === true\n const { crop: showCrop = true, focalPoint = true } = uploadConfig\n const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled)\n\n const selectedSizeData = selectedSize\n ? (data?.sizes?.[selectedSize] as Record<string, unknown>)\n : null\n const sidePanelFileSrc = (selectedSizeData?.url ?? data?.thumbnailURL ?? data?.url ?? null) as\n | null\n | string\n const sidePanelMimeType = data?.mimeType as string | undefined\n const fileTypeIsAdjustable =\n !!sidePanelMimeType &&\n isImage(sidePanelMimeType) &&\n sidePanelMimeType !== 'image/svg+xml' &&\n sidePanelMimeType !== 'image/jxl'\n\n const renameFile = (fileToChange: File, newName: string): File =>\n new File([fileToChange], newName, {\n type: fileToChange.type,\n lastModified: fileToChange.lastModified,\n })\n\n const handleFileChange = useCallback(\n ({ file, isNewFile = true }: { file: File | null; isNewFile?: boolean }) => {\n if (isNewFile && file instanceof File) {\n setFileSrc(URL.createObjectURL(file))\n }\n setValue(file)\n setUploadControlFileUrl('')\n setUploadControlFileName(null)\n setUploadControlFile(null)\n },\n [setValue, setUploadControlFile, setUploadControlFileName, setUploadControlFileUrl],\n )\n\n const handleFileNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const updatedFileName = e.target.value\n if (value) {\n handleFileChange({ file: renameFile(value, updatedFileName), isNewFile: false })\n setFilename(updatedFileName)\n }\n },\n [handleFileChange, value],\n )\n\n const handleFileRemoval = useCallback(() => {\n setRemovedFile(true)\n handleFileChange({ file: null })\n setFileSrc('')\n setFileUrl('')\n setSelectedSize(null)\n resetUploadEdits()\n setUploadControlFileUrl('')\n setUploadControlFileName(null)\n setUploadControlFile(null)\n }, [\n handleFileChange,\n resetUploadEdits,\n setUploadControlFile,\n setUploadControlFileName,\n setUploadControlFileUrl,\n ])\n\n const handleFileSelection = useCallback(\n (files: FileList) => handleFileChange({ file: files?.[0] }),\n [handleFileChange],\n )\n\n const isValidUrl = Boolean(fileUrl && URL.canParse(fileUrl))\n\n const handleUrlSubmit = useCallback(async () => {\n if (!fileUrl || !URL.canParse(fileUrl) || uploadConfig?.pasteURL === false) {\n return\n }\n setUploadStatus('uploading')\n try {\n const clientResponse = await fetch(fileUrl)\n if (!clientResponse.ok) {\n throw new Error(`Fetch failed: ${clientResponse.status}`)\n }\n const blob = await clientResponse.blob()\n const rawSegment = fileUrl.split('/').pop() || ''\n const fileName = uploadControlFileName || decodeURIComponent(rawSegment.split('?')[0])\n handleFileChange({ file: new File([blob], fileName, { type: blob.type }) })\n setUploadStatus('idle')\n closeModal(pasteURLDrawerSlug)\n setFileUrl('')\n return\n } catch (_clientError) {\n if (!useServerSideFetch) {\n toast.error('Failed to fetch the file.')\n setUploadStatus('failed')\n return\n }\n }\n try {\n const pasteURL: `/${string}` = `/${collectionSlug}/paste-url${id ? `/${id}?` : '?'}src=${encodeURIComponent(fileUrl)}`\n const serverResponse = await fetch(formatAdminURL({ apiRoute: api, path: pasteURL }))\n if (!serverResponse.ok) {\n throw new Error(`Fetch failed: ${serverResponse.status}`)\n }\n const blob = await serverResponse.blob()\n const rawSegment = fileUrl.split('/').pop() || ''\n const fileName = decodeURIComponent(rawSegment.split('?')[0])\n handleFileChange({ file: new File([blob], fileName, { type: blob.type }) })\n setUploadStatus('idle')\n closeModal(pasteURLDrawerSlug)\n setFileUrl('')\n } catch (_serverError) {\n toast.error('The provided URL is not allowed.')\n setUploadStatus('failed')\n }\n }, [\n api,\n closeModal,\n collectionSlug,\n fileUrl,\n handleFileChange,\n id,\n setUploadStatus,\n uploadConfig,\n uploadControlFileName,\n useServerSideFetch,\n ])\n\n const onEditsSave = useCallback(\n (args: UploadEdits) => {\n setModified(true)\n updateUploadEdits(args)\n },\n [setModified, updateUploadEdits],\n )\n\n // Reset states for when replacing the file with a new upload\n useEffect(() => {\n setSelectedSize(null)\n setRemovedFile(false)\n setFileSrc('')\n }, [data?.url, data?.filename])\n\n useEffect(() => {\n if (initialState?.file?.value instanceof File) {\n setFileSrc(URL.createObjectURL(initialState.file.value))\n setRemovedFile(false)\n }\n }, [initialState])\n\n useEffect(() => {\n return () => {\n if (fileSrc?.startsWith('blob:')) {\n URL.revokeObjectURL(fileSrc)\n }\n }\n }, [fileSrc])\n\n useEffect(() => {\n const handleControlFileUrl = async () => {\n if (uploadControlFileUrl) {\n setFileUrl(uploadControlFileUrl)\n await handleUrlSubmit()\n }\n }\n void handleControlFileUrl()\n }, [uploadControlFileUrl, handleUrlSubmit])\n\n useEffect(() => {\n if (uploadControlFile) {\n handleFileChange({ file: uploadControlFile })\n }\n }, [uploadControlFile, handleFileChange])\n\n // Preview a freshly-selected (not-yet-saved) file from its local object URL, so video/audio/PDF\n // are playable/viewable just like images. Sizing is capped in CSS so large files stay contained.\n const renderSelectedFilePreview = (src: string) => {\n const fileType = value?.type ?? ''\n\n if (fileType.startsWith('video/')) {\n return (\n <div className={`${baseClass}__selected-preview`}>\n <VideoPreview fileSrc={src} />\n </div>\n )\n }\n\n if (fileType.startsWith('audio/')) {\n return (\n <div className={`${baseClass}__selected-preview ${baseClass}__selected-preview--audio`}>\n <AudioPreview fileSrc={src} />\n </div>\n )\n }\n\n if (fileType === 'application/pdf') {\n return (\n <div className={`${baseClass}__selected-preview`}>\n <PdfPreview fileSrc={src} title={value?.name} />\n </div>\n )\n }\n\n return (\n <div className={`${baseClass}__selected-preview`}>\n <Thumbnail\n collectionSlug={collectionSlug}\n fileSrc={isImage(fileType) ? src : null}\n size=\"expand\"\n />\n </div>\n )\n }\n\n const drawers = (\n <Fragment>\n {(value || data?.filename) && (\n <EditDepthProvider>\n <EditUpload\n fileName={value?.name || (data?.filename as string)}\n fileSrc={(data?.url as string) || fileSrc}\n imageCacheTag={imageCacheTag}\n initialCrop={uploadEdits?.crop ?? undefined}\n initialFocalPoint={{\n x: uploadEdits?.focalPoint?.x || (data?.focalX as number) || 50,\n y: uploadEdits?.focalPoint?.y || (data?.focalY as number) || 50,\n }}\n onSave={onEditsSave}\n showCrop={showCrop}\n showFocalPoint={showFocalPoint}\n />\n </EditDepthProvider>\n )}\n {data && hasImageSizes && (\n <Drawer\n className={`${baseClass}__preview-drawer`}\n hoverTitle\n slug={sizePreviewSlug}\n title={t('upload:sizesFor', { label: data.filename })}\n >\n <PreviewSizes doc={data} imageCacheTag={imageCacheTag} uploadConfig={uploadConfig} />\n </Drawer>\n )}\n {uploadConfig?.pasteURL !== false && (\n <UploadFromURLModal\n fileUrl={fileUrl}\n handleUrlSubmit={handleUrlSubmit}\n isValidUrl={isValidUrl}\n setFileUrl={setFileUrl}\n />\n )}\n </Fragment>\n )\n\n // Hide the create file input when the collection opts out of it (unless the user has explicitly\n // removed an existing file or already selected a new one).\n const showUploadInput = Boolean(value) || removedFile || !uploadConfig?.hideFileInputOnCreate\n\n return (\n <div className={[fieldBaseClass, baseClass].filter(Boolean).join(' ')}>\n <FieldError message={errorMessage} path=\"filename\" showError={showError} />\n <div className={`${baseClass}__panel`}>\n {data?.filename && !removedFile && (\n <FileToolbar\n filename={data.filename as string}\n fileSrc={sidePanelFileSrc}\n fileUrl={data?.url as string}\n hideRemoveFile={uploadConfig?.hideRemoveFile}\n isAdjustable={fileTypeIsAdjustable}\n onEditImage={() => openModal(editDrawerSlug)}\n onReplace={handleFileRemoval}\n />\n )}\n <div className={`${baseClass}__content`}>\n {data?.filename && !removedFile ? (\n <FilePreview\n collectionSlug={collectionSlug}\n data={data as Record<string, unknown>}\n imageCacheTag={imageCacheTag}\n selectedSize={selectedSize}\n selectedSizeData={selectedSizeData}\n setSelectedSize={setSelectedSize}\n uploadConfig={uploadConfig}\n UploadFilePreview={UploadFilePreview}\n />\n ) : showUploadInput ? (\n <div className={`${baseClass}__upload`}>\n {!value && removedFile && data?.filename && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n onClick={() => setRemovedFile(false)}\n round\n tooltip={t('general:cancel')}\n />\n )}\n {!value && (\n <Dropzone onChange={handleFileSelection}>\n <div className={`${baseClass}__dropzone-content`}>\n <div className={`${baseClass}__dropzone-buttons`}>\n <Button\n buttonStyle=\"secondary\"\n onClick={() => inputRef.current?.click()}\n size=\"medium\"\n >\n {t('upload:selectFile')}\n </Button>\n <input\n accept={acceptMimeTypes}\n aria-hidden=\"true\"\n className={`${baseClass}__hidden-input`}\n hidden\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0) {\n handleFileSelection(e.target.files)\n }\n }}\n ref={inputRef}\n type=\"file\"\n />\n {uploadConfig?.pasteURL !== false && (\n <Fragment>\n <span className={`${baseClass}__or-text`}>{t('general:or')}</span>\n <Button\n buttonStyle=\"secondary\"\n onClick={() => {\n openModal(pasteURLDrawerSlug)\n setUploadControlFileUrl('')\n setUploadControlFile(null)\n setUploadControlFileName(null)\n }}\n size=\"medium\"\n >\n {t('upload:pasteURL')}\n </Button>\n </Fragment>\n )}\n {UploadControls ?? null}\n </div>\n <p className={`${baseClass}__drag-text`}>\n {t('general:or')} {t('upload:dragAndDrop')}\n </p>\n </div>\n </Dropzone>\n )}\n {value && fileSrc && (\n <Fragment>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n onClick={handleFileRemoval}\n round\n tooltip={t('general:cancel')}\n />\n {renderSelectedFilePreview(fileSrc)}\n <div className={`${baseClass}__file-adjustments`}>\n {/* Custom id so this editor doesn't collide with the hidden auto `filename` field. */}\n <TextInput\n id=\"field-filemanager-filename\"\n label={t('upload:fileName')}\n onChange={handleFileNameChange}\n path=\"filename\"\n value={filename || value.name}\n />\n {(value.size || value.type) && (\n <span className={`${baseClass}__selected-meta`}>\n {[value.size ? formatFilesize(value.size) : null, value.type]\n .filter(Boolean)\n .join(' – ')}\n </span>\n )}\n </div>\n </Fragment>\n )}\n </div>\n ) : null}\n </div>\n </div>\n {drawers}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useModal","formatFilesize","isImage","React","Fragment","useCallback","useEffect","useState","FieldError","fieldBaseClass","TextInput","useForm","useField","useDocumentInfo","EditDepthProvider","useTranslation","useUploadControls","useUploadEdits","Button","Drawer","Dropzone","EditUpload","PreviewSizes","Thumbnail","editDrawerSlug","sizePreviewSlug","UploadFromURLModal","usePasteFromClipboard","useUploadFromUrl","UploadDropzoneContent","AudioPreview","FilePreview","PdfPreview","VideoPreview","FileToolbar","baseClass","validate","value","undefined","name","FileManager","t0","$","collectionSlug","initialState","resetUploadEdits","resetUploadEditsFromProps","updateUploadEdits","updateUploadEditsFromProps","uploadConfig","UploadControls","uploadEdits","uploadEditsFromProps","UploadFilePreview","openModal","t","setModified","data","t1","Symbol","for","path","errorMessage","setValue","showError","setUploadControlFile","setUploadControlFileName","setUploadControlFileUrl","uploadControlFile","uploadControlFileUrl","uploadEditsContext","fileSrc","setFileSrc","removedFile","setRemovedFile","filename","setFilename","selectedSize","setSelectedSize","acceptMimeTypes","mimeTypes","join","imageCacheTag","cacheTags","updatedAt","hasImageSizes","imageSizes","length","hasResizeOptions","Boolean","resizeOptions","focalPointEnabled","focalPoint","crop","t2","t3","showCrop","showFocalPoint","selectedSizeData","sizes","sidePanelFileSrc","url","thumbnailURL","sidePanelMimeType","mimeType","fileTypeIsAdjustable","renameFile","_temp","t4","t5","file","isNewFile","t6","File","URL","createObjectURL","handleFileChange","e","updatedFileName","target","handleFileNameChange","files","handleFileSelection","t7","file_0","handleFileFetchedFromUrl","t8","onFileFetched","fileUrl","handleUrlSubmit","isValidUrl","setFileUrl","t9","handlePasteFromClipboard","t10","handleFileRemoval","t11","args","onEditsSave","t12","t13","t14","t15","t16","t17","t18","t19","startsWith","revokeObjectURL","t20","t21","handleControlFileUrl","t22","t23","t24","type","src","fileType","_jsx","className","children","title","size","renderSelectedFilePreview","drawers","_jsxs","fileName","initialCrop","initialFocalPoint","x","focalX","y","focalY","onSave","hoverTitle","slug","label","doc","pasteURL","showUploadInput","hideFileInputOnCreate","t25","filter","message","hideRemoveFile","isAdjustable","onEditImage","onReplace","buttonStyle","icon","onClick","round","tooltip","onChange","extraControls","onFilesSelected","onPasteFromClipboard","pasteButtonClassName","pasteTooltip","id","fileToChange","newName","lastModified"],"sources":["../../../src/elements/FileManager/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig, UploadEdits } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { formatFilesize, isImage } from 'payload/shared'\nimport React, { Fragment, useCallback, useEffect, useState } from 'react'\n\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { fieldBaseClass } from '../../fields/shared/index.js'\nimport { TextInput } from '../../fields/Text/Input.js'\nimport { useForm } from '../../forms/Form/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { EditDepthProvider } from '../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { useUploadControls } from '../../providers/UploadControls/index.js'\nimport { useUploadEdits } from '../../providers/UploadEdits/index.js'\nimport { Button } from '../Button/index.js'\nimport { Drawer } from '../Drawer/index.js'\nimport { Dropzone } from '../Dropzone/index.js'\nimport { EditUpload } from '../EditUpload/index.js'\nimport { PreviewSizes } from '../PreviewSizes/index.js'\nimport { Thumbnail } from '../Thumbnail/index.js'\nimport { editDrawerSlug, sizePreviewSlug } from '../Upload/index.js'\nimport { UploadFromURLModal } from '../Upload/UploadFromURLModal/index.js'\nimport { usePasteFromClipboard } from '../Upload/usePasteFromClipboard.js'\nimport { useUploadFromUrl } from '../Upload/useUploadFromUrl.js'\nimport { UploadDropzoneContent } from '../UploadDropzoneContent/index.js'\nimport { AudioPreview } from './FilePreview/AudioPreview/index.js'\nimport { FilePreview } from './FilePreview/index.js'\nimport { PdfPreview } from './FilePreview/PdfPreview/index.js'\nimport { VideoPreview } from './FilePreview/VideoPreview/index.js'\nimport { FileToolbar } from './FileToolbar/index.js'\nimport './index.css'\n\nconst baseClass = 'file-manager'\n\nconst validate = (value) => {\n if (!value && value !== undefined) {\n return 'A file is required.'\n }\n if (value && (!value.name || value.name === '')) {\n return 'A file name is required.'\n }\n return true\n}\n\nexport type FileManagerProps = {\n readonly collectionSlug: string\n readonly initialState?: import('payload').FormState\n /**\n * When provided, upload edits are sourced from these props instead of the `useUploadEdits`\n * context. The bulk upload drawer uses this to drive per-file edits from its FormsManager.\n */\n readonly resetUploadEdits?: () => void\n readonly updateUploadEdits?: (args: UploadEdits) => void\n readonly uploadConfig: Omit<SanitizedCollectionConfig['upload'], 'uploadInstructions'>\n readonly UploadControls?: React.ReactNode\n readonly uploadEdits?: UploadEdits\n readonly UploadFilePreview?: React.ReactNode\n}\n\nexport const FileManager: React.FC<FileManagerProps> = ({\n collectionSlug,\n initialState,\n resetUploadEdits: resetUploadEditsFromProps,\n updateUploadEdits: updateUploadEditsFromProps,\n uploadConfig,\n UploadControls,\n uploadEdits: uploadEditsFromProps,\n UploadFilePreview,\n}) => {\n const { openModal } = useModal()\n const { t } = useTranslation()\n const { setModified } = useForm()\n const { data } = useDocumentInfo()\n const { errorMessage, setValue, showError, value } = useField<File>({\n path: 'file',\n validate,\n })\n const {\n setUploadControlFile,\n setUploadControlFileName,\n setUploadControlFileUrl,\n uploadControlFile,\n uploadControlFileUrl,\n } = useUploadControls()\n const uploadEditsContext = useUploadEdits()\n const resetUploadEdits = resetUploadEditsFromProps ?? uploadEditsContext.resetUploadEdits\n const updateUploadEdits = updateUploadEditsFromProps ?? uploadEditsContext.updateUploadEdits\n const uploadEdits = uploadEditsFromProps ?? uploadEditsContext.uploadEdits\n\n const [fileSrc, setFileSrc] = useState<null | string>(null)\n const [removedFile, setRemovedFile] = useState(false)\n const [filename, setFilename] = useState<string>(value?.name || '')\n const [selectedSize, setSelectedSize] = useState<null | string>(null)\n\n const acceptMimeTypes = uploadConfig.mimeTypes?.join(', ')\n const imageCacheTag = uploadConfig?.cacheTags && data?.updatedAt\n\n const hasImageSizes = uploadConfig?.imageSizes?.length > 0\n const hasResizeOptions = Boolean(uploadConfig?.resizeOptions)\n const focalPointEnabled = uploadConfig?.focalPoint === true\n const { crop: showCrop = true, focalPoint = true } = uploadConfig\n const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled)\n\n const selectedSizeData = selectedSize\n ? (data?.sizes?.[selectedSize] as Record<string, unknown>)\n : null\n const sidePanelFileSrc = (selectedSizeData?.url ?? data?.thumbnailURL ?? data?.url ?? null) as\n | null\n | string\n const sidePanelMimeType = data?.mimeType as string | undefined\n const fileTypeIsAdjustable =\n !!sidePanelMimeType &&\n isImage(sidePanelMimeType) &&\n sidePanelMimeType !== 'image/svg+xml' &&\n sidePanelMimeType !== 'image/jxl'\n\n const renameFile = (fileToChange: File, newName: string): File =>\n new File([fileToChange], newName, {\n type: fileToChange.type,\n lastModified: fileToChange.lastModified,\n })\n\n const handleFileChange = useCallback(\n ({ file, isNewFile = true }: { file: File | null; isNewFile?: boolean }) => {\n if (isNewFile && file instanceof File) {\n setFileSrc(URL.createObjectURL(file))\n }\n setValue(file)\n setUploadControlFileUrl('')\n setUploadControlFileName(null)\n setUploadControlFile(null)\n },\n [setValue, setUploadControlFile, setUploadControlFileName, setUploadControlFileUrl],\n )\n\n const handleFileNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const updatedFileName = e.target.value\n if (value) {\n handleFileChange({ file: renameFile(value, updatedFileName), isNewFile: false })\n setFilename(updatedFileName)\n }\n },\n [handleFileChange, value],\n )\n\n const handleFileSelection = useCallback(\n (files: FileList) => handleFileChange({ file: files?.[0] }),\n [handleFileChange],\n )\n\n const handleFileFetchedFromUrl = useCallback(\n (file: File) => handleFileChange({ file }),\n [handleFileChange],\n )\n\n const { fileUrl, handleUrlSubmit, isValidUrl, setFileUrl } = useUploadFromUrl({\n collectionSlug,\n onFileFetched: handleFileFetchedFromUrl,\n uploadConfig,\n })\n\n const handlePasteFromClipboard = usePasteFromClipboard({\n handleFileSelection,\n handleUrlSubmit,\n setFileUrl,\n uploadConfig,\n })\n\n const handleFileRemoval = useCallback(() => {\n setRemovedFile(true)\n handleFileChange({ file: null })\n setFileSrc('')\n setFileUrl('')\n setSelectedSize(null)\n resetUploadEdits()\n setUploadControlFileUrl('')\n setUploadControlFileName(null)\n setUploadControlFile(null)\n }, [\n handleFileChange,\n resetUploadEdits,\n setFileUrl,\n setUploadControlFile,\n setUploadControlFileName,\n setUploadControlFileUrl,\n ])\n\n const onEditsSave = useCallback(\n (args: UploadEdits) => {\n setModified(true)\n updateUploadEdits(args)\n },\n [setModified, updateUploadEdits],\n )\n\n // Reset states for when replacing the file with a new upload\n useEffect(() => {\n setSelectedSize(null)\n setRemovedFile(false)\n setFileSrc('')\n }, [data?.url, data?.filename])\n\n useEffect(() => {\n if (initialState?.file?.value instanceof File) {\n setFileSrc(URL.createObjectURL(initialState.file.value))\n setRemovedFile(false)\n }\n }, [initialState])\n\n useEffect(() => {\n return () => {\n if (fileSrc?.startsWith('blob:')) {\n URL.revokeObjectURL(fileSrc)\n }\n }\n }, [fileSrc])\n\n useEffect(() => {\n const handleControlFileUrl = async () => {\n if (uploadControlFileUrl) {\n setFileUrl(uploadControlFileUrl)\n await handleUrlSubmit()\n }\n }\n void handleControlFileUrl()\n }, [uploadControlFileUrl, handleUrlSubmit, setFileUrl])\n\n useEffect(() => {\n if (uploadControlFile) {\n handleFileChange({ file: uploadControlFile })\n }\n }, [uploadControlFile, handleFileChange])\n\n // Preview a freshly-selected (not-yet-saved) file from its local object URL, so video/audio/PDF\n // are playable/viewable just like images. Sizing is capped in CSS so large files stay contained.\n const renderSelectedFilePreview = (src: string) => {\n const fileType = value?.type ?? ''\n\n if (fileType.startsWith('video/')) {\n return (\n <div className={`${baseClass}__selected-preview`}>\n <VideoPreview fileSrc={src} />\n </div>\n )\n }\n\n if (fileType.startsWith('audio/')) {\n return (\n <div className={`${baseClass}__selected-preview ${baseClass}__selected-preview--audio`}>\n <AudioPreview fileSrc={src} />\n </div>\n )\n }\n\n if (fileType === 'application/pdf') {\n return (\n <div className={`${baseClass}__selected-preview`}>\n <PdfPreview fileSrc={src} title={value?.name} />\n </div>\n )\n }\n\n return (\n <div className={`${baseClass}__selected-preview`}>\n <Thumbnail\n collectionSlug={collectionSlug}\n fileSrc={isImage(fileType) ? src : null}\n size=\"expand\"\n />\n </div>\n )\n }\n\n const drawers = (\n <Fragment>\n {(value || data?.filename) && (\n <EditDepthProvider>\n <EditUpload\n fileName={value?.name || (data?.filename as string)}\n fileSrc={(data?.url as string) || fileSrc}\n imageCacheTag={imageCacheTag}\n initialCrop={uploadEdits?.crop ?? undefined}\n initialFocalPoint={{\n x: uploadEdits?.focalPoint?.x || (data?.focalX as number) || 50,\n y: uploadEdits?.focalPoint?.y || (data?.focalY as number) || 50,\n }}\n onSave={onEditsSave}\n showCrop={showCrop}\n showFocalPoint={showFocalPoint}\n />\n </EditDepthProvider>\n )}\n {data && hasImageSizes && (\n <Drawer\n className={`${baseClass}__preview-drawer`}\n hoverTitle\n slug={sizePreviewSlug}\n title={t('upload:sizesFor', { label: data.filename })}\n >\n <PreviewSizes doc={data} imageCacheTag={imageCacheTag} uploadConfig={uploadConfig} />\n </Drawer>\n )}\n {uploadConfig?.pasteURL !== false && (\n <UploadFromURLModal\n fileUrl={fileUrl}\n handleUrlSubmit={handleUrlSubmit}\n isValidUrl={isValidUrl}\n setFileUrl={setFileUrl}\n />\n )}\n </Fragment>\n )\n\n // Hide the create file input when the collection opts out of it (unless the user has explicitly\n // removed an existing file or already selected a new one).\n const showUploadInput = Boolean(value) || removedFile || !uploadConfig?.hideFileInputOnCreate\n\n return (\n <div className={[fieldBaseClass, baseClass].filter(Boolean).join(' ')}>\n <FieldError message={errorMessage} path=\"filename\" showError={showError} />\n <div className={`${baseClass}__panel`}>\n {data?.filename && !removedFile && (\n <FileToolbar\n filename={data.filename as string}\n fileSrc={sidePanelFileSrc}\n fileUrl={data?.url as string}\n hideRemoveFile={uploadConfig?.hideRemoveFile}\n isAdjustable={fileTypeIsAdjustable}\n onEditImage={() => openModal(editDrawerSlug)}\n onReplace={handleFileRemoval}\n />\n )}\n <div className={`${baseClass}__content`}>\n {data?.filename && !removedFile ? (\n <FilePreview\n collectionSlug={collectionSlug}\n data={data as Record<string, unknown>}\n imageCacheTag={imageCacheTag}\n selectedSize={selectedSize}\n selectedSizeData={selectedSizeData}\n setSelectedSize={setSelectedSize}\n uploadConfig={uploadConfig}\n UploadFilePreview={UploadFilePreview}\n />\n ) : showUploadInput ? (\n <div className={`${baseClass}__upload`}>\n {!value && removedFile && data?.filename && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n onClick={() => setRemovedFile(false)}\n round\n tooltip={t('general:cancel')}\n />\n )}\n {!value && (\n <Dropzone onChange={handleFileSelection}>\n <UploadDropzoneContent\n acceptMimeTypes={acceptMimeTypes}\n extraControls={UploadControls}\n onFilesSelected={handleFileSelection}\n onPasteFromClipboard={handlePasteFromClipboard}\n pasteButtonClassName={`${baseClass}__pasteFromClipboard`}\n pasteTooltip={t('upload:pasteURL')}\n />\n </Dropzone>\n )}\n {value && fileSrc && (\n <Fragment>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n onClick={handleFileRemoval}\n round\n tooltip={t('general:cancel')}\n />\n {renderSelectedFilePreview(fileSrc)}\n <div className={`${baseClass}__file-adjustments`}>\n {/* Custom id so this editor doesn't collide with the hidden auto `filename` field. */}\n <TextInput\n id=\"field-filemanager-filename\"\n label={t('upload:fileName')}\n onChange={handleFileNameChange}\n path=\"filename\"\n value={filename || value.name}\n />\n {(value.size || value.type) && (\n <span className={`${baseClass}__selected-meta`}>\n {[value.size ? formatFilesize(value.size) : null, value.type]\n .filter(Boolean)\n .join(' – ')}\n </span>\n )}\n </div>\n </Fragment>\n )}\n </div>\n ) : null}\n </div>\n </div>\n {drawers}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  export declare const pasteURLDrawerSlug = "upload-paste-url";
3
3
  type Props = {
4
4
  readonly fileUrl: string;
5
- readonly handleUrlSubmit: () => Promise<void>;
5
+ readonly handleUrlSubmit: () => Promise<boolean>;
6
6
  readonly isValidUrl: boolean;
7
7
  readonly setFileUrl: (url: string) => void;
8
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Upload/UploadFromURLModal/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAEpD,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkC9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Upload/UploadFromURLModal/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,kBAAkB,qBAAqB,CAAA;AAEpD,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkC9C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","React","TextInput","useTranslation","Button","DialogBody","DialogFooter","DialogHeader","DialogModal","pasteURLDrawerSlug","UploadFromURLModal","t0","$","fileUrl","handleUrlSubmit","isValidUrl","setFileUrl","t","t1","t2","e","preventDefault","t3","e_0","target","value","t4","_jsxs","closeOnBlur","slug","children","_jsx","showClose","title","onSubmit","label","onChange","path","placeholder","buttonStyle","disabled","onClick"],"sources":["../../../../src/elements/Upload/UploadFromURLModal/index.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport { TextInput } from '../../../fields/Text/Input.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { Button } from '../../Button/index.js'\nimport { DialogBody, DialogFooter, DialogHeader, DialogModal } from '../../Dialog/index.js'\n\nexport const pasteURLDrawerSlug = 'upload-paste-url'\n\ntype Props = {\n readonly fileUrl: string\n readonly handleUrlSubmit: () => Promise<void>\n readonly isValidUrl: boolean\n readonly setFileUrl: (url: string) => void\n}\n\nexport const UploadFromURLModal: React.FC<Props> = ({\n fileUrl,\n handleUrlSubmit,\n isValidUrl,\n setFileUrl,\n}) => {\n const { t } = useTranslation()\n\n return (\n <DialogModal closeOnBlur slug={pasteURLDrawerSlug}>\n <DialogHeader showClose title={t('upload:fromURL')} />\n <DialogBody>\n <form\n onSubmit={(e) => {\n e.preventDefault()\n void handleUrlSubmit()\n }}\n >\n <TextInput\n label={t('upload:linkToFile')}\n onChange={(e) => setFileUrl(e.target.value)}\n path=\"url\"\n placeholder=\"https://\"\n value={fileUrl}\n />\n </form>\n </DialogBody>\n <DialogFooter>\n <Button buttonStyle=\"primary\" disabled={!isValidUrl} onClick={() => void handleUrlSubmit()}>\n {t('upload:addFile')}\n </Button>\n </DialogFooter>\n </DialogModal>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AACA,OAAOC,KAAA,MAAW;AAElB,SAASC,SAAS,QAAQ;AAC1B,SAASC,cAAc,QAAQ;AAC/B,SAASC,MAAM,QAAQ;AACvB,SAASC,UAAU,EAAEC,YAAY,EAAEC,YAAY,EAAEC,WAAW,QAAQ;AAEpE,OAAO,MAAMC,kBAAA,GAAqB;AASlC,OAAO,MAAMC,kBAAA,GAAsCC,EAAA;EAAA,MAAAC,CAAA,GAAAZ,EAAA;EAAC;IAAAa,OAAA;IAAAC,eAAA;IAAAC,UAAA;IAAAC;EAAA,IAAAL,EAKnD;EACC;IAAAM;EAAA,IAAcd,cAAA;EAAA,IAAAe,EAAA;EAAA,IAAAN,CAAA,QAAAC,OAAA,IAAAD,CAAA,QAAAE,eAAA,IAAAF,CAAA,QAAAG,UAAA,IAAAH,CAAA,QAAAI,UAAA,IAAAJ,CAAA,QAAAK,CAAA;IAAA,IAAAE,EAAA;IAAA,IAAAP,CAAA,QAAAE,eAAA;MAOIK,EAAA,GAAAC,CAAA;QACRA,CAAA,CAAAC,cAAA,CAAgB;QACXP,eAAA;MAAA;MACPF,CAAA,MAAAE,eAAA;MAAAF,CAAA,MAAAO,EAAA;IAAA;MAAAA,EAAA,GAAAP,CAAA;IAAA;IAAA,IAAAU,EAAA;IAAA,IAAAV,CAAA,QAAAI,UAAA;MAIYM,EAAA,GAAAC,GAAA,IAAOP,UAAA,CAAWI,GAAA,CAAAI,MAAA,CAAAC,KAAc;MAAAb,CAAA,MAAAI,UAAA;MAAAJ,CAAA,MAAAU,EAAA;IAAA;MAAAA,EAAA,GAAAV,CAAA;IAAA;IAAA,IAAAc,EAAA;IAAA,IAAAd,CAAA,SAAAE,eAAA;MAQgBY,EAAA,GAAAA,CAAA,UAAWZ,eAAA;MAAAF,CAAA,OAAAE,eAAA;MAAAF,CAAA,OAAAc,EAAA;IAAA;MAAAA,EAAA,GAAAd,CAAA;IAAA;IAnB7EM,EAAA,GAAAS,KAAA,CAAAnB,WAAA;MAAAoB,WAAA;MAAAC,IAAA,EAAApB,kBAAA;MAAAqB,QAAA,GACEC,IAAA,CAAAxB,YAAA;QAAAyB,SAAA;QAAAC,KAAA,EAA+BhB,CAAA,CAAE;MAAA,C,GACjCc,IAAA,CAAA1B,UAAA;QAAAyB,QAAA,EACEC,IAAA,CAAC;UAAAG,QAAA,EACWf,EAGV;UAAAW,QAAA,EAEAC,IAAA,CAAA7B,SAAA;YAAAiC,KAAA,EACSlB,CAAA,CAAE;YAAAmB,QAAA,EACCd,EAAgC;YAAAe,IAAA,EACrC;YAAAC,WAAA,EACO;YAAAb,KAAA,EACLZ;UAAA,C;;UAIbkB,IAAA,CAAAzB,YAAA;QAAAwB,QAAA,EACEC,IAAA,CAAA3B,MAAA;UAAAmC,WAAA,EAAoB;UAAAC,QAAA,GAAqBzB,UAAA;UAAA0B,OAAA,EAAqBf,EAAW;UAAAI,QAAA,EACtEb,CAAA,CAAE;QAAA,C;;;;;;;;;;;;SApBTC,E;CAyBJ","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","React","TextInput","useTranslation","Button","DialogBody","DialogFooter","DialogHeader","DialogModal","pasteURLDrawerSlug","UploadFromURLModal","t0","$","fileUrl","handleUrlSubmit","isValidUrl","setFileUrl","t","t1","t2","e","preventDefault","t3","e_0","target","value","t4","_jsxs","closeOnBlur","slug","children","_jsx","showClose","title","onSubmit","label","onChange","path","placeholder","buttonStyle","disabled","onClick"],"sources":["../../../../src/elements/Upload/UploadFromURLModal/index.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport { TextInput } from '../../../fields/Text/Input.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { Button } from '../../Button/index.js'\nimport { DialogBody, DialogFooter, DialogHeader, DialogModal } from '../../Dialog/index.js'\n\nexport const pasteURLDrawerSlug = 'upload-paste-url'\n\ntype Props = {\n readonly fileUrl: string\n readonly handleUrlSubmit: () => Promise<boolean>\n readonly isValidUrl: boolean\n readonly setFileUrl: (url: string) => void\n}\n\nexport const UploadFromURLModal: React.FC<Props> = ({\n fileUrl,\n handleUrlSubmit,\n isValidUrl,\n setFileUrl,\n}) => {\n const { t } = useTranslation()\n\n return (\n <DialogModal closeOnBlur slug={pasteURLDrawerSlug}>\n <DialogHeader showClose title={t('upload:fromURL')} />\n <DialogBody>\n <form\n onSubmit={(e) => {\n e.preventDefault()\n void handleUrlSubmit()\n }}\n >\n <TextInput\n label={t('upload:linkToFile')}\n onChange={(e) => setFileUrl(e.target.value)}\n path=\"url\"\n placeholder=\"https://\"\n value={fileUrl}\n />\n </form>\n </DialogBody>\n <DialogFooter>\n <Button buttonStyle=\"primary\" disabled={!isValidUrl} onClick={() => void handleUrlSubmit()}>\n {t('upload:addFile')}\n </Button>\n </DialogFooter>\n </DialogModal>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AACA,OAAOC,KAAA,MAAW;AAElB,SAASC,SAAS,QAAQ;AAC1B,SAASC,cAAc,QAAQ;AAC/B,SAASC,MAAM,QAAQ;AACvB,SAASC,UAAU,EAAEC,YAAY,EAAEC,YAAY,EAAEC,WAAW,QAAQ;AAEpE,OAAO,MAAMC,kBAAA,GAAqB;AASlC,OAAO,MAAMC,kBAAA,GAAsCC,EAAA;EAAA,MAAAC,CAAA,GAAAZ,EAAA;EAAC;IAAAa,OAAA;IAAAC,eAAA;IAAAC,UAAA;IAAAC;EAAA,IAAAL,EAKnD;EACC;IAAAM;EAAA,IAAcd,cAAA;EAAA,IAAAe,EAAA;EAAA,IAAAN,CAAA,QAAAC,OAAA,IAAAD,CAAA,QAAAE,eAAA,IAAAF,CAAA,QAAAG,UAAA,IAAAH,CAAA,QAAAI,UAAA,IAAAJ,CAAA,QAAAK,CAAA;IAAA,IAAAE,EAAA;IAAA,IAAAP,CAAA,QAAAE,eAAA;MAOIK,EAAA,GAAAC,CAAA;QACRA,CAAA,CAAAC,cAAA,CAAgB;QACXP,eAAA;MAAA;MACPF,CAAA,MAAAE,eAAA;MAAAF,CAAA,MAAAO,EAAA;IAAA;MAAAA,EAAA,GAAAP,CAAA;IAAA;IAAA,IAAAU,EAAA;IAAA,IAAAV,CAAA,QAAAI,UAAA;MAIYM,EAAA,GAAAC,GAAA,IAAOP,UAAA,CAAWI,GAAA,CAAAI,MAAA,CAAAC,KAAc;MAAAb,CAAA,MAAAI,UAAA;MAAAJ,CAAA,MAAAU,EAAA;IAAA;MAAAA,EAAA,GAAAV,CAAA;IAAA;IAAA,IAAAc,EAAA;IAAA,IAAAd,CAAA,SAAAE,eAAA;MAQgBY,EAAA,GAAAA,CAAA,UAAWZ,eAAA;MAAAF,CAAA,OAAAE,eAAA;MAAAF,CAAA,OAAAc,EAAA;IAAA;MAAAA,EAAA,GAAAd,CAAA;IAAA;IAnB7EM,EAAA,GAAAS,KAAA,CAAAnB,WAAA;MAAAoB,WAAA;MAAAC,IAAA,EAAApB,kBAAA;MAAAqB,QAAA,GACEC,IAAA,CAAAxB,YAAA;QAAAyB,SAAA;QAAAC,KAAA,EAA+BhB,CAAA,CAAE;MAAA,C,GACjCc,IAAA,CAAA1B,UAAA;QAAAyB,QAAA,EACEC,IAAA,CAAC;UAAAG,QAAA,EACWf,EAGV;UAAAW,QAAA,EAEAC,IAAA,CAAA7B,SAAA;YAAAiC,KAAA,EACSlB,CAAA,CAAE;YAAAmB,QAAA,EACCd,EAAgC;YAAAe,IAAA,EACrC;YAAAC,WAAA,EACO;YAAAb,KAAA,EACLZ;UAAA,C;;UAIbkB,IAAA,CAAAzB,YAAA;QAAAwB,QAAA,EACEC,IAAA,CAAA3B,MAAA;UAAAmC,WAAA,EAAoB;UAAAC,QAAA,GAAqBzB,UAAA;UAAA0B,OAAA,EAAqBf,EAAW;UAAAI,QAAA,EACtEb,CAAA,CAAE;QAAA,C;;;;;;;;;;;;SApBTC,E;CAyBJ","ignoreList":[]}
@@ -9,6 +9,8 @@
9
9
  .file-field__upload {
10
10
  display: flex;
11
11
  position: relative;
12
+ flex-wrap: wrap;
13
+ justify-content: space-between;
12
14
  }
13
15
 
14
16
  .file-field__file-selected {
@@ -17,7 +19,7 @@
17
19
 
18
20
  .file-field__thumbnail-wrap {
19
21
  position: relative;
20
- width: 150px;
22
+ width: 50%;
21
23
 
22
24
  .thumbnail {
23
25
  position: relative;
@@ -32,16 +34,19 @@
32
34
  position: absolute;
33
35
  top: var(--spacer-2);
34
36
  right: var(--spacer-2);
35
- margin: 0;
37
+ margin: var(--spacer-3);
36
38
  z-index: 1;
39
+ order: 2;
37
40
  }
38
41
 
39
42
  .file-field__file-adjustments {
40
- padding: var(--spacer-3);
43
+ padding: var(--spacer-2);
41
44
  width: 100%;
42
45
  display: flex;
43
46
  flex-direction: column;
44
- gap: var(--spacer-2);
47
+ gap: 0;
48
+ order: 3;
49
+ border-top: var(--stroke-width-medium) solid var(--color-bg-primary);
45
50
  }
46
51
 
47
52
  .file-field__upload-actions {
@@ -96,21 +101,28 @@
96
101
  text-transform: lowercase;
97
102
  align-self: center;
98
103
  color: var(--color-text-tertiary);
104
+ display: none;
99
105
  }
100
106
 
101
107
  .file-field--side-panel {
102
108
  position: relative;
103
109
  flex: 1 0 0;
104
110
  width: 100%;
105
- min-height: max(500px, calc(100dvh - var(--doc-controls-height) - var(--app-header-height)));
111
+ min-height: 400px;
106
112
  margin-bottom: 0;
107
113
  border-radius: 0;
108
114
  background: var(--color-bg-secondary);
109
115
  }
110
116
 
117
+ .file-field__side-panel {
118
+ position: static;
119
+ height: auto;
120
+ min-height: 400px;
121
+ }
122
+
111
123
  .file-field__side-panel__content {
112
124
  display: flex;
113
- flex-direction: row;
125
+ flex-direction: column;
114
126
  flex: 1 1 0;
115
127
  min-height: 0;
116
128
  overflow: hidden;
@@ -125,6 +137,7 @@
125
137
  padding: var(--spacer-3) var(--spacer-4);
126
138
  gap: var(--spacer-3);
127
139
  overflow: hidden;
140
+ height: auto;
128
141
  }
129
142
 
130
143
  .file-field__side-panel__info {
@@ -197,55 +210,49 @@
197
210
  }
198
211
  }
199
212
 
200
- @media (max-width: 1024px) {
213
+ @media (min-width: 1024px) {
201
214
  .file-field--side-panel {
202
- min-height: 400px;
215
+ min-height: max(500px, calc(100dvh - var(--doc-controls-height) - var(--app-header-height)));
203
216
  }
204
217
 
205
218
  .file-field__side-panel {
206
- position: static;
207
- height: auto;
208
- min-height: 400px;
219
+ min-height: auto;
209
220
  }
210
221
 
211
222
  .file-field__side-panel__content {
212
- flex-direction: column;
213
- }
214
-
215
- .file-field__side-panel__preview {
216
- height: auto;
223
+ flex-direction: row;
217
224
  }
218
225
  }
219
226
 
220
- @media (max-width: 768px) {
227
+ @media (min-width: 768px) {
221
228
  .file-field__upload {
222
- flex-wrap: wrap;
223
- justify-content: space-between;
229
+ flex-wrap: nowrap;
230
+ justify-content: normal;
224
231
  }
225
232
 
226
233
  .file-field__remove {
227
- margin: var(--spacer-3);
228
- order: 2;
234
+ margin: 0;
235
+ order: 0;
229
236
  }
230
237
 
231
238
  .file-field__file-adjustments {
232
- order: 3;
233
- border-top: 2px solid var(--color-bg-primary);
234
- padding: var(--spacer-2);
235
- gap: 0;
239
+ order: 0;
240
+ border-top: none;
241
+ padding: var(--spacer-3);
242
+ gap: var(--spacer-2);
236
243
  }
237
244
 
238
245
  .file-field__thumbnail-wrap {
239
- order: 1;
240
- width: 50%;
241
-
242
- .thumbnail {
243
- width: 100%;
244
- }
246
+ order: 0;
247
+ width: 150px;
245
248
  }
246
249
 
247
250
  .file-field__edit {
248
- display: none;
251
+ /* display: revert; */
252
+ }
253
+
254
+ .file-field__dragAndDropText {
255
+ display: block;
249
256
  }
250
257
  }
251
258
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Upload/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAe,MAAM,SAAS,CAAA;AAIhF,OAAO,KAA6D,MAAM,OAAO,CAAA;AAkBjF,OAAO,aAAa,CAAA;AAIpB,OAAO,EAAE,kBAAkB,EAAsB,MAAM,+BAA+B,CAAA;AAEtF,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAG7B,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAC3C,eAAO,MAAM,eAAe,kBAAkB,CAAA;AAc9C,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,wEAKvB,iBAAiB,sBAkDnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAA;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1C,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAYxC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Upload/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAe,MAAM,SAAS,CAAA;AAIhF,OAAO,KAAmD,MAAM,OAAO,CAAA;AAevE,OAAO,aAAa,CAAA;AAKpB,OAAO,EAAE,kBAAkB,EAAsB,MAAM,+BAA+B,CAAA;AAItF,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAG7B,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAC3C,eAAO,MAAM,eAAe,kBAAkB,CAAA;AAc9C,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,wEAKvB,iBAAiB,sBAkDnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAA;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IAC1D,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1C,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAYxC,CAAA"}
@@ -3,15 +3,13 @@
3
3
  import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { useModal } from '@faceless-ui/modal';
6
- import { formatAdminURL, isImage } from 'payload/shared';
7
- import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react';
8
- import { toast } from 'sonner';
6
+ import { isImage } from 'payload/shared';
7
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
9
8
  import { FieldError } from '../../fields/FieldError/index.js';
10
9
  import { fieldBaseClass } from '../../fields/shared/index.js';
11
10
  import { TextInput } from '../../fields/Text/Input.js';
12
11
  import { useForm, useFormProcessing } from '../../forms/Form/index.js';
13
12
  import { useField } from '../../forms/useField/index.js';
14
- import { useConfig } from '../../providers/Config/index.js';
15
13
  import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
16
14
  import { EditDepthProvider } from '../../providers/EditDepth/index.js';
17
15
  import { useTranslation } from '../../providers/Translation/index.js';
@@ -20,12 +18,14 @@ import { useUploadEdits } from '../../providers/UploadEdits/index.js';
20
18
  import { Button } from '../Button/index.js';
21
19
  import { Drawer } from '../Drawer/index.js';
22
20
  import { Dropzone } from '../Dropzone/index.js';
23
- import { EditUpload } from '../EditUpload/index.js';
24
21
  import './index.css';
22
+ import { EditUpload } from '../EditUpload/index.js';
25
23
  import { FileDetails } from '../FileDetails/index.js';
26
24
  import { PreviewSizes } from '../PreviewSizes/index.js';
27
25
  import { Thumbnail } from '../Thumbnail/index.js';
28
26
  import { pasteURLDrawerSlug, UploadFromURLModal } from './UploadFromURLModal/index.js';
27
+ import { usePasteFromClipboard } from './usePasteFromClipboard.js';
28
+ import { useUploadFromUrl } from './useUploadFromUrl.js';
29
29
  export { pasteURLDrawerSlug };
30
30
  const baseClass = 'file-field';
31
31
  export const editDrawerSlug = 'edit-upload';
@@ -149,31 +149,17 @@ const UploadComponent = props => {
149
149
  setUploadControlFileName,
150
150
  setUploadControlFileUrl,
151
151
  uploadControlFile,
152
- uploadControlFileName,
153
152
  uploadControlFileUrl
154
153
  } = useUploadControls();
155
- const {
156
- config: {
157
- routes: {
158
- api
159
- }
160
- }
161
- } = useConfig();
162
154
  const {
163
155
  t
164
156
  } = useTranslation();
165
- const {
166
- closeModal,
167
- openModal
168
- } = useModal();
169
157
  const {
170
158
  setModified
171
159
  } = useForm();
172
160
  const {
173
- id,
174
161
  data,
175
- docPermissions,
176
- setUploadStatus
162
+ docPermissions
177
163
  } = useDocumentInfo();
178
164
  const isFormSubmitting = useFormProcessing();
179
165
  const {
@@ -188,9 +174,7 @@ const UploadComponent = props => {
188
174
  const [fileSrc, setFileSrc] = useState(null);
189
175
  const [removedFile, setRemovedFile] = useState(false);
190
176
  const [filename, setFilename] = useState(value?.name || '');
191
- const [fileUrl, setFileUrl] = useState('');
192
177
  const inputRef = useRef(null);
193
- const useServerSideFetch = typeof uploadConfig?.pasteURL === 'object' && uploadConfig.pasteURL.allowList?.length > 0;
194
178
  const handleFileChange = useCallback(({
195
179
  file,
196
180
  isNewFile = true
@@ -230,6 +214,25 @@ const UploadComponent = props => {
230
214
  file: fileToUpload
231
215
  });
232
216
  }, [handleFileChange]);
217
+ const handleFileFetchedFromUrl = useCallback(file_0 => handleFileChange({
218
+ file: file_0
219
+ }), [handleFileChange]);
220
+ const {
221
+ fileUrl,
222
+ handleUrlSubmit,
223
+ isValidUrl,
224
+ setFileUrl
225
+ } = useUploadFromUrl({
226
+ collectionSlug,
227
+ onFileFetched: handleFileFetchedFromUrl,
228
+ uploadConfig
229
+ });
230
+ const handlePasteFromClipboard = usePasteFromClipboard({
231
+ handleFileSelection,
232
+ handleUrlSubmit,
233
+ setFileUrl,
234
+ uploadConfig
235
+ });
233
236
  const handleFileRemoval = useCallback(() => {
234
237
  setRemovedFile(true);
235
238
  handleFileChange({
@@ -241,71 +244,11 @@ const UploadComponent = props => {
241
244
  setUploadControlFileUrl('');
242
245
  setUploadControlFileName(null);
243
246
  setUploadControlFile(null);
244
- }, [handleFileChange, resetUploadEdits, setUploadControlFile, setUploadControlFileName, setUploadControlFileUrl]);
247
+ }, [handleFileChange, resetUploadEdits, setFileUrl, setUploadControlFile, setUploadControlFileName, setUploadControlFileUrl]);
245
248
  const onEditsSave = useCallback(args => {
246
249
  setModified(true);
247
250
  updateUploadEdits(args);
248
251
  }, [setModified, updateUploadEdits]);
249
- const isValidUrl = Boolean(fileUrl && URL.canParse(fileUrl));
250
- const handleUrlSubmit = useCallback(async () => {
251
- if (!fileUrl || !URL.canParse(fileUrl) || uploadConfig?.pasteURL === false) {
252
- return;
253
- }
254
- setUploadStatus('uploading');
255
- try {
256
- // Attempt client-side fetch
257
- const clientResponse = await fetch(fileUrl);
258
- if (!clientResponse.ok) {
259
- throw new Error(`Fetch failed with status: ${clientResponse.status}`);
260
- }
261
- const blob = await clientResponse.blob();
262
- const rawSegment = fileUrl.split('/').pop() || '';
263
- const fileName = uploadControlFileName || decodeURIComponent(rawSegment.split('?')[0]);
264
- const file_0 = new File([blob], fileName, {
265
- type: blob.type
266
- });
267
- handleFileChange({
268
- file: file_0
269
- });
270
- setUploadStatus('idle');
271
- closeModal(pasteURLDrawerSlug);
272
- setFileUrl('');
273
- return; // Exit if client-side fetch succeeds
274
- } catch (_clientError) {
275
- if (!useServerSideFetch) {
276
- // If server-side fetch is not enabled, show client-side error
277
- toast.error('Failed to fetch the file.');
278
- setUploadStatus('failed');
279
- return;
280
- }
281
- }
282
- // Attempt server-side fetch if client-side fetch fails and useServerSideFetch is true
283
- try {
284
- const pasteURL = `/${collectionSlug}/paste-url${id ? `/${id}?` : '?'}src=${encodeURIComponent(fileUrl)}`;
285
- const serverResponse = await fetch(formatAdminURL({
286
- apiRoute: api,
287
- path: pasteURL
288
- }));
289
- if (!serverResponse.ok) {
290
- throw new Error(`Fetch failed with status: ${serverResponse.status}`);
291
- }
292
- const blob_0 = await serverResponse.blob();
293
- const rawSegment_0 = fileUrl.split('/').pop() || '';
294
- const fileName_0 = decodeURIComponent(rawSegment_0.split('?')[0]);
295
- const file_1 = new File([blob_0], fileName_0, {
296
- type: blob_0.type
297
- });
298
- handleFileChange({
299
- file: file_1
300
- });
301
- setUploadStatus('idle');
302
- closeModal(pasteURLDrawerSlug);
303
- setFileUrl('');
304
- } catch (_serverError) {
305
- toast.error('The provided URL is not allowed.');
306
- setUploadStatus('failed');
307
- }
308
- }, [api, closeModal, collectionSlug, fileUrl, handleFileChange, id, setUploadStatus, uploadConfig, uploadControlFileName, useServerSideFetch]);
309
252
  useEffect(() => {
310
253
  if (initialState?.file?.value instanceof File) {
311
254
  setFileSrc(URL.createObjectURL(initialState.file.value));
@@ -344,7 +287,7 @@ const UploadComponent = props => {
344
287
  }
345
288
  };
346
289
  void handleControlFileUrl();
347
- }, [uploadControlFileUrl, handleUrlSubmit]);
290
+ }, [uploadControlFileUrl, handleUrlSubmit, setFileUrl]);
348
291
  useEffect(() => {
349
292
  const handleControlFile = () => {
350
293
  if (uploadControlFile) {
@@ -433,21 +376,16 @@ const UploadComponent = props => {
433
376
  },
434
377
  ref: inputRef,
435
378
  type: "file"
436
- }), uploadConfig?.pasteURL !== false && /*#__PURE__*/_jsxs(Fragment, {
437
- children: [/*#__PURE__*/_jsx("span", {
438
- className: `${baseClass}__orText`,
439
- children: t('general:or')
440
- }), /*#__PURE__*/_jsx(Button, {
441
- buttonStyle: "pill",
442
- onClick: () => {
443
- openModal(pasteURLDrawerSlug);
444
- setUploadControlFileUrl('');
445
- setUploadControlFile(null);
446
- setUploadControlFileName(null);
447
- },
448
- size: "medium",
449
- children: t('upload:pasteURL')
450
- })]
379
+ }), /*#__PURE__*/_jsx("span", {
380
+ className: `${baseClass}__orText`,
381
+ children: t('general:or')
382
+ }), /*#__PURE__*/_jsx(Button, {
383
+ buttonStyle: "pill",
384
+ className: `${baseClass}__pasteFromClipboard`,
385
+ icon: "clipboard",
386
+ onClick: handlePasteFromClipboard,
387
+ size: "medium",
388
+ tooltip: t('upload:pasteURL')
451
389
  }), UploadControls ? UploadControls : null]
452
390
  }), /*#__PURE__*/_jsxs("p", {
453
391
  className: `${baseClass}__dragAndDropText`,