@payloadcms/ui 4.0.0-beta.2 → 4.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/css/preflight.css +21 -2
  2. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  3. package/dist/elements/BulkUpload/FormsManager/index.js +1 -34
  4. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  5. package/dist/elements/CloseModalOnRouteChange/index.d.ts.map +1 -1
  6. package/dist/elements/CloseModalOnRouteChange/index.js +27 -19
  7. package/dist/elements/CloseModalOnRouteChange/index.js.map +1 -1
  8. package/dist/elements/DatePicker/DatePicker.js +6 -2
  9. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  10. package/dist/elements/DatePicker/index.css +35 -25
  11. package/dist/elements/DocumentControls/index.js.map +1 -1
  12. package/dist/elements/DocumentFields/index.css +2 -2
  13. package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
  14. package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
  15. package/dist/elements/ListDrawer/Provider.d.ts.map +1 -1
  16. package/dist/elements/ListDrawer/Provider.js.map +1 -1
  17. package/dist/elements/LivePreview/Window/index.css +7 -1
  18. package/dist/elements/Nav/SidebarTabs/index.client.js +1 -1
  19. package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
  20. package/dist/elements/PublishButton/index.js.map +1 -1
  21. package/dist/elements/SchedulePublishButton/index.js.map +1 -1
  22. package/dist/elements/SegmentedControl/index.css +50 -7
  23. package/dist/elements/Table/DefaultCell/fields/File/index.d.ts.map +1 -1
  24. package/dist/elements/Table/DefaultCell/fields/File/index.js.map +1 -1
  25. package/dist/elements/Table/index.js.map +1 -1
  26. package/dist/exports/client/{DatePicker-FHEXFC26.js → DatePicker-RFCB5VGD.js} +2 -2
  27. package/dist/exports/client/{chunk-RHJMVCBS.js → chunk-O2RR6XEH.js} +2 -2
  28. package/dist/exports/client/chunk-O2RR6XEH.js.map +7 -0
  29. package/dist/exports/client/index.js +14 -14
  30. package/dist/exports/client/index.js.map +3 -3
  31. package/dist/exports/shared/index.js +2 -2
  32. package/dist/exports/shared/index.js.map +3 -3
  33. package/dist/fields/Upload/Input.d.ts.map +1 -1
  34. package/dist/fields/Upload/Input.js +3 -1
  35. package/dist/fields/Upload/Input.js.map +1 -1
  36. package/dist/forms/Form/reduceToSerializableFields.d.ts +9 -4
  37. package/dist/forms/Form/reduceToSerializableFields.d.ts.map +1 -1
  38. package/dist/forms/Form/reduceToSerializableFields.js +34 -7
  39. package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
  40. package/dist/icons/Table/index.css +5 -1
  41. package/dist/layouts/Root/index.d.ts +1 -1
  42. package/dist/layouts/Root/index.d.ts.map +1 -1
  43. package/dist/layouts/Root/index.js +4 -15
  44. package/dist/layouts/Root/index.js.map +1 -1
  45. package/dist/providers/RouteCache/index.d.ts.map +1 -1
  46. package/dist/providers/RouteCache/index.js +37 -25
  47. package/dist/providers/RouteCache/index.js.map +1 -1
  48. package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
  49. package/dist/providers/ServerFunctions/index.js +34 -23
  50. package/dist/providers/ServerFunctions/index.js.map +1 -1
  51. package/dist/styles.css +22 -3
  52. package/dist/templates/Default/index.css +0 -1
  53. package/dist/utilities/getHasScheduledPublish.js.map +1 -1
  54. package/dist/utilities/handleLivePreview.js.map +1 -1
  55. package/dist/utilities/handleServerFunctions.d.ts +2 -10
  56. package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
  57. package/dist/utilities/handleServerFunctions.js +3 -7
  58. package/dist/utilities/handleServerFunctions.js.map +1 -1
  59. package/dist/utilities/hasSavePermission.js.map +1 -1
  60. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  61. package/dist/utilities/serverFunctionRegistry.d.ts +2 -7
  62. package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
  63. package/dist/utilities/serverFunctionRegistry.js +2 -7
  64. package/dist/utilities/serverFunctionRegistry.js.map +1 -1
  65. package/dist/views/Edit/index.js.map +1 -1
  66. package/package.json +15 -15
  67. package/dist/exports/client/chunk-RHJMVCBS.js.map +0 -7
  68. /package/dist/exports/client/{DatePicker-FHEXFC26.js.map → DatePicker-RFCB5VGD.js.map} +0 -0
@@ -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","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","locale","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","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","idsToApply","slice","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 locale = useLocale()\n const code = locale?.code\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 if (!selectedDocIDs.length) {\n return\n }\n\n const idsToApply = hasMany ? selectedDocIDs : selectedDocIDs.slice(0, 1)\n\n const itemsToLoad = idsToApply.map((id) => ({\n relationTo: relationToUse,\n value: id,\n }))\n\n const loadedDocs = await populateDocs(itemsToLoad)\n if (loadedDocs) {\n setPopulatedDocs((currentDocs) =>\n hasMany ? [...(currentDocs || []), ...loadedDocs] : loadedDocs,\n )\n }\n\n const newValues = idsToApply.map((id) =>\n isPoly ? { relationTo: relationToUse, value: id } : id,\n )\n\n if (!hasMany) {\n onChange(newValues[0])\n closeListDrawer()\n return\n }\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n onChange([...normalizedExisting, ...newValues])\n closeListDrawer()\n },\n [\n activeRelationTo,\n closeListDrawer,\n hasMany,\n onChange,\n populateDocs,\n value,\n relationTo,\n normalizeValue,\n ],\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":[]}
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","locale","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","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","idsToApply","slice","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 locale = useLocale()\n const code = locale?.code\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 // The drawer resets its success callback on close, so register it again on every open\n setOnSuccess(onUploadSuccess)\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 setOnSuccess,\n onUploadSuccess,\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 if (!selectedDocIDs.length) {\n return\n }\n\n const idsToApply = hasMany ? selectedDocIDs : selectedDocIDs.slice(0, 1)\n\n const itemsToLoad = idsToApply.map((id) => ({\n relationTo: relationToUse,\n value: id,\n }))\n\n const loadedDocs = await populateDocs(itemsToLoad)\n if (loadedDocs) {\n setPopulatedDocs((currentDocs) =>\n hasMany ? [...(currentDocs || []), ...loadedDocs] : loadedDocs,\n )\n }\n\n const newValues = idsToApply.map((id) =>\n isPoly ? { relationTo: relationToUse, value: id } : id,\n )\n\n if (!hasMany) {\n onChange(newValues[0])\n closeListDrawer()\n return\n }\n // Normalize existing values before merging\n const normalizedExisting = Array.isArray(value) ? value.map(normalizeValue) : []\n onChange([...normalizedExisting, ...newValues])\n closeListDrawer()\n },\n [\n activeRelationTo,\n closeListDrawer,\n hasMany,\n onChange,\n populateDocs,\n value,\n relationTo,\n normalizeValue,\n ],\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":[]}
@@ -1,11 +1,16 @@
1
- import { type FormField, type FormState } from 'payload';
1
+ import type { FormField, FormState } from 'payload';
2
2
  type BlacklistedKeys = 'customComponents' | 'validate';
