From d5cd2faacb6bb93ef2632da5fb14783518816931 Mon Sep 17 00:00:00 2001 From: Jens Becker Date: Mon, 21 Jul 2025 13:58:17 +0200 Subject: [PATCH 1/3] perf(ui): only select the useAsTitle field when fetching the document data of a relationship value --- packages/ui/src/fields/Relationship/Input.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/fields/Relationship/Input.tsx b/packages/ui/src/fields/Relationship/Input.tsx index 328bfc2e8ed..012a875692b 100644 --- a/packages/ui/src/fields/Relationship/Input.tsx +++ b/packages/ui/src/fields/Relationship/Input.tsx @@ -415,11 +415,17 @@ export const RelationshipInput: React.FC = (props) => { }) if (idsToLoad.length > 0) { + const collection = getEntityConfig({ collectionSlug: relation }) + const fieldToSelect = collection?.admin?.useAsTitle || 'id' + const query = { depth: 0, draft: true, limit: idsToLoad.length, locale, + select: { + [fieldToSelect]: true, + }, where: { id: { in: idsToLoad, @@ -438,8 +444,6 @@ export const RelationshipInput: React.FC = (props) => { }, method: 'POST', }) - - const collection = getEntityConfig({ collectionSlug: relation }) let docs = [] if (response.ok) { From 71ed479c58643625949f080a64e3a70ec545a46e Mon Sep 17 00:00:00 2001 From: Jens Becker Date: Tue, 22 Jul 2025 10:19:44 +0200 Subject: [PATCH 2/3] feat(ui): add populateDocumentTitleOnly option to Relationship field to ensure backwards compatability --- packages/payload/src/fields/config/types.ts | 11 ++++++++++- packages/ui/src/fields/Relationship/Input.tsx | 11 ++++++++--- packages/ui/src/fields/Relationship/index.tsx | 2 ++ packages/ui/src/fields/Relationship/types.ts | 1 + 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 14f1fc7faea..1b109c3c584 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1208,10 +1208,19 @@ type RelationshipAdmin = { } & Admin['components'] isSortable?: boolean placeholder?: LabelFunction | string + populateDocumentTitleOnly?: boolean } & Admin type RelationshipAdminClient = AdminClient & - Pick + Pick< + RelationshipAdmin, + | 'allowCreate' + | 'allowEdit' + | 'appearance' + | 'isSortable' + | 'placeholder' + | 'populateDocumentTitleOnly' + > export type PolymorphicRelationshipField = { admin?: { diff --git a/packages/ui/src/fields/Relationship/Input.tsx b/packages/ui/src/fields/Relationship/Input.tsx index 012a875692b..6647d2a1c8a 100644 --- a/packages/ui/src/fields/Relationship/Input.tsx +++ b/packages/ui/src/fields/Relationship/Input.tsx @@ -59,6 +59,7 @@ export const RelationshipInput: React.FC = (props) => { onChange, path, placeholder, + populateDocumentTitleOnly, readOnly, relationTo, required, @@ -423,9 +424,13 @@ export const RelationshipInput: React.FC = (props) => { draft: true, limit: idsToLoad.length, locale, - select: { - [fieldToSelect]: true, - }, + // NOTE: Populate full document by default for backwards compatibility + // Only use select when populateDocumentTitleOnly is true + ...(populateDocumentTitleOnly === true && { + select: { + [fieldToSelect]: true, + }, + }), where: { id: { in: idsToLoad, diff --git a/packages/ui/src/fields/Relationship/index.tsx b/packages/ui/src/fields/Relationship/index.tsx index a4b4f6dd049..38ce787d887 100644 --- a/packages/ui/src/fields/Relationship/index.tsx +++ b/packages/ui/src/fields/Relationship/index.tsx @@ -25,6 +25,7 @@ const RelationshipFieldComponent: RelationshipFieldClientComponent = (props) => description, isSortable = true, placeholder, + populateDocumentTitleOnly, sortOptions, } = {}, hasMany, @@ -205,6 +206,7 @@ const RelationshipFieldComponent: RelationshipFieldClientComponent = (props) => minRows={field?.minRows} path={path} placeholder={placeholder} + populateDocumentTitleOnly={populateDocumentTitleOnly} readOnly={readOnly || disabled} relationTo={relationTo} required={required} diff --git a/packages/ui/src/fields/Relationship/types.ts b/packages/ui/src/fields/Relationship/types.ts index 98c7500cfb7..ba2962b669c 100644 --- a/packages/ui/src/fields/Relationship/types.ts +++ b/packages/ui/src/fields/Relationship/types.ts @@ -109,6 +109,7 @@ export type RelationshipInputProps = { readonly minRows?: number readonly path: string readonly placeholder?: LabelFunction | string + readonly populateDocumentTitleOnly?: boolean readonly readOnly?: boolean readonly relationTo: string[] readonly required?: boolean From 460320b27deb5b2498d9dbdc1e5dc85a29cebc8c Mon Sep 17 00:00:00 2001 From: Jens Becker Date: Wed, 30 Jul 2025 08:32:48 +0200 Subject: [PATCH 3/3] Revert "feat(ui): add populateDocumentTitleOnly option to Relationship field to ensure backwards compatability" This reverts commit 71ed479c58643625949f080a64e3a70ec545a46e. --- packages/payload/src/fields/config/types.ts | 11 +---------- packages/ui/src/fields/Relationship/Input.tsx | 11 +++-------- packages/ui/src/fields/Relationship/index.tsx | 2 -- packages/ui/src/fields/Relationship/types.ts | 1 - 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index 1b109c3c584..14f1fc7faea 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1208,19 +1208,10 @@ type RelationshipAdmin = { } & Admin['components'] isSortable?: boolean placeholder?: LabelFunction | string - populateDocumentTitleOnly?: boolean } & Admin type RelationshipAdminClient = AdminClient & - Pick< - RelationshipAdmin, - | 'allowCreate' - | 'allowEdit' - | 'appearance' - | 'isSortable' - | 'placeholder' - | 'populateDocumentTitleOnly' - > + Pick export type PolymorphicRelationshipField = { admin?: { diff --git a/packages/ui/src/fields/Relationship/Input.tsx b/packages/ui/src/fields/Relationship/Input.tsx index 6647d2a1c8a..012a875692b 100644 --- a/packages/ui/src/fields/Relationship/Input.tsx +++ b/packages/ui/src/fields/Relationship/Input.tsx @@ -59,7 +59,6 @@ export const RelationshipInput: React.FC = (props) => { onChange, path, placeholder, - populateDocumentTitleOnly, readOnly, relationTo, required, @@ -424,13 +423,9 @@ export const RelationshipInput: React.FC = (props) => { draft: true, limit: idsToLoad.length, locale, - // NOTE: Populate full document by default for backwards compatibility - // Only use select when populateDocumentTitleOnly is true - ...(populateDocumentTitleOnly === true && { - select: { - [fieldToSelect]: true, - }, - }), + select: { + [fieldToSelect]: true, + }, where: { id: { in: idsToLoad, diff --git a/packages/ui/src/fields/Relationship/index.tsx b/packages/ui/src/fields/Relationship/index.tsx index 38ce787d887..a4b4f6dd049 100644 --- a/packages/ui/src/fields/Relationship/index.tsx +++ b/packages/ui/src/fields/Relationship/index.tsx @@ -25,7 +25,6 @@ const RelationshipFieldComponent: RelationshipFieldClientComponent = (props) => description, isSortable = true, placeholder, - populateDocumentTitleOnly, sortOptions, } = {}, hasMany, @@ -206,7 +205,6 @@ const RelationshipFieldComponent: RelationshipFieldClientComponent = (props) => minRows={field?.minRows} path={path} placeholder={placeholder} - populateDocumentTitleOnly={populateDocumentTitleOnly} readOnly={readOnly || disabled} relationTo={relationTo} required={required} diff --git a/packages/ui/src/fields/Relationship/types.ts b/packages/ui/src/fields/Relationship/types.ts index ba2962b669c..98c7500cfb7 100644 --- a/packages/ui/src/fields/Relationship/types.ts +++ b/packages/ui/src/fields/Relationship/types.ts @@ -109,7 +109,6 @@ export type RelationshipInputProps = { readonly minRows?: number readonly path: string readonly placeholder?: LabelFunction | string - readonly populateDocumentTitleOnly?: boolean readonly readOnly?: boolean readonly relationTo: string[] readonly required?: boolean