From 3b4ef697f90dcec193862ef20b1d76ef18c384fa Mon Sep 17 00:00:00 2001 From: naaa760 Date: Fri, 3 Apr 2026 17:03:30 +0530 Subject: [PATCH] fix(payload): validate virtual useAsTitle when auth is enabled --- .../src/collections/config/useAsTitle.spec.ts | 27 +++++++++++++++ .../src/collections/config/useAsTitle.ts | 34 ++++++++----------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/packages/payload/src/collections/config/useAsTitle.spec.ts b/packages/payload/src/collections/config/useAsTitle.spec.ts index d77fe1c7e9f..b6327072a4b 100644 --- a/packages/payload/src/collections/config/useAsTitle.spec.ts +++ b/packages/payload/src/collections/config/useAsTitle.spec.ts @@ -201,5 +201,32 @@ describe('sanitize - collections -', () => { ) }).rejects.toThrow(InvalidConfiguration) }) + + it('should throw when useAsTitle is a virtual field (boolean) and auth is enabled', async () => { + const collectionConfig: CollectionConfig = { + ...defaultCollection, + auth: true, + fields: [ + { + name: 'name', + type: 'text', + virtual: true, + }, + ], + admin: { + useAsTitle: 'name', + }, + } + await expect(async () => { + await sanitizeCollection( + // @ts-expect-error + { + ...config, + collections: [collectionConfig], + }, + collectionConfig, + ) + }).rejects.toThrow(InvalidConfiguration) + }) }) }) diff --git a/packages/payload/src/collections/config/useAsTitle.ts b/packages/payload/src/collections/config/useAsTitle.ts index f2feefed5ac..18211d46199 100644 --- a/packages/payload/src/collections/config/useAsTitle.ts +++ b/packages/payload/src/collections/config/useAsTitle.ts @@ -23,26 +23,20 @@ export const validateUseAsTitle = (config: CollectionConfig) => { return false }) - // If auth is enabled then we don't need to - if (config.auth) { - if (config.admin.useAsTitle !== 'email') { - if (!useAsTitleField) { - throw new InvalidConfiguration( - `The field "${config.admin.useAsTitle}" specified in "admin.useAsTitle" does not exist in the collection "${config.slug}"`, - ) - } - } - } else { - if (useAsTitleField && 'virtual' in useAsTitleField && useAsTitleField.virtual === true) { - throw new InvalidConfiguration( - `The field "${config.admin.useAsTitle}" specified in "admin.useAsTitle" in the collection "${config.slug}" is virtual. A virtual field can be used as the title only when linked to a relationship field.`, - ) - } - if (!useAsTitleField) { - throw new InvalidConfiguration( - `The field "${config.admin.useAsTitle}" specified in "admin.useAsTitle" does not exist in the collection "${config.slug}"`, - ) - } + if (config.auth && config.admin.useAsTitle === 'email') { + return + } + + if (!useAsTitleField) { + throw new InvalidConfiguration( + `The field "${config.admin.useAsTitle}" specified in "admin.useAsTitle" does not exist in the collection "${config.slug}"`, + ) + } + + if ('virtual' in useAsTitleField && useAsTitleField.virtual === true) { + throw new InvalidConfiguration( + `The field "${config.admin.useAsTitle}" specified in "admin.useAsTitle" in the collection "${config.slug}" is virtual. A virtual field can be used as the title only when linked to a relationship field.`, + ) } } }