@payloadcms/ui 4.0.0-internal.2f0d313 → 4.0.0-internal.314c594
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/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +18 -16
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/fields/Upload/Input.spec.js +241 -0
- package/dist/fields/Upload/Input.spec.js.map +1 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +1 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/views/Edit/SetDocumentTitle/index.d.ts.map +1 -1
- package/dist/views/Edit/SetDocumentTitle/index.js +4 -1
- package/dist/views/Edit/SetDocumentTitle/index.js.map +1 -1
- package/dist/views/Edit/index.d.ts.map +1 -1
- package/dist/views/Edit/index.js +3 -2
- package/dist/views/Edit/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/fields/Upload/Input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EAEnB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,WAAW,IAAI,eAAe,EAC9B,iBAAiB,EAClB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAKjD,OAAO,KAA0C,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/fields/Upload/Input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EAEnB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,WAAW,IAAI,eAAe,EAC9B,iBAAiB,EAClB,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAKjD,OAAO,KAA0C,MAAM,OAAO,CAAA;AAwB9D,OAAO,aAAa,CAAA;AAGpB,eAAO,MAAM,SAAS,WAAW,CAAA;AAIjC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAA;IAC5C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAA;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAA,KAAK,IAAI,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,iBAAiB,GAAG,iBAAiB,EAAE,CAAA;CACjG,CAAA;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,qBA2uBlD"}
|
|
@@ -19,6 +19,7 @@ import { FieldLabel } from '../../fields/FieldLabel/index.js';
|
|
|
19
19
|
import { useAuth } from '../../providers/Auth/index.js';
|
|
20
20
|
import { useLocale } from '../../providers/Locale/index.js';
|
|
21
21
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
22
|
+
import { abortAndIgnore } from '../../utilities/abortAndIgnore.js';
|
|
22
23
|
import { getFilesFromClipboard } from '../../utilities/getFilesFromClipboard.js';
|
|
23
24
|
import { normalizeRelationshipValue } from '../../utilities/normalizeRelationshipValue.js';
|
|
24
25
|
import { fieldBaseClass } from '../shared/index.js';
|
|
@@ -141,10 +142,6 @@ export function UploadInput(props) {
|
|
|
141
142
|
}] = useDocumentDrawer({
|
|
142
143
|
collectionSlug: activeRelationTo
|
|
143
144
|
});
|
|
144
|
-
/**
|
|
145
|
-
* Track the last loaded value to prevent unnecessary reloads
|
|
146
|
-
*/
|
|
147
|
-
const loadedValueRef = React.useRef(null);
|
|
148
145
|
const canCreate = useMemo(() => {
|
|
149
146
|
if (!allowCreate) {
|
|
150
147
|
return false;
|
|
@@ -161,7 +158,7 @@ export function UploadInput(props) {
|
|
|
161
158
|
onChangeFromProps(newValue);
|
|
162
159
|
}
|
|
163
160
|
}, [onChangeFromProps]);
|
|
164
|
-
const populateDocs = React.useCallback(async items => {
|
|
161
|
+
const populateDocs = React.useCallback(async (items, options) => {
|
|
165
162
|
if (!items?.length) {
|
|
166
163
|
return [];
|
|
167
164
|
}
|
|
@@ -207,7 +204,8 @@ export function UploadInput(props) {
|
|
|
207
204
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
208
205
|
'X-Payload-HTTP-Method-Override': 'GET'
|
|
209
206
|
},
|
|
210
|
-
method: 'POST'
|
|
207
|
+
method: 'POST',
|
|
208
|
+
signal: options?.signal
|
|
211
209
|
});
|
|
212
210
|
let docs = [];
|
|
213
211
|
if (response.ok) {
|
|
@@ -447,6 +445,7 @@ export function UploadInput(props) {
|
|
|
447
445
|
setPopulatedDocs(newValue_4);
|
|
448
446
|
}, [onChange, hasMany, relationTo]);
|
|
449
447
|
useEffect(() => {
|
|
448
|
+
const abortController = new AbortController();
|
|
450
449
|
async function loadInitialDocs() {
|
|
451
450
|
if (value) {
|
|
452
451
|
let itemsToLoad_0 = [];
|
|
@@ -483,23 +482,26 @@ export function UploadInput(props) {
|
|
|
483
482
|
}
|
|
484
483
|
}
|
|
485
484
|
if (itemsToLoad_0.length > 0) {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
485
|
+
try {
|
|
486
|
+
const loadedDocs_1 = await populateDocs(itemsToLoad_0, {
|
|
487
|
+
signal: abortController.signal
|
|
488
|
+
});
|
|
489
|
+
if (loadedDocs_1 && !abortController.signal.aborted) {
|
|
490
|
+
setPopulatedDocs(loadedDocs_1);
|
|
491
|
+
}
|
|
492
|
+
} catch (_err_0) {
|
|
493
|
+
// Ignore aborted requests from superseded values / unmount
|
|
490
494
|
}
|
|
491
495
|
}
|
|
492
496
|
} else {
|
|
493
497
|
// Clear populated docs when value is cleared
|
|
494
498
|
setPopulatedDocs([]);
|
|
495
|
-
loadedValueRef.current = null;
|
|
496
499
|
}
|
|
497
500
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
}
|
|
501
|
+
void loadInitialDocs();
|
|
502
|
+
return () => {
|
|
503
|
+
abortAndIgnore(abortController);
|
|
504
|
+
};
|
|
503
505
|
}, [populateDocs, value, relationTo]);
|
|
504
506
|
useEffect(() => {
|
|
505
507
|
setOnSuccess(onUploadSuccess);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":["useModal","formatAdminURL","qs","React","useCallback","useEffect","useMemo","toast","useBulkUpload","Button","useDocumentDrawer","Dropzone","useListDrawer","RenderCustomComponent","ShimmerEffect","FieldDescription","FieldError","FieldLabel","useAuth","useLocale","useTranslation","getFilesFromClipboard","normalizeRelationshipValue","fieldBaseClass","UploadComponentHasMany","UploadComponentHasOne","baseClass","UploadInput","props","AfterInput","allowCreate","api","BeforeInput","className","Description","description","displayPreview","Error","filterOptions","filterOptionsFromProps","hasMany","isSortable","Label","label","localized","maxRows","onChange","onChangeFromProps","path","readOnly","relationTo","required","serverURL","showError","style","value","populatedDocs","setPopulatedDocs","useState","activeRelationTo","Array","isArray","openModal","modalSlug","drawerSlug","setCollectionSlug","setInitialFiles","setMaxFiles","setOnSuccess","setSelectableCollections","permissions","code","i18n","t","collectionSlugsWithCreatePermission","filter","relation","collections","create","isPoly","existingIdsByRelation","values","val","push","collection","id","newFilterOptions","relations","forEach","existingIds","not_in","concat","ListDrawer","closeDrawer","closeListDrawer","openDrawer","openListDrawer","collectionSlugs","CreateDocDrawer","closeCreateDocDrawer","openCreateDocDrawer","collectionSlug","loadedValueRef","useRef","canCreate","newValue","populateDocs","items","length","grouped","idValue","fetches","Object","entries","map","ids","query","depth","draft","limit","locale","where","and","in","response","fetch","apiRoute","body","stringify","credentials","headers","language","method","docs","ok","data","json","docsById","reduce","acc","doc","results","Promise","all","lookup","sortedDocs","filename","isPlaceholder","normalizeValue","onUploadSuccess","uploadedForms","newValues","form","normalizedExisting","mergedValue","currentDocs","firstDoc","onLocalFileSelection","fileList","fileListToUse","dataTransfer","DataTransfer","add","files","collectionToUse","handlePasteFromClipboard","error","_err","onListBulkSelect","relationToUse","selectedDocIDs","isSelected","itemsToLoad","loadedDocs","onDocCreate","onListSelect","selectedDoc","valueToUse","reloadDoc","docID","updatedDocsToPropogate","existingDocIndex","findIndex","hasExisting","updatedDocs","onReorder","newValueToSave","rel","onRemove","loadInitialDocs","v","current","valueChanged","showDropzone","_jsxs","Boolean","join","replace","_jsx","CustomComponent","Fallback","_Fragment","fileDocs","readonly","showCollectionSlug","height","fileDoc","disabled","multipleFiles","buttonStyle","onClick","size","icon","tooltip","onSave","enableRowSelections","onBulkSelect","onSelect"],"sources":["../../../src/fields/Upload/Input.tsx"],"sourcesContent":["'use client'\n\nimport type {\n ClientCollectionConfig,\n FieldLabelClientProps,\n FilterOptionsResult,\n JsonObject,\n StaticDescription,\n StaticLabel,\n UploadFieldClient,\n UploadField as UploadFieldType,\n ValueWithRelation,\n} from 'payload'\nimport type { MarkOptional } from 'ts-essentials'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo } from 'react'\nimport { toast } from 'sonner'\n\nimport type { ListDrawerProps } from '../../elements/ListDrawer/types.js'\nimport type { ReloadDoc, ValueAsDataWithRelation } from './types.js'\n\nimport { type BulkUploadContext, useBulkUpload } from '../../elements/BulkUpload/index.js'\nimport { Button } from '../../elements/Button/index.js'\nimport { useDocumentDrawer } from '../../elements/DocumentDrawer/index.js'\nimport { Dropzone } from '../../elements/Dropzone/index.js'\nimport { useListDrawer } from '../../elements/ListDrawer/index.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { ShimmerEffect } from '../../elements/ShimmerEffect/index.js'\nimport { FieldDescription } from '../../fields/FieldDescription/index.js'\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { FieldLabel } from '../../fields/FieldLabel/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { getFilesFromClipboard } from '../../utilities/getFilesFromClipboard.js'\nimport { normalizeRelationshipValue } from '../../utilities/normalizeRelationshipValue.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { UploadComponentHasMany } from './HasMany/index.js'\nimport './index.css'\nimport { UploadComponentHasOne } from './HasOne/index.js'\n\nexport const baseClass = 'upload'\n\ntype PopulatedDocs = { relationTo: string; value: JsonObject }[]\n\nexport type UploadInputProps = {\n readonly AfterInput?: React.ReactNode\n readonly allowCreate?: boolean\n /**\n * Controls the visibility of the \"Create new collection\" button\n */\n readonly api?: string\n readonly BeforeInput?: React.ReactNode\n readonly className?: string\n readonly collection?: ClientCollectionConfig\n readonly customUploadActions?: React.ReactNode[]\n readonly Description?: React.ReactNode\n readonly description?: StaticDescription\n readonly displayPreview?: boolean\n readonly Error?: React.ReactNode\n readonly filterOptions?: FilterOptionsResult\n readonly hasMany?: boolean\n readonly hideRemoveFile?: boolean\n readonly isSortable?: boolean\n readonly Label?: React.ReactNode\n readonly label?: StaticLabel\n readonly labelProps?: FieldLabelClientProps<MarkOptional<UploadFieldClient, 'type'>>\n readonly localized?: boolean\n readonly maxRows?: number\n readonly onChange?: (e) => void\n readonly path: string\n readonly readOnly?: boolean\n readonly relationTo: UploadFieldType['relationTo']\n readonly required?: boolean\n readonly serverURL?: string\n readonly showError?: boolean\n readonly style?: React.CSSProperties\n readonly value?: (number | string)[] | number | string | ValueWithRelation | ValueWithRelation[]\n}\n\nexport function UploadInput(props: UploadInputProps) {\n const {\n AfterInput,\n allowCreate,\n api,\n BeforeInput,\n className,\n Description,\n description,\n displayPreview,\n Error,\n filterOptions: filterOptionsFromProps,\n hasMany,\n isSortable,\n Label,\n label,\n localized,\n maxRows,\n onChange: onChangeFromProps,\n path,\n readOnly,\n relationTo,\n required,\n serverURL,\n showError,\n style,\n value,\n } = props\n\n const [populatedDocs, setPopulatedDocs] = React.useState<\n {\n relationTo: string\n value: JsonObject\n }[]\n >()\n\n const [activeRelationTo] = React.useState<string>(\n Array.isArray(relationTo) ? relationTo[0] : relationTo,\n )\n\n const { openModal } = useModal()\n const {\n modalSlug: drawerSlug,\n setCollectionSlug,\n setInitialFiles,\n setMaxFiles,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n const { permissions } = useAuth()\n const { code } = useLocale()\n const { i18n, t } = useTranslation()\n\n // This will be used by the bulk upload to allow you to select only collections you have create permissions for\n const collectionSlugsWithCreatePermission = useMemo(() => {\n if (Array.isArray(relationTo)) {\n return relationTo.filter(\n (relation) => permissions?.collections && permissions.collections?.[relation]?.create,\n )\n }\n return []\n }, [relationTo, permissions])\n\n const filterOptions: FilterOptionsResult = useMemo(() => {\n const isPoly = Array.isArray(relationTo)\n\n if (!value) {\n return filterOptionsFromProps\n }\n\n // Group existing IDs by relation\n const existingIdsByRelation: Record<string, (number | string)[]> = {}\n\n const values = Array.isArray(value) ? value : [value]\n\n for (const val of values) {\n if (isPoly && typeof val === 'object' && 'relationTo' in val) {\n // Poly upload - group by relationTo\n if (!existingIdsByRelation[val.relationTo]) {\n existingIdsByRelation[val.relationTo] = []\n }\n existingIdsByRelation[val.relationTo].push(val.value)\n } else if (!isPoly) {\n // Non-poly upload - all IDs belong to the single collection\n const collection = relationTo\n if (!existingIdsByRelation[collection]) {\n existingIdsByRelation[collection] = []\n }\n const id = typeof val === 'object' && 'value' in val ? val.value : val\n if (typeof id === 'string' || typeof id === 'number') {\n existingIdsByRelation[collection].push(id)\n }\n }\n }\n\n // Build filter options for each collection\n const newFilterOptions = { ...filterOptionsFromProps }\n const relations = isPoly ? relationTo : [relationTo]\n\n relations.forEach((relation) => {\n const existingIds = existingIdsByRelation[relation] || []\n\n newFilterOptions[relation] = {\n ...((filterOptionsFromProps?.[relation] as any) || {}),\n id: {\n ...((filterOptionsFromProps?.[relation] as any)?.id || {}),\n not_in: ((filterOptionsFromProps?.[relation] as any)?.id?.not_in || []).concat(\n existingIds,\n ),\n },\n }\n })\n\n return newFilterOptions\n }, [value, filterOptionsFromProps, relationTo])\n\n const [ListDrawer, , { closeDrawer: closeListDrawer, openDrawer: openListDrawer }] =\n useListDrawer({\n collectionSlugs: typeof relationTo === 'string' ? [relationTo] : relationTo,\n filterOptions,\n })\n\n const [\n CreateDocDrawer,\n ,\n { closeDrawer: closeCreateDocDrawer, openDrawer: openCreateDocDrawer },\n ] = useDocumentDrawer({\n collectionSlug: activeRelationTo,\n })\n\n /**\n * Track the last loaded value to prevent unnecessary reloads\n */\n const loadedValueRef = React.useRef<\n (number | string)[] | null | number | string | ValueWithRelation | ValueWithRelation[]\n >(null)\n\n const canCreate = useMemo(() => {\n if (!allowCreate) {\n return false\n }\n\n if (typeof activeRelationTo === 'string') {\n if (permissions?.collections && permissions.collections?.[activeRelationTo]?.create) {\n return true\n }\n }\n\n return false\n }, [activeRelationTo, permissions, allowCreate])\n\n const onChange = React.useCallback(\n (newValue) => {\n if (typeof onChangeFromProps === 'function') {\n onChangeFromProps(newValue)\n }\n },\n [onChangeFromProps],\n )\n\n const populateDocs = React.useCallback(\n async (items: ValueWithRelation[]): Promise<ValueAsDataWithRelation[]> => {\n if (!items?.length) {\n return []\n }\n\n // 1. Group IDs by collection\n const grouped: Record<string, (number | string)[]> = {}\n items.forEach(({ relationTo, value }) => {\n if (!grouped[relationTo]) {\n grouped[relationTo] = []\n }\n // Ensure we extract the actual ID value, not an object\n let idValue: number | string = value\n\n if (value && typeof value === 'object' && 'value' in (value as any)) {\n idValue = (value as any).value\n }\n\n grouped[relationTo].push(idValue)\n })\n\n // 2. Fetch per collection\n const fetches = Object.entries(grouped).map(async ([collection, ids]) => {\n const query = {\n depth: 0,\n draft: true,\n limit: ids.length,\n locale: code,\n where: {\n and: [\n {\n id: {\n in: ids,\n },\n },\n ],\n },\n }\n const response = await fetch(\n formatAdminURL({\n apiRoute: api,\n path: `/${collection}`,\n }),\n {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-Payload-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n },\n )\n let docs: any[] = []\n if (response.ok) {\n const data = await response.json()\n docs = data.docs\n }\n // Map docs by ID for fast lookup\n const docsById = docs.reduce((acc, doc) => {\n acc[doc.id] = doc\n return acc\n }, {})\n return { collection, docsById }\n })\n\n const results = await Promise.all(fetches)\n\n // 3. Build lookup\n const lookup: Record<string, Record<string, any>> = {}\n results.forEach(({ collection, docsById }) => {\n lookup[collection] = docsById\n })\n\n // 4. Reconstruct in input order, add placeholders if missing\n const sortedDocs = items.map(({ relationTo, value }) => {\n const doc = lookup[relationTo]?.[value] || {\n id: value,\n filename: `${t('general:untitled')} - ID: ${value}`,\n isPlaceholder: true,\n }\n return { relationTo, value: doc }\n })\n\n return sortedDocs\n },\n [api, code, i18n.language, t],\n )\n\n const normalizeValue = useCallback(\n (value: any): any => normalizeRelationshipValue(value, relationTo),\n [relationTo],\n )\n\n const onUploadSuccess: BulkUploadContext['onSuccess'] = useCallback(\n (uploadedForms) => {\n const isPoly = Array.isArray(relationTo)\n\n if (hasMany) {\n const newValues = uploadedForms.map((form) =>\n isPoly ? { relationTo: form.collectionSlug, value: form.doc.id } : form.doc.id,\n )\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n const mergedValue = [...normalizedExisting, ...newValues]\n onChange(mergedValue)\n setPopulatedDocs((currentDocs) => [\n ...(currentDocs || []),\n ...uploadedForms.map((form) => ({\n relationTo: form.collectionSlug,\n value: form.doc,\n })),\n ])\n } else {\n const firstDoc = uploadedForms[0]\n const newValue = isPoly\n ? { relationTo: firstDoc.collectionSlug, value: firstDoc.doc.id }\n : firstDoc.doc.id\n onChange(newValue)\n setPopulatedDocs([\n {\n relationTo: firstDoc.collectionSlug,\n value: firstDoc.doc,\n },\n ])\n }\n },\n [value, onChange, hasMany, relationTo, normalizeValue],\n )\n\n const onLocalFileSelection = React.useCallback(\n (fileList?: FileList) => {\n let fileListToUse = fileList\n if (!hasMany && fileList && fileList.length > 1) {\n const dataTransfer = new DataTransfer()\n dataTransfer.items.add(fileList[0])\n fileListToUse = dataTransfer.files\n }\n if (fileListToUse) {\n setInitialFiles(fileListToUse)\n }\n // Use activeRelationTo for poly uploads, or relationTo as string for single collection\n const collectionToUse = Array.isArray(relationTo) ? activeRelationTo : relationTo\n\n setCollectionSlug(collectionToUse)\n if (Array.isArray(collectionSlugsWithCreatePermission)) {\n setSelectableCollections(collectionSlugsWithCreatePermission)\n }\n\n if (typeof maxRows === 'number') {\n setMaxFiles(maxRows)\n }\n\n openModal(drawerSlug)\n },\n [\n hasMany,\n relationTo,\n activeRelationTo,\n setCollectionSlug,\n collectionSlugsWithCreatePermission,\n maxRows,\n openModal,\n drawerSlug,\n setInitialFiles,\n setSelectableCollections,\n setMaxFiles,\n ],\n )\n\n const handlePasteFromClipboard = useCallback(async () => {\n try {\n const files = await getFilesFromClipboard()\n if (!files) {\n toast.error(t('error:noFileFoundInClipboard'))\n return\n }\n onLocalFileSelection(files)\n } catch (_err) {\n toast.error(t('error:unableToReadClipboard'))\n }\n }, [onLocalFileSelection, t])\n\n // only hasMany can bulk select\n const onListBulkSelect = React.useCallback<NonNullable<ListDrawerProps['onBulkSelect']>>(\n async (docs, collectionSlug) => {\n const isPoly = Array.isArray(relationTo)\n const relationToUse = isPoly ? collectionSlug || activeRelationTo : activeRelationTo\n const selectedDocIDs = []\n\n for (const [id, isSelected] of docs) {\n if (isSelected) {\n selectedDocIDs.push(id)\n }\n }\n\n const itemsToLoad = selectedDocIDs.map((id) => ({\n relationTo: relationToUse,\n value: id,\n }))\n\n const loadedDocs = await populateDocs(itemsToLoad)\n if (loadedDocs) {\n setPopulatedDocs((currentDocs) => [...(currentDocs || []), ...loadedDocs])\n }\n\n const newValues = selectedDocIDs.map((id) =>\n isPoly ? { relationTo: relationToUse, value: id } : id,\n )\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n onChange([...normalizedExisting, ...newValues])\n closeListDrawer()\n },\n [activeRelationTo, closeListDrawer, onChange, populateDocs, value, relationTo, normalizeValue],\n )\n\n const onDocCreate = React.useCallback(\n (data) => {\n const isPoly = Array.isArray(relationTo)\n if (data.doc) {\n setPopulatedDocs((currentDocs) => [\n ...(currentDocs || []),\n {\n relationTo: activeRelationTo,\n value: data.doc,\n },\n ])\n\n const newValue = isPoly ? { relationTo: activeRelationTo, value: data.doc.id } : data.doc.id\n onChange(newValue)\n }\n closeCreateDocDrawer()\n },\n [closeCreateDocDrawer, activeRelationTo, onChange, relationTo],\n )\n\n const onListSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n async ({ collectionSlug, doc }) => {\n const isPoly = Array.isArray(relationTo)\n\n const loadedDocs = await populateDocs([{ relationTo: collectionSlug, value: doc.id }])\n const selectedDoc = loadedDocs?.[0] || null\n\n setPopulatedDocs((currentDocs) => {\n if (selectedDoc) {\n if (hasMany) {\n return [...(currentDocs || []), selectedDoc]\n }\n return [selectedDoc]\n }\n return currentDocs\n })\n\n if (hasMany) {\n const newValue = isPoly ? { relationTo: collectionSlug, value: doc.id } : doc.id\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n const valueToUse = [...normalizedExisting, newValue]\n onChange(valueToUse)\n } else {\n const valueToUse = isPoly ? { relationTo: collectionSlug, value: doc.id } : doc.id\n onChange(valueToUse)\n }\n closeListDrawer()\n },\n [closeListDrawer, hasMany, populateDocs, onChange, value, relationTo, normalizeValue],\n )\n\n const reloadDoc = React.useCallback<ReloadDoc>(\n async (docID, collectionSlug) => {\n const docs = await populateDocs([{ relationTo: collectionSlug, value: docID }])\n\n if (docs[0]) {\n let updatedDocsToPropogate = []\n setPopulatedDocs((currentDocs) => {\n const existingDocIndex = currentDocs?.findIndex((doc) => {\n const hasExisting = doc.value?.id === docs[0].value.id || doc.value?.isPlaceholder\n return hasExisting && doc.relationTo === collectionSlug\n })\n if (existingDocIndex > -1) {\n const updatedDocs = [...currentDocs]\n updatedDocs[existingDocIndex] = docs[0]\n updatedDocsToPropogate = updatedDocs\n return updatedDocs\n }\n return currentDocs\n })\n\n if (updatedDocsToPropogate.length && hasMany) {\n onChange(updatedDocsToPropogate.map((doc) => doc.value?.id))\n }\n }\n },\n [populateDocs, onChange, hasMany],\n )\n\n // only hasMany can reorder\n const onReorder = React.useCallback(\n (newValue) => {\n const isPoly = Array.isArray(relationTo)\n const newValueToSave = newValue.map(({ relationTo: rel, value }) =>\n isPoly ? { relationTo: rel, value: value.id } : value.id,\n )\n onChange(newValueToSave)\n setPopulatedDocs(newValue)\n },\n [onChange, relationTo],\n )\n\n const onRemove = React.useCallback(\n (newValue?: PopulatedDocs) => {\n const isPoly = Array.isArray(relationTo)\n\n if (!newValue || newValue.length === 0) {\n onChange(hasMany ? [] : null)\n setPopulatedDocs(hasMany ? [] : null)\n return\n }\n\n const newValueToSave = newValue.map(({ relationTo: rel, value }) =>\n isPoly ? { relationTo: rel, value: value.id } : value.id,\n )\n\n onChange(hasMany ? newValueToSave : newValueToSave[0])\n setPopulatedDocs(newValue)\n },\n [onChange, hasMany, relationTo],\n )\n\n useEffect(() => {\n async function loadInitialDocs() {\n if (value) {\n let itemsToLoad: ValueWithRelation[] = []\n if (\n Array.isArray(relationTo) &&\n ((typeof value === 'object' && 'relationTo' in value) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'relationTo' in value[0]))\n ) {\n // For poly uploads, value should already be in the format { relationTo, value }\n const values = Array.isArray(value) ? value : [value]\n itemsToLoad = values\n .filter((v): v is ValueWithRelation => typeof v === 'object' && 'relationTo' in v)\n .map((v) => {\n // Ensure the value property is a simple ID, not nested\n let idValue: any = v.value\n while (\n idValue &&\n typeof idValue === 'object' &&\n idValue !== null &&\n 'value' in idValue\n ) {\n idValue = idValue.value\n }\n return {\n relationTo: v.relationTo,\n value: idValue as number | string,\n }\n })\n } else {\n // This check is here to satisfy TypeScript that relationTo is a string\n if (!Array.isArray(relationTo)) {\n // For single collection uploads, we need to wrap the IDs\n const ids = Array.isArray(value) ? value : [value]\n itemsToLoad = ids.map((id): ValueWithRelation => {\n // Extract the actual ID, handling nested objects\n let idValue: any = id\n while (\n idValue &&\n typeof idValue === 'object' &&\n idValue !== null &&\n 'value' in idValue\n ) {\n idValue = idValue.value\n }\n return {\n relationTo,\n value: idValue as number | string,\n }\n })\n }\n }\n\n if (itemsToLoad.length > 0) {\n const loadedDocs = await populateDocs(itemsToLoad)\n\n if (loadedDocs) {\n setPopulatedDocs(loadedDocs)\n loadedValueRef.current = value\n }\n }\n } else {\n // Clear populated docs when value is cleared\n setPopulatedDocs([])\n loadedValueRef.current = null\n }\n }\n\n // Only load if value has changed from what we last loaded\n const valueChanged = loadedValueRef.current !== value\n if (valueChanged) {\n void loadInitialDocs()\n }\n }, [populateDocs, value, relationTo])\n\n useEffect(() => {\n setOnSuccess(onUploadSuccess)\n }, [value, path, onUploadSuccess, setOnSuccess])\n\n const showDropzone =\n !value ||\n (hasMany && Array.isArray(value) && (typeof maxRows !== 'number' || value.length < maxRows)) ||\n (!hasMany && populatedDocs?.[0] && typeof populatedDocs[0].value === 'undefined')\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && 'error',\n readOnly && 'read-only',\n ]\n .filter(Boolean)\n .join(' ')}\n id={`field-${path?.replace(/\\./g, '__')}`}\n style={style}\n >\n <RenderCustomComponent\n CustomComponent={Label}\n Fallback={\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n }\n />\n {BeforeInput}\n <div className={`${fieldBaseClass}__wrap`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n <div className={`${baseClass}__dropzoneAndUpload`}>\n {hasMany && Array.isArray(value) && value.length > 0 ? (\n <>\n {populatedDocs && populatedDocs?.length > 0 ? (\n <UploadComponentHasMany\n displayPreview={displayPreview}\n fileDocs={populatedDocs}\n isSortable={isSortable && !readOnly}\n onRemove={onRemove}\n onReorder={onReorder}\n readonly={readOnly}\n reloadDoc={reloadDoc}\n serverURL={serverURL}\n showCollectionSlug={Array.isArray(relationTo)}\n />\n ) : (\n <div className={`${baseClass}__loadingRows`}>\n {value.map((id) => (\n <ShimmerEffect height=\"40px\" key={typeof id === 'object' ? id.value : id} />\n ))}\n </div>\n )}\n </>\n ) : null}\n {!hasMany && value ? (\n <>\n {populatedDocs && populatedDocs?.length > 0 && populatedDocs[0].value ? (\n <UploadComponentHasOne\n displayPreview={displayPreview}\n fileDoc={populatedDocs[0]}\n onRemove={onRemove}\n readonly={readOnly}\n reloadDoc={reloadDoc}\n serverURL={serverURL}\n showCollectionSlug={Array.isArray(relationTo)}\n />\n ) : populatedDocs && value && !populatedDocs?.[0]?.value ? (\n <>\n {t('general:untitled')} - ID: {value}\n </>\n ) : (\n <ShimmerEffect height=\"62px\" />\n )}\n </>\n ) : null}\n {showDropzone ? (\n <Dropzone\n disabled={readOnly || !canCreate}\n multipleFiles={hasMany}\n onChange={onLocalFileSelection}\n >\n <div className={`${baseClass}__dropzoneContent`}>\n <div className={`${baseClass}__dropzoneContent__buttons`}>\n {canCreate && (\n <>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__createNewToggler`}\n disabled={readOnly || !canCreate}\n onClick={() => {\n if (!readOnly) {\n if (hasMany) {\n onLocalFileSelection()\n } else {\n openCreateDocDrawer()\n }\n }\n }}\n size=\"medium\"\n >\n {t('general:createNew')}\n </Button>\n <span className={`${baseClass}__dropzoneContent__orText`}>\n {t('general:or')}\n </span>\n </>\n )}\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__listToggler`}\n disabled={readOnly}\n onClick={openListDrawer}\n size=\"medium\"\n >\n {t('fields:chooseFromExisting')}\n </Button>\n {canCreate && !readOnly && (\n <>\n <span className={`${baseClass}__dropzoneContent__orText`}>\n {t('general:or')}\n </span>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__pasteFromClipboard`}\n icon=\"clipboard\"\n onClick={handlePasteFromClipboard}\n size=\"medium\"\n tooltip={t('upload:pasteFromClipboard')}\n />\n </>\n )}\n <CreateDocDrawer onSave={onDocCreate} />\n <ListDrawer\n allowCreate={canCreate}\n enableRowSelections={hasMany}\n onBulkSelect={onListBulkSelect}\n onSelect={onListSelect}\n />\n </div>\n\n {canCreate && !readOnly && (\n <p className={`${baseClass}__dragAndDropText`}>\n {t('general:or')} {t('upload:dragAndDrop')}\n </p>\n )}\n </div>\n </Dropzone>\n ) : (\n <>\n {!readOnly &&\n !populatedDocs &&\n (!value ||\n typeof maxRows !== 'number' ||\n (Array.isArray(value) && value.length < maxRows)) ? (\n <ShimmerEffect height=\"40px\" />\n ) : null}\n </>\n )}\n </div>\n </div>\n {AfterInput}\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Input.js","names":["useModal","formatAdminURL","qs","React","useCallback","useEffect","useMemo","toast","useBulkUpload","Button","useDocumentDrawer","Dropzone","useListDrawer","RenderCustomComponent","ShimmerEffect","FieldDescription","FieldError","FieldLabel","useAuth","useLocale","useTranslation","abortAndIgnore","getFilesFromClipboard","normalizeRelationshipValue","fieldBaseClass","UploadComponentHasMany","UploadComponentHasOne","baseClass","UploadInput","props","AfterInput","allowCreate","api","BeforeInput","className","Description","description","displayPreview","Error","filterOptions","filterOptionsFromProps","hasMany","isSortable","Label","label","localized","maxRows","onChange","onChangeFromProps","path","readOnly","relationTo","required","serverURL","showError","style","value","populatedDocs","setPopulatedDocs","useState","activeRelationTo","Array","isArray","openModal","modalSlug","drawerSlug","setCollectionSlug","setInitialFiles","setMaxFiles","setOnSuccess","setSelectableCollections","permissions","code","i18n","t","collectionSlugsWithCreatePermission","filter","relation","collections","create","isPoly","existingIdsByRelation","values","val","push","collection","id","newFilterOptions","relations","forEach","existingIds","not_in","concat","ListDrawer","closeDrawer","closeListDrawer","openDrawer","openListDrawer","collectionSlugs","CreateDocDrawer","closeCreateDocDrawer","openCreateDocDrawer","collectionSlug","canCreate","newValue","populateDocs","items","options","length","grouped","idValue","fetches","Object","entries","map","ids","query","depth","draft","limit","locale","where","and","in","response","fetch","apiRoute","body","stringify","credentials","headers","language","method","signal","docs","ok","data","json","docsById","reduce","acc","doc","results","Promise","all","lookup","sortedDocs","filename","isPlaceholder","normalizeValue","onUploadSuccess","uploadedForms","newValues","form","normalizedExisting","mergedValue","currentDocs","firstDoc","onLocalFileSelection","fileList","fileListToUse","dataTransfer","DataTransfer","add","files","collectionToUse","handlePasteFromClipboard","error","_err","onListBulkSelect","relationToUse","selectedDocIDs","isSelected","itemsToLoad","loadedDocs","onDocCreate","onListSelect","selectedDoc","valueToUse","reloadDoc","docID","updatedDocsToPropogate","existingDocIndex","findIndex","hasExisting","updatedDocs","onReorder","newValueToSave","rel","onRemove","abortController","AbortController","loadInitialDocs","v","aborted","showDropzone","_jsxs","Boolean","join","replace","_jsx","CustomComponent","Fallback","_Fragment","fileDocs","readonly","showCollectionSlug","height","fileDoc","disabled","multipleFiles","buttonStyle","onClick","size","icon","tooltip","onSave","enableRowSelections","onBulkSelect","onSelect"],"sources":["../../../src/fields/Upload/Input.tsx"],"sourcesContent":["'use client'\n\nimport type {\n ClientCollectionConfig,\n FieldLabelClientProps,\n FilterOptionsResult,\n JsonObject,\n StaticDescription,\n StaticLabel,\n UploadFieldClient,\n UploadField as UploadFieldType,\n ValueWithRelation,\n} from 'payload'\nimport type { MarkOptional } from 'ts-essentials'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo } from 'react'\nimport { toast } from 'sonner'\n\nimport type { ListDrawerProps } from '../../elements/ListDrawer/types.js'\nimport type { ReloadDoc, ValueAsDataWithRelation } from './types.js'\n\nimport { type BulkUploadContext, useBulkUpload } from '../../elements/BulkUpload/index.js'\nimport { Button } from '../../elements/Button/index.js'\nimport { useDocumentDrawer } from '../../elements/DocumentDrawer/index.js'\nimport { Dropzone } from '../../elements/Dropzone/index.js'\nimport { useListDrawer } from '../../elements/ListDrawer/index.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { ShimmerEffect } from '../../elements/ShimmerEffect/index.js'\nimport { FieldDescription } from '../../fields/FieldDescription/index.js'\nimport { FieldError } from '../../fields/FieldError/index.js'\nimport { FieldLabel } from '../../fields/FieldLabel/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { abortAndIgnore } from '../../utilities/abortAndIgnore.js'\nimport { getFilesFromClipboard } from '../../utilities/getFilesFromClipboard.js'\nimport { normalizeRelationshipValue } from '../../utilities/normalizeRelationshipValue.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { UploadComponentHasMany } from './HasMany/index.js'\nimport './index.css'\nimport { UploadComponentHasOne } from './HasOne/index.js'\n\nexport const baseClass = 'upload'\n\ntype PopulatedDocs = { relationTo: string; value: JsonObject }[]\n\nexport type UploadInputProps = {\n readonly AfterInput?: React.ReactNode\n readonly allowCreate?: boolean\n /**\n * Controls the visibility of the \"Create new collection\" button\n */\n readonly api?: string\n readonly BeforeInput?: React.ReactNode\n readonly className?: string\n readonly collection?: ClientCollectionConfig\n readonly customUploadActions?: React.ReactNode[]\n readonly Description?: React.ReactNode\n readonly description?: StaticDescription\n readonly displayPreview?: boolean\n readonly Error?: React.ReactNode\n readonly filterOptions?: FilterOptionsResult\n readonly hasMany?: boolean\n readonly hideRemoveFile?: boolean\n readonly isSortable?: boolean\n readonly Label?: React.ReactNode\n readonly label?: StaticLabel\n readonly labelProps?: FieldLabelClientProps<MarkOptional<UploadFieldClient, 'type'>>\n readonly localized?: boolean\n readonly maxRows?: number\n readonly onChange?: (e) => void\n readonly path: string\n readonly readOnly?: boolean\n readonly relationTo: UploadFieldType['relationTo']\n readonly required?: boolean\n readonly serverURL?: string\n readonly showError?: boolean\n readonly style?: React.CSSProperties\n readonly value?: (number | string)[] | number | string | ValueWithRelation | ValueWithRelation[]\n}\n\nexport function UploadInput(props: UploadInputProps) {\n const {\n AfterInput,\n allowCreate,\n api,\n BeforeInput,\n className,\n Description,\n description,\n displayPreview,\n Error,\n filterOptions: filterOptionsFromProps,\n hasMany,\n isSortable,\n Label,\n label,\n localized,\n maxRows,\n onChange: onChangeFromProps,\n path,\n readOnly,\n relationTo,\n required,\n serverURL,\n showError,\n style,\n value,\n } = props\n\n const [populatedDocs, setPopulatedDocs] = React.useState<\n {\n relationTo: string\n value: JsonObject\n }[]\n >()\n\n const [activeRelationTo] = React.useState<string>(\n Array.isArray(relationTo) ? relationTo[0] : relationTo,\n )\n\n const { openModal } = useModal()\n const {\n modalSlug: drawerSlug,\n setCollectionSlug,\n setInitialFiles,\n setMaxFiles,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n const { permissions } = useAuth()\n const { code } = useLocale()\n const { i18n, t } = useTranslation()\n\n // This will be used by the bulk upload to allow you to select only collections you have create permissions for\n const collectionSlugsWithCreatePermission = useMemo(() => {\n if (Array.isArray(relationTo)) {\n return relationTo.filter(\n (relation) => permissions?.collections && permissions.collections?.[relation]?.create,\n )\n }\n return []\n }, [relationTo, permissions])\n\n const filterOptions: FilterOptionsResult = useMemo(() => {\n const isPoly = Array.isArray(relationTo)\n\n if (!value) {\n return filterOptionsFromProps\n }\n\n // Group existing IDs by relation\n const existingIdsByRelation: Record<string, (number | string)[]> = {}\n\n const values = Array.isArray(value) ? value : [value]\n\n for (const val of values) {\n if (isPoly && typeof val === 'object' && 'relationTo' in val) {\n // Poly upload - group by relationTo\n if (!existingIdsByRelation[val.relationTo]) {\n existingIdsByRelation[val.relationTo] = []\n }\n existingIdsByRelation[val.relationTo].push(val.value)\n } else if (!isPoly) {\n // Non-poly upload - all IDs belong to the single collection\n const collection = relationTo\n if (!existingIdsByRelation[collection]) {\n existingIdsByRelation[collection] = []\n }\n const id = typeof val === 'object' && 'value' in val ? val.value : val\n if (typeof id === 'string' || typeof id === 'number') {\n existingIdsByRelation[collection].push(id)\n }\n }\n }\n\n // Build filter options for each collection\n const newFilterOptions = { ...filterOptionsFromProps }\n const relations = isPoly ? relationTo : [relationTo]\n\n relations.forEach((relation) => {\n const existingIds = existingIdsByRelation[relation] || []\n\n newFilterOptions[relation] = {\n ...((filterOptionsFromProps?.[relation] as any) || {}),\n id: {\n ...((filterOptionsFromProps?.[relation] as any)?.id || {}),\n not_in: ((filterOptionsFromProps?.[relation] as any)?.id?.not_in || []).concat(\n existingIds,\n ),\n },\n }\n })\n\n return newFilterOptions\n }, [value, filterOptionsFromProps, relationTo])\n\n const [ListDrawer, , { closeDrawer: closeListDrawer, openDrawer: openListDrawer }] =\n useListDrawer({\n collectionSlugs: typeof relationTo === 'string' ? [relationTo] : relationTo,\n filterOptions,\n })\n\n const [\n CreateDocDrawer,\n ,\n { closeDrawer: closeCreateDocDrawer, openDrawer: openCreateDocDrawer },\n ] = useDocumentDrawer({\n collectionSlug: activeRelationTo,\n })\n\n const canCreate = useMemo(() => {\n if (!allowCreate) {\n return false\n }\n\n if (typeof activeRelationTo === 'string') {\n if (permissions?.collections && permissions.collections?.[activeRelationTo]?.create) {\n return true\n }\n }\n\n return false\n }, [activeRelationTo, permissions, allowCreate])\n\n const onChange = React.useCallback(\n (newValue) => {\n if (typeof onChangeFromProps === 'function') {\n onChangeFromProps(newValue)\n }\n },\n [onChangeFromProps],\n )\n\n const populateDocs = React.useCallback(\n async (\n items: ValueWithRelation[],\n options?: {\n signal?: AbortSignal\n },\n ): Promise<ValueAsDataWithRelation[]> => {\n if (!items?.length) {\n return []\n }\n\n // 1. Group IDs by collection\n const grouped: Record<string, (number | string)[]> = {}\n items.forEach(({ relationTo, value }) => {\n if (!grouped[relationTo]) {\n grouped[relationTo] = []\n }\n // Ensure we extract the actual ID value, not an object\n let idValue: number | string = value\n\n if (value && typeof value === 'object' && 'value' in (value as any)) {\n idValue = (value as any).value\n }\n\n grouped[relationTo].push(idValue)\n })\n\n // 2. Fetch per collection\n const fetches = Object.entries(grouped).map(async ([collection, ids]) => {\n const query = {\n depth: 0,\n draft: true,\n limit: ids.length,\n locale: code,\n where: {\n and: [\n {\n id: {\n in: ids,\n },\n },\n ],\n },\n }\n const response = await fetch(\n formatAdminURL({\n apiRoute: api,\n path: `/${collection}`,\n }),\n {\n body: qs.stringify(query),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'X-Payload-HTTP-Method-Override': 'GET',\n },\n method: 'POST',\n signal: options?.signal,\n },\n )\n let docs: any[] = []\n if (response.ok) {\n const data = await response.json()\n docs = data.docs\n }\n // Map docs by ID for fast lookup\n const docsById = docs.reduce((acc, doc) => {\n acc[doc.id] = doc\n return acc\n }, {})\n return { collection, docsById }\n })\n\n const results = await Promise.all(fetches)\n\n // 3. Build lookup\n const lookup: Record<string, Record<string, any>> = {}\n results.forEach(({ collection, docsById }) => {\n lookup[collection] = docsById\n })\n\n // 4. Reconstruct in input order, add placeholders if missing\n const sortedDocs = items.map(({ relationTo, value }) => {\n const doc = lookup[relationTo]?.[value] || {\n id: value,\n filename: `${t('general:untitled')} - ID: ${value}`,\n isPlaceholder: true,\n }\n return { relationTo, value: doc }\n })\n\n return sortedDocs\n },\n [api, code, i18n.language, t],\n )\n\n const normalizeValue = useCallback(\n (value: any): any => normalizeRelationshipValue(value, relationTo),\n [relationTo],\n )\n\n const onUploadSuccess: BulkUploadContext['onSuccess'] = useCallback(\n (uploadedForms) => {\n const isPoly = Array.isArray(relationTo)\n\n if (hasMany) {\n const newValues = uploadedForms.map((form) =>\n isPoly ? { relationTo: form.collectionSlug, value: form.doc.id } : form.doc.id,\n )\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n const mergedValue = [...normalizedExisting, ...newValues]\n onChange(mergedValue)\n setPopulatedDocs((currentDocs) => [\n ...(currentDocs || []),\n ...uploadedForms.map((form) => ({\n relationTo: form.collectionSlug,\n value: form.doc,\n })),\n ])\n } else {\n const firstDoc = uploadedForms[0]\n const newValue = isPoly\n ? { relationTo: firstDoc.collectionSlug, value: firstDoc.doc.id }\n : firstDoc.doc.id\n onChange(newValue)\n setPopulatedDocs([\n {\n relationTo: firstDoc.collectionSlug,\n value: firstDoc.doc,\n },\n ])\n }\n },\n [value, onChange, hasMany, relationTo, normalizeValue],\n )\n\n const onLocalFileSelection = React.useCallback(\n (fileList?: FileList) => {\n let fileListToUse = fileList\n if (!hasMany && fileList && fileList.length > 1) {\n const dataTransfer = new DataTransfer()\n dataTransfer.items.add(fileList[0])\n fileListToUse = dataTransfer.files\n }\n if (fileListToUse) {\n setInitialFiles(fileListToUse)\n }\n // Use activeRelationTo for poly uploads, or relationTo as string for single collection\n const collectionToUse = Array.isArray(relationTo) ? activeRelationTo : relationTo\n\n setCollectionSlug(collectionToUse)\n if (Array.isArray(collectionSlugsWithCreatePermission)) {\n setSelectableCollections(collectionSlugsWithCreatePermission)\n }\n\n if (typeof maxRows === 'number') {\n setMaxFiles(maxRows)\n }\n\n openModal(drawerSlug)\n },\n [\n hasMany,\n relationTo,\n activeRelationTo,\n setCollectionSlug,\n collectionSlugsWithCreatePermission,\n maxRows,\n openModal,\n drawerSlug,\n setInitialFiles,\n setSelectableCollections,\n setMaxFiles,\n ],\n )\n\n const handlePasteFromClipboard = useCallback(async () => {\n try {\n const files = await getFilesFromClipboard()\n if (!files) {\n toast.error(t('error:noFileFoundInClipboard'))\n return\n }\n onLocalFileSelection(files)\n } catch (_err) {\n toast.error(t('error:unableToReadClipboard'))\n }\n }, [onLocalFileSelection, t])\n\n // only hasMany can bulk select\n const onListBulkSelect = React.useCallback<NonNullable<ListDrawerProps['onBulkSelect']>>(\n async (docs, collectionSlug) => {\n const isPoly = Array.isArray(relationTo)\n const relationToUse = isPoly ? collectionSlug || activeRelationTo : activeRelationTo\n const selectedDocIDs = []\n\n for (const [id, isSelected] of docs) {\n if (isSelected) {\n selectedDocIDs.push(id)\n }\n }\n\n const itemsToLoad = selectedDocIDs.map((id) => ({\n relationTo: relationToUse,\n value: id,\n }))\n\n const loadedDocs = await populateDocs(itemsToLoad)\n if (loadedDocs) {\n setPopulatedDocs((currentDocs) => [...(currentDocs || []), ...loadedDocs])\n }\n\n const newValues = selectedDocIDs.map((id) =>\n isPoly ? { relationTo: relationToUse, value: id } : id,\n )\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n onChange([...normalizedExisting, ...newValues])\n closeListDrawer()\n },\n [activeRelationTo, closeListDrawer, onChange, populateDocs, value, relationTo, normalizeValue],\n )\n\n const onDocCreate = React.useCallback(\n (data) => {\n const isPoly = Array.isArray(relationTo)\n if (data.doc) {\n setPopulatedDocs((currentDocs) => [\n ...(currentDocs || []),\n {\n relationTo: activeRelationTo,\n value: data.doc,\n },\n ])\n\n const newValue = isPoly ? { relationTo: activeRelationTo, value: data.doc.id } : data.doc.id\n onChange(newValue)\n }\n closeCreateDocDrawer()\n },\n [closeCreateDocDrawer, activeRelationTo, onChange, relationTo],\n )\n\n const onListSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n async ({ collectionSlug, doc }) => {\n const isPoly = Array.isArray(relationTo)\n\n const loadedDocs = await populateDocs([{ relationTo: collectionSlug, value: doc.id }])\n const selectedDoc = loadedDocs?.[0] || null\n\n setPopulatedDocs((currentDocs) => {\n if (selectedDoc) {\n if (hasMany) {\n return [...(currentDocs || []), selectedDoc]\n }\n return [selectedDoc]\n }\n return currentDocs\n })\n\n if (hasMany) {\n const newValue = isPoly ? { relationTo: collectionSlug, value: doc.id } : doc.id\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n const valueToUse = [...normalizedExisting, newValue]\n onChange(valueToUse)\n } else {\n const valueToUse = isPoly ? { relationTo: collectionSlug, value: doc.id } : doc.id\n onChange(valueToUse)\n }\n closeListDrawer()\n },\n [closeListDrawer, hasMany, populateDocs, onChange, value, relationTo, normalizeValue],\n )\n\n const reloadDoc = React.useCallback<ReloadDoc>(\n async (docID, collectionSlug) => {\n const docs = await populateDocs([{ relationTo: collectionSlug, value: docID }])\n\n if (docs[0]) {\n let updatedDocsToPropogate = []\n setPopulatedDocs((currentDocs) => {\n const existingDocIndex = currentDocs?.findIndex((doc) => {\n const hasExisting = doc.value?.id === docs[0].value.id || doc.value?.isPlaceholder\n return hasExisting && doc.relationTo === collectionSlug\n })\n if (existingDocIndex > -1) {\n const updatedDocs = [...currentDocs]\n updatedDocs[existingDocIndex] = docs[0]\n updatedDocsToPropogate = updatedDocs\n return updatedDocs\n }\n return currentDocs\n })\n\n if (updatedDocsToPropogate.length && hasMany) {\n onChange(updatedDocsToPropogate.map((doc) => doc.value?.id))\n }\n }\n },\n [populateDocs, onChange, hasMany],\n )\n\n // only hasMany can reorder\n const onReorder = React.useCallback(\n (newValue) => {\n const isPoly = Array.isArray(relationTo)\n const newValueToSave = newValue.map(({ relationTo: rel, value }) =>\n isPoly ? { relationTo: rel, value: value.id } : value.id,\n )\n onChange(newValueToSave)\n setPopulatedDocs(newValue)\n },\n [onChange, relationTo],\n )\n\n const onRemove = React.useCallback(\n (newValue?: PopulatedDocs) => {\n const isPoly = Array.isArray(relationTo)\n\n if (!newValue || newValue.length === 0) {\n onChange(hasMany ? [] : null)\n setPopulatedDocs(hasMany ? [] : null)\n return\n }\n\n const newValueToSave = newValue.map(({ relationTo: rel, value }) =>\n isPoly ? { relationTo: rel, value: value.id } : value.id,\n )\n\n onChange(hasMany ? newValueToSave : newValueToSave[0])\n setPopulatedDocs(newValue)\n },\n [onChange, hasMany, relationTo],\n )\n\n useEffect(() => {\n const abortController = new AbortController()\n\n async function loadInitialDocs() {\n if (value) {\n let itemsToLoad: ValueWithRelation[] = []\n if (\n Array.isArray(relationTo) &&\n ((typeof value === 'object' && 'relationTo' in value) ||\n (Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n 'relationTo' in value[0]))\n ) {\n // For poly uploads, value should already be in the format { relationTo, value }\n const values = Array.isArray(value) ? value : [value]\n itemsToLoad = values\n .filter((v): v is ValueWithRelation => typeof v === 'object' && 'relationTo' in v)\n .map((v) => {\n // Ensure the value property is a simple ID, not nested\n let idValue: any = v.value\n while (\n idValue &&\n typeof idValue === 'object' &&\n idValue !== null &&\n 'value' in idValue\n ) {\n idValue = idValue.value\n }\n return {\n relationTo: v.relationTo,\n value: idValue as number | string,\n }\n })\n } else {\n // This check is here to satisfy TypeScript that relationTo is a string\n if (!Array.isArray(relationTo)) {\n // For single collection uploads, we need to wrap the IDs\n const ids = Array.isArray(value) ? value : [value]\n itemsToLoad = ids.map((id): ValueWithRelation => {\n // Extract the actual ID, handling nested objects\n let idValue: any = id\n while (\n idValue &&\n typeof idValue === 'object' &&\n idValue !== null &&\n 'value' in idValue\n ) {\n idValue = idValue.value\n }\n return {\n relationTo,\n value: idValue as number | string,\n }\n })\n }\n }\n\n if (itemsToLoad.length > 0) {\n try {\n const loadedDocs = await populateDocs(itemsToLoad, {\n signal: abortController.signal,\n })\n\n if (loadedDocs && !abortController.signal.aborted) {\n setPopulatedDocs(loadedDocs)\n }\n } catch (_err) {\n // Ignore aborted requests from superseded values / unmount\n }\n }\n } else {\n // Clear populated docs when value is cleared\n setPopulatedDocs([])\n }\n }\n\n void loadInitialDocs()\n\n return () => {\n abortAndIgnore(abortController)\n }\n }, [populateDocs, value, relationTo])\n\n useEffect(() => {\n setOnSuccess(onUploadSuccess)\n }, [value, path, onUploadSuccess, setOnSuccess])\n\n const showDropzone =\n !value ||\n (hasMany && Array.isArray(value) && (typeof maxRows !== 'number' || value.length < maxRows)) ||\n (!hasMany && populatedDocs?.[0] && typeof populatedDocs[0].value === 'undefined')\n\n return (\n <div\n className={[\n fieldBaseClass,\n baseClass,\n className,\n showError && 'error',\n readOnly && 'read-only',\n ]\n .filter(Boolean)\n .join(' ')}\n id={`field-${path?.replace(/\\./g, '__')}`}\n style={style}\n >\n <RenderCustomComponent\n CustomComponent={Label}\n Fallback={\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n }\n />\n {BeforeInput}\n <div className={`${fieldBaseClass}__wrap`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n <div className={`${baseClass}__dropzoneAndUpload`}>\n {hasMany && Array.isArray(value) && value.length > 0 ? (\n <>\n {populatedDocs && populatedDocs?.length > 0 ? (\n <UploadComponentHasMany\n displayPreview={displayPreview}\n fileDocs={populatedDocs}\n isSortable={isSortable && !readOnly}\n onRemove={onRemove}\n onReorder={onReorder}\n readonly={readOnly}\n reloadDoc={reloadDoc}\n serverURL={serverURL}\n showCollectionSlug={Array.isArray(relationTo)}\n />\n ) : (\n <div className={`${baseClass}__loadingRows`}>\n {value.map((id) => (\n <ShimmerEffect height=\"40px\" key={typeof id === 'object' ? id.value : id} />\n ))}\n </div>\n )}\n </>\n ) : null}\n {!hasMany && value ? (\n <>\n {populatedDocs && populatedDocs?.length > 0 && populatedDocs[0].value ? (\n <UploadComponentHasOne\n displayPreview={displayPreview}\n fileDoc={populatedDocs[0]}\n onRemove={onRemove}\n readonly={readOnly}\n reloadDoc={reloadDoc}\n serverURL={serverURL}\n showCollectionSlug={Array.isArray(relationTo)}\n />\n ) : populatedDocs && value && !populatedDocs?.[0]?.value ? (\n <>\n {t('general:untitled')} - ID: {value}\n </>\n ) : (\n <ShimmerEffect height=\"62px\" />\n )}\n </>\n ) : null}\n {showDropzone ? (\n <Dropzone\n disabled={readOnly || !canCreate}\n multipleFiles={hasMany}\n onChange={onLocalFileSelection}\n >\n <div className={`${baseClass}__dropzoneContent`}>\n <div className={`${baseClass}__dropzoneContent__buttons`}>\n {canCreate && (\n <>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__createNewToggler`}\n disabled={readOnly || !canCreate}\n onClick={() => {\n if (!readOnly) {\n if (hasMany) {\n onLocalFileSelection()\n } else {\n openCreateDocDrawer()\n }\n }\n }}\n size=\"medium\"\n >\n {t('general:createNew')}\n </Button>\n <span className={`${baseClass}__dropzoneContent__orText`}>\n {t('general:or')}\n </span>\n </>\n )}\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__listToggler`}\n disabled={readOnly}\n onClick={openListDrawer}\n size=\"medium\"\n >\n {t('fields:chooseFromExisting')}\n </Button>\n {canCreate && !readOnly && (\n <>\n <span className={`${baseClass}__dropzoneContent__orText`}>\n {t('general:or')}\n </span>\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__pasteFromClipboard`}\n icon=\"clipboard\"\n onClick={handlePasteFromClipboard}\n size=\"medium\"\n tooltip={t('upload:pasteFromClipboard')}\n />\n </>\n )}\n <CreateDocDrawer onSave={onDocCreate} />\n <ListDrawer\n allowCreate={canCreate}\n enableRowSelections={hasMany}\n onBulkSelect={onListBulkSelect}\n onSelect={onListSelect}\n />\n </div>\n\n {canCreate && !readOnly && (\n <p className={`${baseClass}__dragAndDropText`}>\n {t('general:or')} {t('upload:dragAndDrop')}\n </p>\n )}\n </div>\n </Dropzone>\n ) : (\n <>\n {!readOnly &&\n !populatedDocs &&\n (!value ||\n typeof maxRows !== 'number' ||\n (Array.isArray(value) && value.length < maxRows)) ? (\n <ShimmerEffect height=\"40px\" />\n ) : null}\n </>\n )}\n </div>\n </div>\n {AfterInput}\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={<FieldDescription description={description} path={path} />}\n />\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import React, { act } from 'react';
|
|
3
|
+
import { createRoot } from 'react-dom/client';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { UploadInput } from './Input.js';
|
|
6
|
+
vi.mock('@faceless-ui/modal', () => ({
|
|
7
|
+
useModal: () => ({
|
|
8
|
+
openModal: vi.fn()
|
|
9
|
+
})
|
|
10
|
+
}));
|
|
11
|
+
vi.mock('../../elements/BulkUpload/index.js', () => ({
|
|
12
|
+
useBulkUpload: () => ({
|
|
13
|
+
modalSlug: 'bulk-upload',
|
|
14
|
+
setCollectionSlug: vi.fn(),
|
|
15
|
+
setInitialFiles: vi.fn(),
|
|
16
|
+
setMaxFiles: vi.fn(),
|
|
17
|
+
setOnSuccess: vi.fn(),
|
|
18
|
+
setSelectableCollections: vi.fn()
|
|
19
|
+
})
|
|
20
|
+
}));
|
|
21
|
+
vi.mock('../../elements/DocumentDrawer/index.js', () => ({
|
|
22
|
+
useDocumentDrawer: () => [() => null, () => null, {
|
|
23
|
+
closeDrawer: vi.fn(),
|
|
24
|
+
openDrawer: vi.fn()
|
|
25
|
+
}]
|
|
26
|
+
}));
|
|
27
|
+
vi.mock('../../elements/ListDrawer/index.js', () => ({
|
|
28
|
+
useListDrawer: () => [() => null, () => null, {
|
|
29
|
+
closeDrawer: vi.fn(),
|
|
30
|
+
openDrawer: vi.fn()
|
|
31
|
+
}]
|
|
32
|
+
}));
|
|
33
|
+
vi.mock('../../providers/Auth/index.js', () => ({
|
|
34
|
+
useAuth: () => ({
|
|
35
|
+
permissions: {}
|
|
36
|
+
})
|
|
37
|
+
}));
|
|
38
|
+
vi.mock('../../providers/Locale/index.js', () => ({
|
|
39
|
+
useLocale: () => ({
|
|
40
|
+
code: 'en'
|
|
41
|
+
})
|
|
42
|
+
}));
|
|
43
|
+
vi.mock('../../providers/Translation/index.js', () => ({
|
|
44
|
+
useTranslation: () => ({
|
|
45
|
+
i18n: {
|
|
46
|
+
language: 'en'
|
|
47
|
+
},
|
|
48
|
+
t: key => key
|
|
49
|
+
})
|
|
50
|
+
}));
|
|
51
|
+
vi.mock('./HasMany/index.js', () => ({
|
|
52
|
+
UploadComponentHasMany: props => React.createElement('div', {
|
|
53
|
+
'data-testid': 'has-many'
|
|
54
|
+
}, JSON.stringify(props.fileDocs))
|
|
55
|
+
}));
|
|
56
|
+
vi.mock('./HasOne/index.js', () => ({
|
|
57
|
+
UploadComponentHasOne: () => null
|
|
58
|
+
}));
|
|
59
|
+
const rootCleanups = [];
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
62
|
+
});
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
for (const cleanup of rootCleanups.splice(0)) {
|
|
65
|
+
cleanup();
|
|
66
|
+
}
|
|
67
|
+
vi.unstubAllGlobals();
|
|
68
|
+
});
|
|
69
|
+
describe('UploadInput populateDocs race', () => {
|
|
70
|
+
it('aborts an in-flight populateDocs() request when value changes', async () => {
|
|
71
|
+
let oldRequest;
|
|
72
|
+
let newRequest;
|
|
73
|
+
const fetchMock = fetch;
|
|
74
|
+
fetchMock.mockImplementation((_url, options) => {
|
|
75
|
+
const deferred = createDeferred();
|
|
76
|
+
if (options.signal) {
|
|
77
|
+
if (options.signal.aborted) {
|
|
78
|
+
return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'));
|
|
79
|
+
}
|
|
80
|
+
options.signal.addEventListener('abort', () => {
|
|
81
|
+
deferred.reject(new DOMException('The operation was aborted.', 'AbortError'));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (options.body.includes('old-id')) {
|
|
85
|
+
oldRequest = deferred;
|
|
86
|
+
} else {
|
|
87
|
+
newRequest = deferred;
|
|
88
|
+
}
|
|
89
|
+
return deferred.promise;
|
|
90
|
+
});
|
|
91
|
+
const {
|
|
92
|
+
container,
|
|
93
|
+
rerender
|
|
94
|
+
} = renderUploadInput({
|
|
95
|
+
value: ['old-id']
|
|
96
|
+
});
|
|
97
|
+
// First render fires populateDocs() for the older value; do not resolve it yet.
|
|
98
|
+
await act(async () => {
|
|
99
|
+
await Promise.resolve();
|
|
100
|
+
});
|
|
101
|
+
expect(oldRequest).toBeDefined();
|
|
102
|
+
// A newer value supersedes it before the older request resolves.
|
|
103
|
+
rerender({
|
|
104
|
+
value: ['new-id']
|
|
105
|
+
});
|
|
106
|
+
await act(async () => {
|
|
107
|
+
await Promise.resolve();
|
|
108
|
+
});
|
|
109
|
+
expect(newRequest).toBeDefined();
|
|
110
|
+
await expect(oldRequest.promise).rejects.toMatchObject({
|
|
111
|
+
name: 'AbortError'
|
|
112
|
+
});
|
|
113
|
+
// The newer request resolves and is applied.
|
|
114
|
+
await act(async () => {
|
|
115
|
+
newRequest.resolve(jsonResponse([{
|
|
116
|
+
id: 'new-id',
|
|
117
|
+
filename: 'new.jpg'
|
|
118
|
+
}]));
|
|
119
|
+
await Promise.resolve();
|
|
120
|
+
await Promise.resolve();
|
|
121
|
+
});
|
|
122
|
+
expect(container.querySelector('[data-testid="has-many"]')?.textContent).toContain('new-id');
|
|
123
|
+
expect(container.querySelector('[data-testid="has-many"]')?.textContent).not.toContain('old-id');
|
|
124
|
+
});
|
|
125
|
+
it('applies the result normally when requests resolve in order', async () => {
|
|
126
|
+
let oldRequest;
|
|
127
|
+
let newRequest;
|
|
128
|
+
const fetchMock = fetch;
|
|
129
|
+
fetchMock.mockImplementation((_url, options) => {
|
|
130
|
+
const deferred = createDeferred();
|
|
131
|
+
if (options.signal) {
|
|
132
|
+
if (options.signal.aborted) {
|
|
133
|
+
return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'));
|
|
134
|
+
}
|
|
135
|
+
options.signal.addEventListener('abort', () => {
|
|
136
|
+
deferred.reject(new DOMException('The operation was aborted.', 'AbortError'));
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
if (options.body.includes('old-id')) {
|
|
140
|
+
oldRequest = deferred;
|
|
141
|
+
} else {
|
|
142
|
+
newRequest = deferred;
|
|
143
|
+
}
|
|
144
|
+
return deferred.promise;
|
|
145
|
+
});
|
|
146
|
+
const {
|
|
147
|
+
container,
|
|
148
|
+
rerender
|
|
149
|
+
} = renderUploadInput({
|
|
150
|
+
value: ['old-id']
|
|
151
|
+
});
|
|
152
|
+
await act(async () => {
|
|
153
|
+
await Promise.resolve();
|
|
154
|
+
});
|
|
155
|
+
await act(async () => {
|
|
156
|
+
oldRequest.resolve(jsonResponse([{
|
|
157
|
+
id: 'old-id',
|
|
158
|
+
filename: 'old.jpg'
|
|
159
|
+
}]));
|
|
160
|
+
await Promise.resolve();
|
|
161
|
+
await Promise.resolve();
|
|
162
|
+
});
|
|
163
|
+
expect(container.querySelector('[data-testid="has-many"]')?.textContent).toContain('old-id');
|
|
164
|
+
rerender({
|
|
165
|
+
value: ['new-id']
|
|
166
|
+
});
|
|
167
|
+
await act(async () => {
|
|
168
|
+
await Promise.resolve();
|
|
169
|
+
});
|
|
170
|
+
await act(async () => {
|
|
171
|
+
newRequest.resolve(jsonResponse([{
|
|
172
|
+
id: 'new-id',
|
|
173
|
+
filename: 'new.jpg'
|
|
174
|
+
}]));
|
|
175
|
+
await Promise.resolve();
|
|
176
|
+
await Promise.resolve();
|
|
177
|
+
});
|
|
178
|
+
expect(container.querySelector('[data-testid="has-many"]')?.textContent).toContain('new-id');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
function renderUploadInput({
|
|
182
|
+
value
|
|
183
|
+
}) {
|
|
184
|
+
const container = document.createElement('div');
|
|
185
|
+
const root = createRoot(container);
|
|
186
|
+
const props = {
|
|
187
|
+
api: '/api',
|
|
188
|
+
hasMany: true,
|
|
189
|
+
onChange: vi.fn(),
|
|
190
|
+
path: 'upload',
|
|
191
|
+
relationTo: 'uploads',
|
|
192
|
+
serverURL: ''
|
|
193
|
+
};
|
|
194
|
+
act(() => {
|
|
195
|
+
root.render(React.createElement(UploadInput, {
|
|
196
|
+
...props,
|
|
197
|
+
value
|
|
198
|
+
}));
|
|
199
|
+
});
|
|
200
|
+
rootCleanups.push(() => {
|
|
201
|
+
act(() => {
|
|
202
|
+
root.unmount();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
container,
|
|
207
|
+
rerender: next => {
|
|
208
|
+
act(() => {
|
|
209
|
+
root.render(React.createElement(UploadInput, {
|
|
210
|
+
...props,
|
|
211
|
+
value: next.value
|
|
212
|
+
}));
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function jsonResponse(docs) {
|
|
218
|
+
return {
|
|
219
|
+
json: async () => ({
|
|
220
|
+
docs
|
|
221
|
+
}),
|
|
222
|
+
ok: true
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function createDeferred() {
|
|
226
|
+
let resolve;
|
|
227
|
+
let reject;
|
|
228
|
+
const promise = new Promise((resolvePromise, rejectPromise) => {
|
|
229
|
+
resolve = resolvePromise;
|
|
230
|
+
reject = rejectPromise;
|
|
231
|
+
});
|
|
232
|
+
if (!resolve || !reject) {
|
|
233
|
+
throw new Error('Expected deferred promise resolver.');
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
promise,
|
|
237
|
+
reject,
|
|
238
|
+
resolve
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=Input.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.spec.js","names":["React","act","createRoot","afterEach","beforeEach","describe","expect","it","vi","UploadInput","mock","useModal","openModal","fn","useBulkUpload","modalSlug","setCollectionSlug","setInitialFiles","setMaxFiles","setOnSuccess","setSelectableCollections","useDocumentDrawer","closeDrawer","openDrawer","useListDrawer","useAuth","permissions","useLocale","code","useTranslation","i18n","language","t","key","UploadComponentHasMany","props","createElement","JSON","stringify","fileDocs","UploadComponentHasOne","rootCleanups","stubGlobal","cleanup","splice","unstubAllGlobals","oldRequest","newRequest","fetchMock","fetch","mockImplementation","_url","options","deferred","createDeferred","signal","aborted","Promise","reject","DOMException","addEventListener","body","includes","promise","container","rerender","renderUploadInput","value","resolve","toBeDefined","rejects","toMatchObject","name","jsonResponse","id","filename","querySelector","textContent","toContain","not","document","root","api","hasMany","onChange","path","relationTo","serverURL","render","push","unmount","next","docs","json","ok","resolvePromise","rejectPromise","Error"],"sources":["../../../src/fields/Upload/Input.spec.ts"],"sourcesContent":["// @vitest-environment jsdom\nimport React, { act } from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { UploadInput } from './Input.js'\n\nvi.mock('@faceless-ui/modal', () => ({\n useModal: () => ({ openModal: vi.fn() }),\n}))\n\nvi.mock('../../elements/BulkUpload/index.js', () => ({\n useBulkUpload: () => ({\n modalSlug: 'bulk-upload',\n setCollectionSlug: vi.fn(),\n setInitialFiles: vi.fn(),\n setMaxFiles: vi.fn(),\n setOnSuccess: vi.fn(),\n setSelectableCollections: vi.fn(),\n }),\n}))\n\nvi.mock('../../elements/DocumentDrawer/index.js', () => ({\n useDocumentDrawer: () => [() => null, () => null, { closeDrawer: vi.fn(), openDrawer: vi.fn() }],\n}))\n\nvi.mock('../../elements/ListDrawer/index.js', () => ({\n useListDrawer: () => [() => null, () => null, { closeDrawer: vi.fn(), openDrawer: vi.fn() }],\n}))\n\nvi.mock('../../providers/Auth/index.js', () => ({\n useAuth: () => ({ permissions: {} }),\n}))\n\nvi.mock('../../providers/Locale/index.js', () => ({\n useLocale: () => ({ code: 'en' }),\n}))\n\nvi.mock('../../providers/Translation/index.js', () => ({\n useTranslation: () => ({ i18n: { language: 'en' }, t: (key: string) => key }),\n}))\n\nvi.mock('./HasMany/index.js', () => ({\n UploadComponentHasMany: (props: { fileDocs: unknown }) =>\n React.createElement('div', { 'data-testid': 'has-many' }, JSON.stringify(props.fileDocs)),\n}))\n\nvi.mock('./HasOne/index.js', () => ({\n UploadComponentHasOne: () => null,\n}))\n\nconst rootCleanups: Array<() => void> = []\n\nbeforeEach(() => {\n vi.stubGlobal('fetch', vi.fn())\n})\n\nafterEach(() => {\n for (const cleanup of rootCleanups.splice(0)) {\n cleanup()\n }\n vi.unstubAllGlobals()\n})\n\ndescribe('UploadInput populateDocs race', () => {\n it('aborts an in-flight populateDocs() request when value changes', async () => {\n let oldRequest: ReturnType<typeof createDeferred<Response>> | undefined\n let newRequest: ReturnType<typeof createDeferred<Response>> | undefined\n\n const fetchMock = fetch as unknown as ReturnType<typeof vi.fn>\n fetchMock.mockImplementation(\n (_url: string, options: { body: string; signal?: AbortSignal }) => {\n const deferred = createDeferred<Response>()\n\n if (options.signal) {\n if (options.signal.aborted) {\n return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'))\n }\n\n options.signal.addEventListener('abort', () => {\n deferred.reject(new DOMException('The operation was aborted.', 'AbortError'))\n })\n }\n\n if (options.body.includes('old-id')) {\n oldRequest = deferred\n } else {\n newRequest = deferred\n }\n\n return deferred.promise\n },\n )\n\n const { container, rerender } = renderUploadInput({ value: ['old-id'] })\n\n // First render fires populateDocs() for the older value; do not resolve it yet.\n await act(async () => {\n await Promise.resolve()\n })\n expect(oldRequest).toBeDefined()\n\n // A newer value supersedes it before the older request resolves.\n rerender({ value: ['new-id'] })\n await act(async () => {\n await Promise.resolve()\n })\n expect(newRequest).toBeDefined()\n await expect(oldRequest!.promise).rejects.toMatchObject({ name: 'AbortError' })\n\n // The newer request resolves and is applied.\n await act(async () => {\n newRequest!.resolve(jsonResponse([{ id: 'new-id', filename: 'new.jpg' }]))\n await Promise.resolve()\n await Promise.resolve()\n })\n expect(container.querySelector('[data-testid=\"has-many\"]')?.textContent).toContain('new-id')\n expect(container.querySelector('[data-testid=\"has-many\"]')?.textContent).not.toContain('old-id')\n })\n\n it('applies the result normally when requests resolve in order', async () => {\n let oldRequest: ReturnType<typeof createDeferred<Response>> | undefined\n let newRequest: ReturnType<typeof createDeferred<Response>> | undefined\n\n const fetchMock = fetch as unknown as ReturnType<typeof vi.fn>\n fetchMock.mockImplementation(\n (_url: string, options: { body: string; signal?: AbortSignal }) => {\n const deferred = createDeferred<Response>()\n\n if (options.signal) {\n if (options.signal.aborted) {\n return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'))\n }\n\n options.signal.addEventListener('abort', () => {\n deferred.reject(new DOMException('The operation was aborted.', 'AbortError'))\n })\n }\n\n if (options.body.includes('old-id')) {\n oldRequest = deferred\n } else {\n newRequest = deferred\n }\n\n return deferred.promise\n },\n )\n\n const { container, rerender } = renderUploadInput({ value: ['old-id'] })\n\n await act(async () => {\n await Promise.resolve()\n })\n\n await act(async () => {\n oldRequest!.resolve(jsonResponse([{ id: 'old-id', filename: 'old.jpg' }]))\n await Promise.resolve()\n await Promise.resolve()\n })\n expect(container.querySelector('[data-testid=\"has-many\"]')?.textContent).toContain('old-id')\n\n rerender({ value: ['new-id'] })\n await act(async () => {\n await Promise.resolve()\n })\n\n await act(async () => {\n newRequest!.resolve(jsonResponse([{ id: 'new-id', filename: 'new.jpg' }]))\n await Promise.resolve()\n await Promise.resolve()\n })\n expect(container.querySelector('[data-testid=\"has-many\"]')?.textContent).toContain('new-id')\n })\n})\n\nfunction renderUploadInput({ value }: { value: (number | string)[] }): {\n container: HTMLElement\n rerender: (next: { value: (number | string)[] }) => void\n} {\n const container = document.createElement('div')\n const root: Root = createRoot(container)\n\n const props = {\n api: '/api',\n hasMany: true,\n onChange: vi.fn(),\n path: 'upload',\n relationTo: 'uploads',\n serverURL: '',\n }\n\n act(() => {\n root.render(React.createElement(UploadInput, { ...props, value }))\n })\n\n rootCleanups.push(() => {\n act(() => {\n root.unmount()\n })\n })\n\n return {\n container,\n rerender: (next) => {\n act(() => {\n root.render(React.createElement(UploadInput, { ...props, value: next.value }))\n })\n },\n }\n}\n\nfunction jsonResponse(docs: unknown[]): Response {\n return {\n json: async () => ({ docs }),\n ok: true,\n } as unknown as Response\n}\n\nfunction createDeferred<Value>(): {\n promise: Promise<Value>\n reject: (reason?: unknown) => void\n resolve: (value: Value | PromiseLike<Value>) => void\n} {\n let resolve: ((value: Value | PromiseLike<Value>) => void) | undefined\n let reject: ((reason?: unknown) => void) | undefined\n const promise = new Promise<Value>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise\n reject = rejectPromise\n })\n\n if (!resolve || !reject) {\n throw new Error('Expected deferred promise resolver.')\n }\n\n return { promise, reject, resolve }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addFieldStatePromise.d.ts","sourceRoot":"","sources":["../../../src/forms/fieldSchemasToFormState/addFieldStatePromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,IAAI,EACJ,mBAAmB,EACnB,KAAK,EACL,cAAc,EAGd,SAAS,EACT,0BAA0B,EAC1B,cAAc,EAGd,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,UAAU,EAEX,MAAM,SAAS,CAAA;AAchB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,SAAS,CAAA;IAC3B,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,CAAA;IACpD;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAA;IACzC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,0BAA0B,CAAA;IAC7C,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,mBAAmB,CAAA;IAChC,iBAAiB,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,iBAAiB,CAAA;IAChC;;;OAGG;IACH,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,0BAA0B,CAAA;CAClC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,SAAgB,wBAAwB,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"addFieldStatePromise.d.ts","sourceRoot":"","sources":["../../../src/forms/fieldSchemasToFormState/addFieldStatePromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,IAAI,EACJ,mBAAmB,EACnB,KAAK,EACL,cAAc,EAGd,SAAS,EACT,0BAA0B,EAC1B,cAAc,EAGd,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,UAAU,EAEX,MAAM,SAAS,CAAA;AAchB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAQnD,MAAM,MAAM,wBAAwB,GAAG;IACrC,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,SAAS,CAAA;IAC3B,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,CAAA;IACpD;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAA;IACzC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,0BAA0B,CAAA;IAC7C,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,OAAO,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,mBAAmB,CAAA;IAChC,iBAAiB,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,iBAAiB,CAAA;IAChC;;;OAGG;IACH,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,EAAE,0BAA0B,CAAA;CAClC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,SAAgB,wBAAwB,KAAG,OAAO,CAAC,IAAI,CAs7BvF,CAAA"}
|