3
3
  /**
4
4
  * Takes in FormState and removes fields that are not serializable.
5
5
  * Returns FormState without blacklisted keys.
6
+ *
7
+ * Removes custom components from rows as well as fields.
8
+ * Converts upload `File` values and initial values in `file` to `{ name }` metadata.
9
+ *
10
+ * Returns a new state without mutating the source fields, rows, or upload files.
11
+ * Returns `undefined` for falsy input.
6
12
  */
7
- export declare const reduceToSerializableFields: (fields: FormState) => {
8
- [key: string]: Omit<FormField, BlacklistedKeys>;
9
- };
13
+ export declare function reduceToSerializableFields(fields: FormState): Record<string, Omit<FormField, BlacklistedKeys>>;
14
+ export declare function reduceToSerializableFields(fields?: false | FormState | null): Record<string, Omit<FormField, BlacklistedKeys>> | undefined;
10
15
  export {};
11
16
  //# sourceMappingURL=reduceToSerializableFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reduceToSerializableFields.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/reduceToSerializableFields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAA;AAExD,KAAK,eAAe,GAAG,kBAAkB,GAAG,UAAU,CAAA;AAatD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,WAC7B,SAAS,KAChB;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;CAShD,CAAA"}
1
+ {"version":3,"file":"reduceToSerializableFields.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/reduceToSerializableFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAInD,KAAK,eAAe,GAAG,kBAAkB,GAAG,UAAU,CAAA;AAiBtD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,GAChB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAA;AACnD,wBAAgB,0BAA0B,CACxC,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,GAChC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,GAAG,SAAS,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { setOwnProperty } from 'payload/shared';
1
2
  const blacklistedKeys = ['validate', 'customComponents'];
2
3
  const sanitizeField = incomingField => {
3
4
  const field = {
@@ -7,17 +8,43 @@ const sanitizeField = incomingField => {
7
8
  for (const key of blacklistedKeys) {
8
9
  delete field[key];
9
10
  }
11
+ if (field.rows) {
12
+ field.rows = field.rows.map(({
13
+ customComponents: _customComponents,
14
+ ...row
15
+ }) => row);
16
+ }
10
17
  return field;
11
18
  };
12
- /**
13
- * Takes in FormState and removes fields that are not serializable.
14
- * Returns FormState without blacklisted keys.
15
- */
16
- export const reduceToSerializableFields = fields => {
19
+ export function reduceToSerializableFields(fields) {
20
+ if (!fields) {
21
+ return undefined;
22
+ }
17
23
  const result = {};
18
24
  for (const key in fields) {
19
- result[key] = sanitizeField(fields[key]);
25
+ const field = sanitizeField(fields[key]);
26
+ if (key === 'file') {
27
+ field.initialValue = getFileMetadata({
28
+ value: field.initialValue
29
+ });
30
+ field.value = getFileMetadata({
31
+ value: field.value
32
+ });
33
+ }
34
+ setOwnProperty({
35
+ key,
36
+ target: result,
37
+ value: field
38
+ });
20
39
  }
21
40
  return result;
22
- };
41
+ }
42
+ function getFileMetadata({
43
+ value
44
+ }) {
45
+ // Validation needs the filename; the browser retains the bytes for submission and retries.
46
+ return typeof File !== 'undefined' && value instanceof File ? {
47
+ name: value.name
48
+ } : value;
49
+ }
23
50
  //# sourceMappingURL=reduceToSerializableFields.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reduceToSerializableFields.js","names":["blacklistedKeys","sanitizeField","incomingField","field","key","reduceToSerializableFields","fields","result"],"sources":["../../../src/forms/Form/reduceToSerializableFields.ts"],"sourcesContent":["import { type FormField, type FormState } from 'payload'\n\ntype BlacklistedKeys = 'customComponents' | 'validate'\nconst blacklistedKeys: BlacklistedKeys[] = ['validate', 'customComponents']\n\nconst sanitizeField = (incomingField: FormField): FormField => {\n const field = { ...incomingField } // shallow copy, as we only need to remove top-level keys\n\n for (const key of blacklistedKeys) {\n delete field[key]\n }\n\n return field\n}\n\n/**\n * Takes in FormState and removes fields that are not serializable.\n * Returns FormState without blacklisted keys.\n */\nexport const reduceToSerializableFields = (\n fields: FormState,\n): {\n [key: string]: Omit<FormField, BlacklistedKeys>\n} => {\n const result: Record<string, Omit<FormField, BlacklistedKeys>> = {}\n\n for (const key in fields) {\n result[key] = sanitizeField(fields[key])\n }\n\n return result\n}\n"],"mappings":"AAGA,MAAMA,eAAA,GAAqC,CAAC,YAAY,mBAAmB;AAE3E,MAAMC,aAAA,GAAiBC,aAAA;EACrB,MAAMC,KAAA,GAAQ;IAAE,GAAGD;EAAc,EAAE;AAAA;EAEnC,KAAK,MAAME,GAAA,IAAOJ,eAAA,EAAiB;IACjC,OAAOG,KAAK,CAACC,GAAA,CAAI;EACnB;EAEA,OAAOD,KAAA;AACT;AAEA;;;;AAIA,OAAO,MAAME,0BAAA,GACXC,MAAA;EAIA,MAAMC,MAAA,GAA2D,CAAC;EAElE,KAAK,MAAMH,GAAA,IAAOE,MAAA,EAAQ;IACxBC,MAAM,CAACH,GAAA,CAAI,GAAGH,aAAA,CAAcK,MAAM,CAACF,GAAA,CAAI;EACzC;EAEA,OAAOG,MAAA;AACT","ignoreList":[]}
1
+ {"version":3,"file":"reduceToSerializableFields.js","names":["setOwnProperty","blacklistedKeys","sanitizeField","incomingField","field","key","rows","map","customComponents","_customComponents","row","reduceToSerializableFields","fields","undefined","result","initialValue","getFileMetadata","value","target","File","name"],"sources":["../../../src/forms/Form/reduceToSerializableFields.ts"],"sourcesContent":["import type { FormField, FormState } from 'payload'\n\nimport { setOwnProperty } from 'payload/shared'\n\ntype BlacklistedKeys = 'customComponents' | 'validate'\nconst blacklistedKeys: BlacklistedKeys[] = ['validate', 'customComponents']\n\nconst sanitizeField = (incomingField: FormField): FormField => {\n const field = { ...incomingField } // shallow copy, as we only need to remove top-level keys\n\n for (const key of blacklistedKeys) {\n delete field[key]\n }\n\n if (field.rows) {\n field.rows = field.rows.map(({ customComponents: _customComponents, ...row }) => row)\n }\n\n return field\n}\n\n/**\n * Takes in FormState and removes fields that are not serializable.\n * Returns FormState without blacklisted keys.\n *\n * Removes custom components from rows as well as fields.\n * Converts upload `File` values and initial values in `file` to `{ name }` metadata.\n *\n * Returns a new state without mutating the source fields, rows, or upload files.\n * Returns `undefined` for falsy input.\n */\nexport function reduceToSerializableFields(\n fields: FormState,\n): Record<string, Omit<FormField, BlacklistedKeys>>\nexport function reduceToSerializableFields(\n fields?: false | FormState | null,\n): Record<string, Omit<FormField, BlacklistedKeys>> | undefined\nexport function reduceToSerializableFields(\n fields?: false | FormState | null,\n): Record<string, Omit<FormField, BlacklistedKeys>> | undefined {\n if (!fields) {\n return undefined\n }\n\n const result: Record<string, Omit<FormField, BlacklistedKeys>> = {}\n\n for (const key in fields) {\n const field = sanitizeField(fields[key])\n\n if (key === 'file') {\n field.initialValue = getFileMetadata({ value: field.initialValue })\n field.value = getFileMetadata({ value: field.value })\n }\n\n setOwnProperty({ key, target: result, value: field })\n }\n\n return result\n}\n\nfunction getFileMetadata({ value }: { value: unknown }): unknown {\n // Validation needs the filename; the browser retains the bytes for submission and retries.\n return typeof File !== 'undefined' && value instanceof File ? { name: value.name } : value\n}\n"],"mappings":"AAEA,SAASA,cAAc,QAAQ;AAG/B,MAAMC,eAAA,GAAqC,CAAC,YAAY,mBAAmB;AAE3E,MAAMC,aAAA,GAAiBC,aAAA;EACrB,MAAMC,KAAA,GAAQ;IAAE,GAAGD;EAAc,EAAE;AAAA;EAEnC,KAAK,MAAME,GAAA,IAAOJ,eAAA,EAAiB;IACjC,OAAOG,KAAK,CAACC,GAAA,CAAI;EACnB;EAEA,IAAID,KAAA,CAAME,IAAI,EAAE;IACdF,KAAA,CAAME,IAAI,GAAGF,KAAA,CAAME,IAAI,CAACC,GAAG,CAAC,CAAC;MAAEC,gBAAA,EAAkBC,iBAAiB;MAAE,GAAGC;IAAA,CAAK,KAAKA,GAAA;EACnF;EAEA,OAAON,KAAA;AACT;AAkBA,OAAO,SAASO,2BACdC,MAAiC;EAEjC,IAAI,CAACA,MAAA,EAAQ;IACX,OAAOC,SAAA;EACT;EAEA,MAAMC,MAAA,GAA2D,CAAC;EAElE,KAAK,MAAMT,GAAA,IAAOO,MAAA,EAAQ;IACxB,MAAMR,KAAA,GAAQF,aAAA,CAAcU,MAAM,CAACP,GAAA,CAAI;IAEvC,IAAIA,GAAA,KAAQ,QAAQ;MAClBD,KAAA,CAAMW,YAAY,GAAGC,eAAA,CAAgB;QAAEC,KAAA,EAAOb,KAAA,CAAMW;MAAa;MACjEX,KAAA,CAAMa,KAAK,GAAGD,eAAA,CAAgB;QAAEC,KAAA,EAAOb,KAAA,CAAMa;MAAM;IACrD;IAEAjB,cAAA,CAAe;MAAEK,GAAA;MAAKa,MAAA,EAAQJ,MAAA;MAAQG,KAAA,EAAOb;IAAM;EACrD;EAEA,OAAOU,MAAA;AACT;AAEA,SAASE,gBAAgB;EAAEC;AAAK,CAAsB;EACpD;EACA,OAAO,OAAOE,IAAA,KAAS,eAAeF,KAAA,YAAiBE,IAAA,GAAO;IAAEC,IAAA,EAAMH,KAAA,CAAMG;EAAK,IAAIH,KAAA;AACvF","ignoreList":[]}
@@ -1 +1,5 @@
1
- @layer payload-default { .icon--table { /* Icon uses fill. */ } }
1
+ @layer payload-default {
2
+ .icon--table {
3
+ /* Icon uses fill. */
4
+ }
5
+ }
@@ -55,6 +55,6 @@ type RootLayoutProps = {
55
55
  }>;
56
56
  readonly serverFunction: ServerFunctionClient;
57
57
  };
58
- export declare const RootLayout: (props: RootLayoutProps) => React.JSX.Element;
58
+ export declare const RootLayout: ({ additionalDependencyChecks, children, config: configPromise, fonts, head, htmlProps, importMap, initAdminContext, RouterAdapter, serverFunction, }: RootLayoutProps) => Promise<React.JSX.Element>;
59
59
  export {};
60
60
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/Root/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE/E,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAInE,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAKpG,OAAO,4BAA4B,CAAA;AAEnC,KAAK,IAAI,GAAG;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,QAAQ;IACnB,WAAW;IACX,KAAK;CACN,CAAA;AAED,KAAK,eAAe,GAAG;IACrB;;;;OAIG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACvB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAA;IAC9D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAA;IAC7C;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IAC/D,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAA;CAC9C,CAAA;AAED,eAAO,MAAM,UAAU,UAAW,eAAe,sBAUhD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/Root/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE/E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAInE,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAKpG,OAAO,4BAA4B,CAAA;AAEnC,KAAK,IAAI,GAAG;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,QAAQ;IACnB,WAAW;IACX,KAAK;CACN,CAAA;AAED,KAAK,eAAe,GAAG;IACrB;;;;OAIG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACvB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAA;IAC9D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAA;IAC7C;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAA;IAC/D,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAA;CAC9C,CAAA;AAED,eAAO,MAAM,UAAU,yJAWpB,eAAe,+BAoDjB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import React, { Suspense } from 'react';
2
+ import React from 'react';
3
3
  // eslint-disable-next-line payload/no-imports-from-exports-dir -- Server component must reference client bundle for proper client boundary in production
4
4
  import { DocumentRoot, RootProviders } from '../../exports/client/index.js';
5
5
  import { checkDependencies } from '../../utilities/checkDependencies.js';
@@ -12,20 +12,8 @@ export const metadata = {
12
12
  description: 'Generated by Next.js',
13
13
  title: 'Next.js'
14
14
  };
15
- export const RootLayout = props => {
16
- checkDependencies(props.additionalDependencyChecks);
17
- const content = /*#__PURE__*/_jsx(RootLayoutContent, {
18
- ...props
19
- });
20
- if (process.env.PAYLOAD_CACHE_COMPONENTS_ENABLED === 'true') {
21
- return /*#__PURE__*/_jsx(Suspense, {
22
- fallback: null,
23
- children: content
24
- });
25
- }
26
- return content;
27
- };
28
- const RootLayoutContent = async ({
15
+ export const RootLayout = async ({
16
+ additionalDependencyChecks,
29
17
  children,
30
18
  config: configPromise,
31
19
  fonts = [],
@@ -36,6 +24,7 @@ const RootLayoutContent = async ({
36
24
  RouterAdapter,
37
25
  serverFunction
38
26
  }) => {
27
+ checkDependencies(additionalDependencyChecks);
39
28
  const context = await initAdminContext({
40
29
  configPromise,
41
30
  importMap,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["React","Suspense","DocumentRoot","RootProviders","checkDependencies","getRootLayoutData","NestProviders","getViewportMeta","metadata","description","title","RootLayout","props","additionalDependencyChecks","content","_jsx","RootLayoutContent","process","env","PAYLOAD_CACHE_COMPONENTS_ENABLED","fallback","children","config","configPromise","fonts","head","htmlProps","importMap","initAdminContext","RouterAdapter","serverFunction","context","key","cookies","permissions","req","user","payload","data","dir","highContrastMode","languageCode","suppressHydrationWarning","theme","themeSource","viewport","headers","get","undefined","Array","isArray","admin","components","providers","length","serverProps","i18n","server"],"sources":["../../../src/layouts/Root/index.tsx"],"sourcesContent":["import type { ImportMap, SanitizedConfig, ServerFunctionClient } from 'payload'\n\nimport React, { Suspense } from 'react'\n\nimport type { InitAdminContextFn } from '../../views/Root/index.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir -- Server component must reference client bundle for proper client boundary in production\nimport { DocumentRoot, RootProviders } from '../../exports/client/index.js'\nimport { checkDependencies, type CheckDependenciesArgs } from '../../utilities/checkDependencies.js'\nimport { getRootLayoutData } from './getRootLayoutData.js'\nimport { NestProviders } from './NestProviders.js'\nimport { getViewportMeta } from './viewport.js'\n// eslint-disable-next-line payload/no-imports-from-self -- Self-import ensures the consumer bundler resolves the full CSS chain\nimport '@payloadcms/ui/css/app.css'\n\ntype Font = {\n className?: string\n variable?: string\n}\n\nexport const metadata = {\n description: 'Generated by Next.js',\n title: 'Next.js',\n}\n\ntype RootLayoutProps = {\n /**\n * Framework-specific peer-dependency version constraints, merged on top of the\n * universal React/react-dom checks. Each framework adapter supplies its own\n * (e.g. Next.js passes `{ dependencyVersions: { next: { version: '>=15.0.0' } } }`).\n */\n readonly additionalDependencyChecks?: CheckDependenciesArgs\n readonly children: React.ReactNode\n readonly config: Promise<SanitizedConfig>\n /**\n * Fonts to apply to the admin `<html>` element. Each entry's\n * `variable ?? className` is appended to the `<html>` class list.\n * Framework-specific font loaders (e.g. `next/font`) are supplied by the caller.\n */\n readonly fonts?: Font[]\n /**\n * Custom content to render inside the admin panel's `<head>` element.\n *\n * Use this to inject scripts, meta tags, or links — for example, analytics\n * snippets via `next/script`, custom favicons, or preconnect hints.\n *\n * @example\n * ```tsx\n * import Script from 'next/script'\n *\n * <RootLayout\n * head={<Script src=\"https://example.com/analytics.js\" strategy=\"afterInteractive\" />}\n * {...rest}\n * />\n * ```\n */\n readonly head?: React.ReactNode\n readonly htmlProps?: React.HtmlHTMLAttributes<HTMLHtmlElement>\n readonly importMap: ImportMap\n readonly initAdminContext: InitAdminContextFn\n /**\n * Client router adapter. Caller supplies a framework-specific provider\n * (for Next.js use the `NextRouterAdapter` exported from `@payloadcms/next`).\n */\n readonly RouterAdapter: React.FC<{ children: React.ReactNode }>\n readonly serverFunction: ServerFunctionClient\n}\n\nexport const RootLayout = (props: RootLayoutProps) => {\n checkDependencies(props.additionalDependencyChecks)\n\n const content = <RootLayoutContent {...props} />\n\n if (process.env.PAYLOAD_CACHE_COMPONENTS_ENABLED === 'true') {\n return <Suspense fallback={null}>{content}</Suspense>\n }\n\n return content\n}\n\nconst RootLayoutContent = async ({\n children,\n config: configPromise,\n fonts = [],\n head,\n htmlProps = {},\n importMap,\n initAdminContext,\n RouterAdapter,\n serverFunction,\n}: RootLayoutProps) => {\n const context = await initAdminContext({ configPromise, importMap, key: 'RootLayout' })\n\n const { cookies, permissions, req, user } = context\n\n const { config } = req.payload\n\n const data = await getRootLayoutData({\n cookies,\n importMap,\n permissions,\n req,\n user,\n })\n\n return (\n <DocumentRoot\n dir={data.dir}\n fonts={fonts}\n head={head}\n highContrastMode={data.highContrastMode}\n htmlProps={htmlProps}\n languageCode={data.languageCode}\n suppressHydrationWarning={data.suppressHydrationWarning}\n theme={data.theme}\n themeSource={data.themeSource}\n viewport={getViewportMeta(req.headers.get('user-agent') ?? undefined)}\n >\n <RootProviders data={data} RouterAdapter={RouterAdapter} serverFunction={serverFunction}>\n {Array.isArray(config.admin?.components?.providers) &&\n config.admin.components.providers.length > 0 ? (\n <NestProviders\n importMap={req.payload.importMap}\n providers={config.admin.components.providers}\n serverProps={{\n i18n: req.i18n,\n payload: req.payload,\n permissions,\n server: req.server,\n user,\n }}\n >\n {children}\n </NestProviders>\n ) : (\n children\n )}\n </RootProviders>\n </DocumentRoot>\n )\n}\n"],"mappings":";AAEA,OAAOA,KAAA,IAASC,QAAQ,QAAQ;AAIhC;AACA,SAASC,YAAY,EAAEC,aAAa,QAAQ;AAC5C,SAASC,iBAAiB,QAAoC;AAC9D,SAASC,iBAAiB,QAAQ;AAClC,SAASC,aAAa,QAAQ;AAC9B,SAASC,eAAe,QAAQ;AAChC;AACA,OAAO;AAOP,OAAO,MAAMC,QAAA,GAAW;EACtBC,WAAA,EAAa;EACbC,KAAA,EAAO;AACT;AA6CA,OAAO,MAAMC,UAAA,GAAcC,KAAA;EACzBR,iBAAA,CAAkBQ,KAAA,CAAMC,0BAA0B;EAElD,MAAMC,OAAA,gBAAUC,IAAA,CAACC,iBAAA;IAAmB,GAAGJ;;EAEvC,IAAIK,OAAA,CAAQC,GAAG,CAACC,gCAAgC,KAAK,QAAQ;IAC3D,oBAAOJ,IAAA,CAACd,QAAA;MAASmB,QAAA,EAAU;gBAAON;;EACpC;EAEA,OAAOA,OAAA;AACT;AAEA,MAAME,iBAAA,GAAoB,MAAAA,CAAO;EAC/BK,QAAQ;EACRC,MAAA,EAAQC,aAAa;EACrBC,KAAA,GAAQ,EAAE;EACVC,IAAI;EACJC,SAAA,GAAY,CAAC,CAAC;EACdC,SAAS;EACTC,gBAAgB;EAChBC,aAAa;EACbC;AAAc,CACE;EAChB,MAAMC,OAAA,GAAU,MAAMH,gBAAA,CAAiB;IAAEL,aAAA;IAAeI,SAAA;IAAWK,GAAA,EAAK;EAAa;EAErF,MAAM;IAAEC,OAAO;IAAEC,WAAW;IAAEC,GAAG;IAAEC;EAAI,CAAE,GAAGL,OAAA;EAE5C,MAAM;IAAET;EAAM,CAAE,GAAGa,GAAA,CAAIE,OAAO;EAE9B,MAAMC,IAAA,GAAO,MAAMjC,iBAAA,CAAkB;IACnC4B,OAAA;IACAN,SAAA;IACAO,WAAA;IACAC,GAAA;IACAC;EACF;EAEA,oBACErB,IAAA,CAACb,YAAA;IACCqC,GAAA,EAAKD,IAAA,CAAKC,GAAG;IACbf,KAAA,EAAOA,KAAA;IACPC,IAAA,EAAMA,IAAA;IACNe,gBAAA,EAAkBF,IAAA,CAAKE,gBAAgB;IACvCd,SAAA,EAAWA,SAAA;IACXe,YAAA,EAAcH,IAAA,CAAKG,YAAY;IAC/BC,wBAAA,EAA0BJ,IAAA,CAAKI,wBAAwB;IACvDC,KAAA,EAAOL,IAAA,CAAKK,KAAK;IACjBC,WAAA,EAAaN,IAAA,CAAKM,WAAW;IAC7BC,QAAA,EAAUtC,eAAA,CAAgB4B,GAAA,CAAIW,OAAO,CAACC,GAAG,CAAC,iBAAiBC,SAAA;cAE3D,aAAAjC,IAAA,CAACZ,aAAA;MAAcmC,IAAA,EAAMA,IAAA;MAAMT,aAAA,EAAeA,aAAA;MAAeC,cAAA,EAAgBA,cAAA;gBACtEmB,KAAA,CAAMC,OAAO,CAAC5B,MAAA,CAAO6B,KAAK,EAAEC,UAAA,EAAYC,SAAA,KACzC/B,MAAA,CAAO6B,KAAK,CAACC,UAAU,CAACC,SAAS,CAACC,MAAM,GAAG,iBACzCvC,IAAA,CAACT,aAAA;QACCqB,SAAA,EAAWQ,GAAA,CAAIE,OAAO,CAACV,SAAS;QAChC0B,SAAA,EAAW/B,MAAA,CAAO6B,KAAK,CAACC,UAAU,CAACC,SAAS;QAC5CE,WAAA,EAAa;UACXC,IAAA,EAAMrB,GAAA,CAAIqB,IAAI;UACdnB,OAAA,EAASF,GAAA,CAAIE,OAAO;UACpBH,WAAA;UACAuB,MAAA,EAAQtB,GAAA,CAAIsB,MAAM;UAClBrB;QACF;kBAECf;WAGHA;;;AAKV","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["React","DocumentRoot","RootProviders","checkDependencies","getRootLayoutData","NestProviders","getViewportMeta","metadata","description","title","RootLayout","additionalDependencyChecks","children","config","configPromise","fonts","head","htmlProps","importMap","initAdminContext","RouterAdapter","serverFunction","context","key","cookies","permissions","req","user","payload","data","_jsx","dir","highContrastMode","languageCode","suppressHydrationWarning","theme","themeSource","viewport","headers","get","undefined","Array","isArray","admin","components","providers","length","serverProps","i18n","server"],"sources":["../../../src/layouts/Root/index.tsx"],"sourcesContent":["import type { ImportMap, SanitizedConfig, ServerFunctionClient } from 'payload'\n\nimport React from 'react'\n\nimport type { InitAdminContextFn } from '../../views/Root/index.js'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir -- Server component must reference client bundle for proper client boundary in production\nimport { DocumentRoot, RootProviders } from '../../exports/client/index.js'\nimport { checkDependencies, type CheckDependenciesArgs } from '../../utilities/checkDependencies.js'\nimport { getRootLayoutData } from './getRootLayoutData.js'\nimport { NestProviders } from './NestProviders.js'\nimport { getViewportMeta } from './viewport.js'\n// eslint-disable-next-line payload/no-imports-from-self -- Self-import ensures the consumer bundler resolves the full CSS chain\nimport '@payloadcms/ui/css/app.css'\n\ntype Font = {\n className?: string\n variable?: string\n}\n\nexport const metadata = {\n description: 'Generated by Next.js',\n title: 'Next.js',\n}\n\ntype RootLayoutProps = {\n /**\n * Framework-specific peer-dependency version constraints, merged on top of the\n * universal React/react-dom checks. Each framework adapter supplies its own\n * (e.g. Next.js passes `{ dependencyVersions: { next: { version: '>=15.0.0' } } }`).\n */\n readonly additionalDependencyChecks?: CheckDependenciesArgs\n readonly children: React.ReactNode\n readonly config: Promise<SanitizedConfig>\n /**\n * Fonts to apply to the admin `<html>` element. Each entry's\n * `variable ?? className` is appended to the `<html>` class list.\n * Framework-specific font loaders (e.g. `next/font`) are supplied by the caller.\n */\n readonly fonts?: Font[]\n /**\n * Custom content to render inside the admin panel's `<head>` element.\n *\n * Use this to inject scripts, meta tags, or links — for example, analytics\n * snippets via `next/script`, custom favicons, or preconnect hints.\n *\n * @example\n * ```tsx\n * import Script from 'next/script'\n *\n * <RootLayout\n * head={<Script src=\"https://example.com/analytics.js\" strategy=\"afterInteractive\" />}\n * {...rest}\n * />\n * ```\n */\n readonly head?: React.ReactNode\n readonly htmlProps?: React.HtmlHTMLAttributes<HTMLHtmlElement>\n readonly importMap: ImportMap\n readonly initAdminContext: InitAdminContextFn\n /**\n * Client router adapter. Caller supplies a framework-specific provider\n * (for Next.js use the `NextRouterAdapter` exported from `@payloadcms/next`).\n */\n readonly RouterAdapter: React.FC<{ children: React.ReactNode }>\n readonly serverFunction: ServerFunctionClient\n}\n\nexport const RootLayout = async ({\n additionalDependencyChecks,\n children,\n config: configPromise,\n fonts = [],\n head,\n htmlProps = {},\n importMap,\n initAdminContext,\n RouterAdapter,\n serverFunction,\n}: RootLayoutProps) => {\n checkDependencies(additionalDependencyChecks)\n\n const context = await initAdminContext({ configPromise, importMap, key: 'RootLayout' })\n\n const { cookies, permissions, req, user } = context\n\n const { config } = req.payload\n\n const data = await getRootLayoutData({\n cookies,\n importMap,\n permissions,\n req,\n user,\n })\n\n return (\n <DocumentRoot\n dir={data.dir}\n fonts={fonts}\n head={head}\n highContrastMode={data.highContrastMode}\n htmlProps={htmlProps}\n languageCode={data.languageCode}\n suppressHydrationWarning={data.suppressHydrationWarning}\n theme={data.theme}\n themeSource={data.themeSource}\n viewport={getViewportMeta(req.headers.get('user-agent') ?? undefined)}\n >\n <RootProviders data={data} RouterAdapter={RouterAdapter} serverFunction={serverFunction}>\n {Array.isArray(config.admin?.components?.providers) &&\n config.admin.components.providers.length > 0 ? (\n <NestProviders\n importMap={req.payload.importMap}\n providers={config.admin.components.providers}\n serverProps={{\n i18n: req.i18n,\n payload: req.payload,\n permissions,\n server: req.server,\n user,\n }}\n >\n {children}\n </NestProviders>\n ) : (\n children\n )}\n </RootProviders>\n </DocumentRoot>\n )\n}\n"],"mappings":";AAEA,OAAOA,KAAA,MAAW;AAIlB;AACA,SAASC,YAAY,EAAEC,aAAa,QAAQ;AAC5C,SAASC,iBAAiB,QAAoC;AAC9D,SAASC,iBAAiB,QAAQ;AAClC,SAASC,aAAa,QAAQ;AAC9B,SAASC,eAAe,QAAQ;AAChC;AACA,OAAO;AAOP,OAAO,MAAMC,QAAA,GAAW;EACtBC,WAAA,EAAa;EACbC,KAAA,EAAO;AACT;AA6CA,OAAO,MAAMC,UAAA,GAAa,MAAAA,CAAO;EAC/BC,0BAA0B;EAC1BC,QAAQ;EACRC,MAAA,EAAQC,aAAa;EACrBC,KAAA,GAAQ,EAAE;EACVC,IAAI;EACJC,SAAA,GAAY,CAAC,CAAC;EACdC,SAAS;EACTC,gBAAgB;EAChBC,aAAa;EACbC;AAAc,CACE;EAChBlB,iBAAA,CAAkBQ,0BAAA;EAElB,MAAMW,OAAA,GAAU,MAAMH,gBAAA,CAAiB;IAAEL,aAAA;IAAeI,SAAA;IAAWK,GAAA,EAAK;EAAa;EAErF,MAAM;IAAEC,OAAO;IAAEC,WAAW;IAAEC,GAAG;IAAEC;EAAI,CAAE,GAAGL,OAAA;EAE5C,MAAM;IAAET;EAAM,CAAE,GAAGa,GAAA,CAAIE,OAAO;EAE9B,MAAMC,IAAA,GAAO,MAAMzB,iBAAA,CAAkB;IACnCoB,OAAA;IACAN,SAAA;IACAO,WAAA;IACAC,GAAA;IACAC;EACF;EAEA,oBACEG,IAAA,CAAC7B,YAAA;IACC8B,GAAA,EAAKF,IAAA,CAAKE,GAAG;IACbhB,KAAA,EAAOA,KAAA;IACPC,IAAA,EAAMA,IAAA;IACNgB,gBAAA,EAAkBH,IAAA,CAAKG,gBAAgB;IACvCf,SAAA,EAAWA,SAAA;IACXgB,YAAA,EAAcJ,IAAA,CAAKI,YAAY;IAC/BC,wBAAA,EAA0BL,IAAA,CAAKK,wBAAwB;IACvDC,KAAA,EAAON,IAAA,CAAKM,KAAK;IACjBC,WAAA,EAAaP,IAAA,CAAKO,WAAW;IAC7BC,QAAA,EAAU/B,eAAA,CAAgBoB,GAAA,CAAIY,OAAO,CAACC,GAAG,CAAC,iBAAiBC,SAAA;cAE3D,aAAAV,IAAA,CAAC5B,aAAA;MAAc2B,IAAA,EAAMA,IAAA;MAAMT,aAAA,EAAeA,aAAA;MAAeC,cAAA,EAAgBA,cAAA;gBACtEoB,KAAA,CAAMC,OAAO,CAAC7B,MAAA,CAAO8B,KAAK,EAAEC,UAAA,EAAYC,SAAA,KACzChC,MAAA,CAAO8B,KAAK,CAACC,UAAU,CAACC,SAAS,CAACC,MAAM,GAAG,iBACzChB,IAAA,CAACzB,aAAA;QACCa,SAAA,EAAWQ,GAAA,CAAIE,OAAO,CAACV,SAAS;QAChC2B,SAAA,EAAWhC,MAAA,CAAO8B,KAAK,CAACC,UAAU,CAACC,SAAS;QAC5CE,WAAA,EAAa;UACXC,IAAA,EAAMtB,GAAA,CAAIsB,IAAI;UACdpB,OAAA,EAASF,GAAA,CAAIE,OAAO;UACpBH,WAAA;UACAwB,MAAA,EAAQvB,GAAA,CAAIuB,MAAM;UAClBtB;QACF;kBAECf;WAGHA;;;AAKV","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/RouteCache/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA6D,MAAM,OAAO,CAAA;AAKjF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B,CAAA;AAOD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CA4CxF,CAAA;AAED,eAAO,MAAM,aAAa,yBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/RouteCache/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA6D,MAAM,OAAO,CAAA;AAKjF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B,CAAA;AAOD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CA0ExF,CAAA;AAED,eAAO,MAAM,aAAa,yBAAqB,CAAA"}
@@ -18,7 +18,7 @@ export const RouteCache = t0 => {
18
18
  const cachingEnabled = t1 === undefined ? true : t1;
19
19
  const pathname = usePathname();
20
20
  const router = useRouter();
21
- const clearAfterPathnameChange = useRef(false);
21
+ const previousPathnameRef = useRef("");
22
22
  let t2;
23
23
  if ($[0] !== router) {
24
24
  t2 = () => {
@@ -31,51 +31,63 @@ export const RouteCache = t0 => {
31
31
  }
32
32
  const clearRouteCache = t2;
33
33
  let t3;
34
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
34
+ let t4;
35
+ if ($[2] !== cachingEnabled || $[3] !== clearRouteCache) {
35
36
  t3 = () => {
37
+ if (cachingEnabled) {
38
+ return;
39
+ }
40
+ previousPathnameRef.current = window.location.pathname;
41
+ let refreshTimeout;
36
42
  const handlePopState = () => {
37
- clearAfterPathnameChange.current = true;
43
+ const currentPathname = window.location.pathname;
44
+ if (previousPathnameRef.current === currentPathname) {
45
+ return;
46
+ }
47
+ previousPathnameRef.current = currentPathname;
48
+ refreshTimeout = setTimeout(clearRouteCache, 0);
38
49
  };
39
50
  window.addEventListener("popstate", handlePopState);
40
51
  return () => {
52
+ clearTimeout(refreshTimeout);
41
53
  window.removeEventListener("popstate", handlePopState);
42
54
  };
43
55
  };
44
- $[2] = t3;
45
- } else {
46
- t3 = $[2];
47
- }
48
- let t4;
49
- if ($[3] !== router) {
50
- t4 = [router];
51
- $[3] = router;
52
- $[4] = t4;
56
+ t4 = [cachingEnabled, clearRouteCache];
57
+ $[2] = cachingEnabled;
58
+ $[3] = clearRouteCache;
59
+ $[4] = t3;
60
+ $[5] = t4;
53
61
  } else {
54
- t4 = $[4];
62
+ t3 = $[4];
63
+ t4 = $[5];
55
64
  }
56
65
  useEffect(t3, t4);
57
66
  let t5;
58
- if ($[5] !== cachingEnabled || $[6] !== clearRouteCache) {
59
- t5 = pathname_0 => {
60
- if (cachingEnabled || clearAfterPathnameChange.current) {
61
- clearAfterPathnameChange.current = false;
67
+ if ($[6] !== cachingEnabled || $[7] !== clearRouteCache) {
68
+ t5 = () => {
69
+ if (cachingEnabled) {
62
70
  clearRouteCache();
63
71
  }
64
72
  };
65
- $[5] = cachingEnabled;
66
- $[6] = clearRouteCache;
67
- $[7] = t5;
73
+ $[6] = cachingEnabled;
74
+ $[7] = clearRouteCache;
75
+ $[8] = t5;
68
76
  } else {
69
- t5 = $[7];
77
+ t5 = $[8];
70
78
  }
71
79
  const handlePathnameChange = useEffectEvent(t5);
72
80
  let t6;
73
- if ($[8] !== handlePathnameChange || $[9] !== pathname) {
81
+ if ($[9] !== handlePathnameChange) {
74
82
  t6 = () => {
75
- handlePathnameChange(pathname);
83
+ handlePathnameChange();
84
+ const currentPathname_0 = window.location.pathname;
85
+ const timeout = setTimeout(() => {
86
+ previousPathnameRef.current = currentPathname_0;
87
+ }, 0);
88
+ return () => clearTimeout(timeout);
76
89
  };
77
- $[8] = handlePathnameChange;
78
- $[9] = pathname;
90
+ $[9] = handlePathnameChange;
79
91
  $[10] = t6;
80
92
  } else {
81
93
  t6 = $[10];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","React","createContext","use","useCallback","useEffect","useRef","useEffectEvent","usePathname","useRouter","Context","cachingEnabled","clearRouteCache","RouteCache","t0","$","t1","children","undefined","pathname","router","clearAfterPathnameChange","t2","refresh","t3","Symbol","for","handlePopState","current","window","addEventListener","removeEventListener","t4","t5","pathname_0","handlePathnameChange","t6","t7","t8","_jsx","value","useRouteCache"],"sources":["../../../src/providers/RouteCache/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, use, useCallback, useEffect, useRef } from 'react'\n\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { usePathname, useRouter } from '../RouterAdapter/index.js'\n\nexport type RouteCacheContext = {\n cachingEnabled: boolean\n clearRouteCache: () => void\n}\n\nconst Context = createContext<RouteCacheContext>({\n cachingEnabled: true,\n clearRouteCache: () => {},\n})\n\nexport const RouteCache: React.FC<{ cachingEnabled?: boolean; children: React.ReactNode }> = ({\n cachingEnabled = true,\n children,\n}) => {\n const pathname = usePathname()\n const router = useRouter()\n\n /**\n * Next.js caches pages in memory in their {@link https://nextjs.org/docs/app/guides/caching#client-side-router-cache Client-side Router Cache},\n * causing forward/back browser navigation to show stale data from a previous visit.\n * The problem is this bfcache-like behavior has no opt-out, even if the page is dynamic, requires authentication, etc.\n * The workaround is to force a refresh when navigating via the browser controls.\n * This should be removed if/when Next.js supports this natively.\n */\n const clearAfterPathnameChange = useRef(false)\n\n const clearRouteCache = useCallback(() => {\n router.refresh()\n }, [router])\n\n useEffect(() => {\n const handlePopState = () => {\n clearAfterPathnameChange.current = true\n }\n\n window.addEventListener('popstate', handlePopState)\n\n return () => {\n window.removeEventListener('popstate', handlePopState)\n }\n }, [router])\n\n const handlePathnameChange = useEffectEvent((pathname: string) => {\n if (cachingEnabled || clearAfterPathnameChange.current) {\n clearAfterPathnameChange.current = false\n clearRouteCache()\n }\n })\n\n useEffect(() => {\n handlePathnameChange(pathname)\n }, [pathname])\n\n return <Context value={{ cachingEnabled, clearRouteCache }}>{children}</Context>\n}\n\nexport const useRouteCache = () => use(Context)\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","React","createContext","use","useCallback","useEffect","useRef","useEffectEvent","usePathname","useRouter","Context","cachingEnabled","clearRouteCache","RouteCache","t0","$","t1","children","undefined","pathname","router","previousPathnameRef","t2","refresh","t3","t4","current","window","location","refreshTimeout","handlePopState","currentPathname","addEventListener","clearTimeout","removeEventListener","t5","handlePathnameChange","t6","currentPathname_0","timeout","setTimeout","t7","t8","_jsx","value","useRouteCache"],"sources":["../../../src/providers/RouteCache/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, use, useCallback, useEffect, useRef } from 'react'\n\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { usePathname, useRouter } from '../RouterAdapter/index.js'\n\nexport type RouteCacheContext = {\n cachingEnabled: boolean\n clearRouteCache: () => void\n}\n\nconst Context = createContext<RouteCacheContext>({\n cachingEnabled: true,\n clearRouteCache: () => {},\n})\n\nexport const RouteCache: React.FC<{ cachingEnabled?: boolean; children: React.ReactNode }> = ({\n cachingEnabled = true,\n children,\n}) => {\n const pathname = usePathname()\n const router = useRouter()\n const previousPathnameRef = useRef('')\n\n const clearRouteCache = useCallback(() => {\n router.refresh()\n }, [router])\n\n /**\n * Next.js caches pages in memory in their {@link https://nextjs.org/docs/app/guides/caching#client-side-router-cache Client-side Router Cache},\n * causing forward/back browser navigation to show stale data from a previous visit.\n * The problem is this bfcache-like behavior has no opt-out, even if the page is dynamic, requires authentication, etc.\n * The workaround is to force a refresh when navigating via the browser controls.\n * This should be removed if/when Next.js supports this natively.\n */\n useEffect(() => {\n if (cachingEnabled) {\n // Already refreshed on every pathname change below\n return\n }\n\n previousPathnameRef.current = window.location.pathname\n\n let refreshTimeout: ReturnType<typeof setTimeout> | undefined\n\n const handlePopState = () => {\n const currentPathname = window.location.pathname\n\n // Fragment navigation also fires popstate. Refreshing the same route resets unsaved forms.\n if (previousPathnameRef.current === currentPathname) {\n return\n }\n\n previousPathnameRef.current = currentPathname\n\n // Next.js restores the previous page in its own `popstate` listener. With `cacheComponents`,\n // that happens synchronously and may run before or after this listener, so refreshing right\n // away (or in a microtask) could refresh the page we are leaving. A timeout runs after all\n // `popstate` listeners, once the restored page is the current route.\n refreshTimeout = setTimeout(clearRouteCache, 0)\n }\n\n window.addEventListener('popstate', handlePopState)\n\n return () => {\n clearTimeout(refreshTimeout)\n window.removeEventListener('popstate', handlePopState)\n }\n }, [cachingEnabled, clearRouteCache])\n\n const handlePathnameChange = useEffectEvent(() => {\n if (cachingEnabled) {\n clearRouteCache()\n }\n })\n\n useEffect(() => {\n handlePathnameChange()\n\n const currentPathname = window.location.pathname\n\n // Next.js may commit the restored route before popstate runs. Keep the previous path until then.\n const timeout = setTimeout(() => {\n previousPathnameRef.current = currentPathname\n }, 0)\n\n return () => clearTimeout(timeout)\n }, [pathname])\n\n return <Context value={{ cachingEnabled, clearRouteCache }}>{children}</Context>\n}\n\nexport const useRouteCache = () => use(Context)\n"],"mappings":"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","ignoreList":[]}