@payloadcms/ui 3.64.0-internal.deef021 → 3.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/Autosave/index.js +2 -2
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/DeleteMany/index.d.ts.map +1 -1
- package/dist/elements/DeleteMany/index.js +1 -0
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +1 -0
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.js +1 -0
- package/dist/elements/PublishMany/DrawerContent.js.map +1 -1
- package/dist/elements/RestoreMany/index.d.ts.map +1 -1
- package/dist/elements/RestoreMany/index.js +1 -0
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.js +1 -0
- package/dist/elements/UnpublishMany/DrawerContent.js.map +1 -1
- package/dist/exports/client/index.js +12 -12
- package/dist/exports/client/index.js.map +4 -4
- package/dist/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +54 -25
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +7 -3
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/providers/Auth/index.d.ts +34 -0
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Locale/index.d.ts.map +1 -1
- package/dist/providers/Locale/index.js +14 -19
- package/dist/providers/Locale/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +19 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/utilities/normalizeRelationshipValue.d.ts +29 -0
- package/dist/utilities/normalizeRelationshipValue.d.ts.map +1 -0
- package/dist/utilities/normalizeRelationshipValue.js +59 -0
- package/dist/utilities/normalizeRelationshipValue.js.map +1 -0
- package/dist/utilities/normalizeRelationshipValue.spec.js +373 -0
- package/dist/utilities/normalizeRelationshipValue.spec.js.map +1 -0
- package/dist/views/Edit/Auth/index.d.ts.map +1 -1
- package/dist/views/Edit/Auth/index.js +2 -7
- package/dist/views/Edit/Auth/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;AAIjD,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;AAIjD,OAAO,KAA0C,MAAM,OAAO,CAAA;AAsB9D,OAAO,cAAc,CAAA;AAErB,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,qBAmsBlD"}
|
|
@@ -17,6 +17,7 @@ import { FieldLabel } from '../../fields/FieldLabel/index.js';
|
|
|
17
17
|
import { useAuth } from '../../providers/Auth/index.js';
|
|
18
18
|
import { useLocale } from '../../providers/Locale/index.js';
|
|
19
19
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
20
|
+
import { normalizeRelationshipValue } from '../../utilities/normalizeRelationshipValue.js';
|
|
20
21
|
import { fieldBaseClass } from '../shared/index.js';
|
|
21
22
|
import { UploadComponentHasMany } from './HasMany/index.js';
|
|
22
23
|
import { UploadComponentHasOne } from './HasOne/index.js';
|
|
@@ -170,7 +171,12 @@ export function UploadInput(props) {
|
|
|
170
171
|
if (!grouped[relationTo_0]) {
|
|
171
172
|
grouped[relationTo_0] = [];
|
|
172
173
|
}
|
|
173
|
-
|
|
174
|
+
// Ensure we extract the actual ID value, not an object
|
|
175
|
+
let idValue = value_0;
|
|
176
|
+
if (value_0 && typeof value_0 === 'object' && 'value' in value_0) {
|
|
177
|
+
idValue = value_0.value;
|
|
178
|
+
}
|
|
179
|
+
grouped[relationTo_0].push(idValue);
|
|
174
180
|
});
|
|
175
181
|
// 2. Fetch per collection
|
|
176
182
|
const fetches = Object.entries(grouped).map(async ([collection_0, ids]) => {
|
|
@@ -238,6 +244,7 @@ export function UploadInput(props) {
|
|
|
238
244
|
});
|
|
239
245
|
return sortedDocs;
|
|
240
246
|
}, [serverURL, api, code, i18n.language, t]);
|
|
247
|
+
const normalizeValue = useCallback(value_2 => normalizeRelationshipValue(value_2, relationTo), [relationTo]);
|
|
241
248
|
const onUploadSuccess = useCallback(uploadedForms => {
|
|
242
249
|
const isPoly_0 = Array.isArray(relationTo);
|
|
243
250
|
if (hasMany) {
|
|
@@ -245,7 +252,9 @@ export function UploadInput(props) {
|
|
|
245
252
|
relationTo: form.collectionSlug,
|
|
246
253
|
value: form.doc.id
|
|
247
254
|
} : form.doc.id);
|
|
248
|
-
|
|
255
|
+
// Normalize existing values before merging
|
|
256
|
+
const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : [];
|
|
257
|
+
const mergedValue = [...normalizedExisting, ...newValues];
|
|
249
258
|
onChange(mergedValue);
|
|
250
259
|
setPopulatedDocs(currentDocs => [...(currentDocs || []), ...uploadedForms.map(form_0 => ({
|
|
251
260
|
relationTo: form_0.collectionSlug,
|
|
@@ -263,7 +272,7 @@ export function UploadInput(props) {
|
|
|
263
272
|
value: firstDoc.doc
|
|
264
273
|
}]);
|
|
265
274
|
}
|
|
266
|
-
}, [value, onChange, hasMany, relationTo]);
|
|
275
|
+
}, [value, onChange, hasMany, relationTo, normalizeValue]);
|
|
267
276
|
const onLocalFileSelection = React.useCallback(fileList => {
|
|
268
277
|
let fileListToUse = fileList;
|
|
269
278
|
if (!hasMany && fileList && fileList.length > 1) {
|
|
@@ -306,9 +315,11 @@ export function UploadInput(props) {
|
|
|
306
315
|
relationTo: activeRelationTo,
|
|
307
316
|
value: id_2
|
|
308
317
|
} : id_2);
|
|
309
|
-
|
|
318
|
+
// Normalize existing values before merging
|
|
319
|
+
const normalizedExisting_0 = Array.isArray(value) ? value.map(normalizeValue) : [];
|
|
320
|
+
onChange([...normalizedExisting_0, ...newValues_0]);
|
|
310
321
|
closeListDrawer();
|
|
311
|
-
}, [activeRelationTo, closeListDrawer, onChange, populateDocs, value, relationTo]);
|
|
322
|
+
}, [activeRelationTo, closeListDrawer, onChange, populateDocs, value, relationTo, normalizeValue]);
|
|
312
323
|
const onDocCreate = React.useCallback(data_0 => {
|
|
313
324
|
const isPoly_2 = Array.isArray(relationTo);
|
|
314
325
|
if (data_0.doc) {
|
|
@@ -343,12 +354,14 @@ export function UploadInput(props) {
|
|
|
343
354
|
}
|
|
344
355
|
return currentDocs_2;
|
|
345
356
|
});
|
|
346
|
-
const newValue_2 = isPoly_3 ? {
|
|
347
|
-
relationTo: collectionSlug,
|
|
348
|
-
value: doc_1.id
|
|
349
|
-
} : doc_1.id;
|
|
350
357
|
if (hasMany) {
|
|
351
|
-
const
|
|
358
|
+
const newValue_2 = isPoly_3 ? {
|
|
359
|
+
relationTo: collectionSlug,
|
|
360
|
+
value: doc_1.id
|
|
361
|
+
} : doc_1.id;
|
|
362
|
+
// Normalize existing values before merging
|
|
363
|
+
const normalizedExisting_1 = Array.isArray(value) ? value.map(normalizeValue) : [];
|
|
364
|
+
const valueToUse = [...normalizedExisting_1, newValue_2];
|
|
352
365
|
onChange(valueToUse);
|
|
353
366
|
} else {
|
|
354
367
|
const valueToUse_0 = isPoly_3 ? {
|
|
@@ -358,7 +371,7 @@ export function UploadInput(props) {
|
|
|
358
371
|
onChange(valueToUse_0);
|
|
359
372
|
}
|
|
360
373
|
closeListDrawer();
|
|
361
|
-
}, [closeListDrawer, hasMany, populateDocs, onChange, value, relationTo]);
|
|
374
|
+
}, [closeListDrawer, hasMany, populateDocs, onChange, value, relationTo, normalizeValue]);
|
|
362
375
|
const reloadDoc = React.useCallback(async (docID, collectionSlug_0) => {
|
|
363
376
|
const docs_1 = await populateDocs([{
|
|
364
377
|
relationTo: collectionSlug_0,
|
|
@@ -389,11 +402,11 @@ export function UploadInput(props) {
|
|
|
389
402
|
const isPoly_4 = Array.isArray(relationTo);
|
|
390
403
|
const newValueToSave = newValue_3.map(({
|
|
391
404
|
relationTo: rel,
|
|
392
|
-
value:
|
|
405
|
+
value: value_3
|
|
393
406
|
}) => isPoly_4 ? {
|
|
394
407
|
relationTo: rel,
|
|
395
|
-
value:
|
|
396
|
-
} :
|
|
408
|
+
value: value_3.id
|
|
409
|
+
} : value_3.id);
|
|
397
410
|
onChange(newValueToSave);
|
|
398
411
|
setPopulatedDocs(newValue_3);
|
|
399
412
|
}, [onChange, relationTo]);
|
|
@@ -406,40 +419,56 @@ export function UploadInput(props) {
|
|
|
406
419
|
}
|
|
407
420
|
const newValueToSave_0 = newValue_4.map(({
|
|
408
421
|
relationTo: rel_0,
|
|
409
|
-
value:
|
|
422
|
+
value: value_4
|
|
410
423
|
}) => isPoly_5 ? {
|
|
411
424
|
relationTo: rel_0,
|
|
412
|
-
value:
|
|
413
|
-
} :
|
|
425
|
+
value: value_4.id
|
|
426
|
+
} : value_4.id);
|
|
414
427
|
onChange(hasMany ? newValueToSave_0 : newValueToSave_0[0]);
|
|
415
428
|
setPopulatedDocs(newValue_4);
|
|
416
429
|
}, [onChange, hasMany, relationTo]);
|
|
417
430
|
useEffect(() => {
|
|
418
431
|
async function loadInitialDocs() {
|
|
419
432
|
if (value) {
|
|
420
|
-
let itemsToLoad_0;
|
|
433
|
+
let itemsToLoad_0 = [];
|
|
421
434
|
if (Array.isArray(relationTo) && (typeof value === 'object' && 'relationTo' in value || Array.isArray(value) && value.length > 0 && typeof value[0] === 'object' && 'relationTo' in value[0])) {
|
|
422
435
|
// For poly uploads, value should already be in the format { relationTo, value }
|
|
423
436
|
const values_0 = Array.isArray(value) ? value : [value];
|
|
424
|
-
itemsToLoad_0 = values_0.filter(v => typeof v === 'object' && 'relationTo' in v)
|
|
437
|
+
itemsToLoad_0 = values_0.filter(v => typeof v === 'object' && 'relationTo' in v).map(v_0 => {
|
|
438
|
+
// Ensure the value property is a simple ID, not nested
|
|
439
|
+
let idValue_0 = v_0.value;
|
|
440
|
+
while (idValue_0 && typeof idValue_0 === 'object' && idValue_0 !== null && 'value' in idValue_0) {
|
|
441
|
+
idValue_0 = idValue_0.value;
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
relationTo: v_0.relationTo,
|
|
445
|
+
value: idValue_0
|
|
446
|
+
};
|
|
447
|
+
});
|
|
425
448
|
} else {
|
|
426
449
|
// This check is here to satisfy TypeScript that relationTo is a string
|
|
427
450
|
if (!Array.isArray(relationTo)) {
|
|
428
451
|
// For single collection uploads, we need to wrap the IDs
|
|
429
452
|
const ids_0 = Array.isArray(value) ? value : [value];
|
|
430
453
|
itemsToLoad_0 = ids_0.map(id_3 => {
|
|
431
|
-
|
|
454
|
+
// Extract the actual ID, handling nested objects
|
|
455
|
+
let idValue_1 = id_3;
|
|
456
|
+
while (idValue_1 && typeof idValue_1 === 'object' && idValue_1 !== null && 'value' in idValue_1) {
|
|
457
|
+
idValue_1 = idValue_1.value;
|
|
458
|
+
}
|
|
432
459
|
return {
|
|
433
460
|
relationTo,
|
|
434
|
-
value:
|
|
461
|
+
value: idValue_1
|
|
435
462
|
};
|
|
436
463
|
});
|
|
437
464
|
}
|
|
438
465
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
466
|
+
if (itemsToLoad_0.length > 0) {
|
|
467
|
+
const loadedDocs_1 = await populateDocs(itemsToLoad_0);
|
|
468
|
+
if (loadedDocs_1) {
|
|
469
|
+
setPopulatedDocs(loadedDocs_1);
|
|
470
|
+
loadedValueRef.current = value;
|
|
471
|
+
}
|
|
443
472
|
}
|
|
444
473
|
} else {
|
|
445
474
|
// Clear populated docs when value is cleared
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":["useModal","qs","React","useCallback","useEffect","useMemo","useBulkUpload","Button","useDocumentDrawer","Dropzone","useListDrawer","RenderCustomComponent","ShimmerEffect","FieldDescription","FieldError","FieldLabel","useAuth","useLocale","useTranslation","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","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","fetches","Object","entries","map","ids","query","depth","draft","limit","locale","where","and","in","response","fetch","body","stringify","credentials","headers","language","method","docs","ok","data","json","docsById","reduce","acc","doc","results","Promise","all","lookup","sortedDocs","filename","isPlaceholder","onUploadSuccess","uploadedForms","newValues","form","mergedValue","currentDocs","firstDoc","onLocalFileSelection","fileList","fileListToUse","dataTransfer","DataTransfer","add","files","collectionToUse","onListBulkSelect","selectedDocIDs","isSelected","itemsToLoad","loadedDocs","onDocCreate","onListSelect","selectedDoc","valueToUse","reloadDoc","docID","updatedDocsToPropogate","existingDocIndex","findIndex","hasExisting","updatedDocs","onReorder","newValueToSave","rel","onRemove","loadInitialDocs","v","idValue","current","valueChanged","showDropzone","_jsxs","Boolean","join","replace","_jsx","CustomComponent","Fallback","_Fragment","fileDocs","readonly","showCollectionSlug","height","fileDoc","disabled","multipleFiles","buttonStyle","onClick","size","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 * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo } from 'react'\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 { fieldBaseClass } from '../shared/index.js'\nimport { UploadComponentHasMany } from './HasMany/index.js'\nimport { UploadComponentHasOne } from './HasOne/index.js'\nimport './index.scss'\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 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 grouped[relationTo].push(value)\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(`${serverURL}${api}/${collection}`, {\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 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 [serverURL, api, code, i18n.language, t],\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 const mergedValue = [...(Array.isArray(value) ? value : []), ...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],\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 // only hasMany can bulk select\n const onListBulkSelect = React.useCallback<NonNullable<ListDrawerProps['onBulkSelect']>>(\n async (docs) => {\n const isPoly = Array.isArray(relationTo)\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: activeRelationTo,\n value: id,\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: activeRelationTo, value: id } : id,\n )\n onChange([...(Array.isArray(value) ? value : []), ...newValues])\n closeListDrawer()\n },\n [activeRelationTo, closeListDrawer, onChange, populateDocs, value, relationTo],\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 const newValue = isPoly ? { relationTo: collectionSlug, value: doc.id } : doc.id\n\n if (hasMany) {\n const valueToUse = [...(Array.isArray(value) ? value : []), 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],\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.filter(\n (v): v is ValueWithRelation => typeof v === 'object' && 'relationTo' in v,\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 const idValue = typeof id === 'object' && 'value' in id ? id.value : id\n return {\n relationTo,\n value: idValue,\n }\n })\n }\n }\n\n const loadedDocs = await populateDocs(itemsToLoad)\n\n if (loadedDocs) {\n setPopulatedDocs(loadedDocs)\n loadedValueRef.current = value\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 <div className={`${baseClass}__wrap`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n </div>\n {BeforeInput}\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=\"pill\"\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=\"small\"\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=\"pill\"\n className={`${baseClass}__listToggler`}\n disabled={readOnly}\n onClick={openListDrawer}\n size=\"small\"\n >\n {t('fields:chooseFromExisting')}\n </Button>\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 {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","qs","React","useCallback","useEffect","useMemo","useBulkUpload","Button","useDocumentDrawer","Dropzone","useListDrawer","RenderCustomComponent","ShimmerEffect","FieldDescription","FieldError","FieldLabel","useAuth","useLocale","useTranslation","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","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","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","onListBulkSelect","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","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 * as qs from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo } from 'react'\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 { normalizeRelationshipValue } from '../../utilities/normalizeRelationshipValue.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { UploadComponentHasMany } from './HasMany/index.js'\nimport { UploadComponentHasOne } from './HasOne/index.js'\nimport './index.scss'\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 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(`${serverURL}${api}/${collection}`, {\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 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 [serverURL, 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 // only hasMany can bulk select\n const onListBulkSelect = React.useCallback<NonNullable<ListDrawerProps['onBulkSelect']>>(\n async (docs) => {\n const isPoly = Array.isArray(relationTo)\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: activeRelationTo,\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: activeRelationTo, 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 <div className={`${baseClass}__wrap`}>\n <RenderCustomComponent\n CustomComponent={Error}\n Fallback={<FieldError path={path} showError={showError} />}\n />\n </div>\n {BeforeInput}\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=\"pill\"\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=\"small\"\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=\"pill\"\n className={`${baseClass}__listToggler`}\n disabled={readOnly}\n onClick={openListDrawer}\n size=\"small\"\n >\n {t('fields:chooseFromExisting')}\n </Button>\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 {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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAGV,SAAS,EAIV,MAAM,YAAY,CAAA;AAoCnB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAGV,SAAS,EAIV,MAAM,YAAY,CAAA;AAoCnB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CA+xBpC,CAAA;AAED,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,CAAA"}
|
package/dist/forms/Form/index.js
CHANGED
|
@@ -331,8 +331,12 @@ export const Form = props => {
|
|
|
331
331
|
setSubmitted(true);
|
|
332
332
|
// When there was an error submitting a draft,
|
|
333
333
|
// set the form state to unsubmitted, to not trigger visible form validation on changes after the failed submit.
|
|
334
|
-
|
|
335
|
-
|
|
334
|
+
// Also keep the form as modified so the save button remains enabled for retry.
|
|
335
|
+
if (overridesFromArgs['_status'] === 'draft') {
|
|
336
|
+
setModified(true);
|
|
337
|
+
if (!validateDrafts) {
|
|
338
|
+
setSubmitted(false);
|
|
339
|
+
}
|
|
336
340
|
}
|
|
337
341
|
contextRef.current = {
|
|
338
342
|
...contextRef.current
|
|
@@ -387,7 +391,7 @@ export const Form = props => {
|
|
|
387
391
|
setDisabled(false);
|
|
388
392
|
errorToast(err.message);
|
|
389
393
|
}
|
|
390
|
-
}, [beforeSubmit, startRouteTransition, action, disableSuccessStatus, disableValidationOnSubmit, disabled, dispatchFields, handleResponse, method, onSubmit, onSuccess, redirect, router, t, i18n, waitForAutocomplete]);
|
|
394
|
+
}, [beforeSubmit, startRouteTransition, action, disableSuccessStatus, disableValidationOnSubmit, disabled, dispatchFields, handleResponse, method, onSubmit, onSuccess, redirect, router, t, i18n, validateDrafts, waitForAutocomplete]);
|
|
391
395
|
const getFields = useCallback(() => contextRef.current.fields, []);
|
|
392
396
|
const getField = useCallback(path_0 => contextRef.current.fields[path_0], []);
|
|
393
397
|
const getData = useCallback(() => reduceFieldsToValues(contextRef.current.fields, true), []);
|