fix(ui): disabledLocalStrategy.enableFields missing email/username fields (#11232)

When using `disabledLocalStrategy.enableFields`, it was impossible to
create a user from the admin panel because the username or email field
was missing.

![Screenshot 2025-02-17
133851](https://github.com/user-attachments/assets/f84ac74e-a3ce-4428-81b5-7135fc1cb917)

---------

Co-authored-by: Germán Jabloñski <43938777+GermanJablo@users.noreply.github.com>
This commit is contained in:
Dan Ribbens
2025-02-19 11:43:40 -05:00
committed by GitHub
parent 0651ae0727
commit 9fc1cd0d24
5 changed files with 43 additions and 40 deletions

View File

@@ -43,7 +43,6 @@ export const Auth: React.FC<Props> = (props) => {
const modified = useFormModified()
const { i18n, t } = useTranslation()
const { docPermissions, isEditing, isInitializing } = useDocumentInfo()
const {
config: {
routes: { api },
@@ -51,15 +50,11 @@ export const Auth: React.FC<Props> = (props) => {
},
} = useConfig()
const hasPermissionToUnlock: boolean = useMemo(() => {
const collection = permissions?.collections?.[collectionSlug]
const enableFields =
!disableLocalStrategy ||
(typeof disableLocalStrategy === 'object' && disableLocalStrategy.enableFields === true)
if (collection) {
return Boolean('unlock' in collection ? collection.unlock : undefined)
}
return false
}, [permissions, collectionSlug])
const disabled = readOnly || isInitializing
const apiKeyPermissions =
docPermissions?.fields === true ? true : docPermissions?.fields?.enableAPIKey
@@ -74,6 +69,16 @@ export const Auth: React.FC<Props> = (props) => {
const canReadApiKey = apiKeyPermissions === true || apiKeyPermissions?.read
const hasPermissionToUnlock: boolean = useMemo(() => {
const collection = permissions?.collections?.[collectionSlug]
if (collection) {
return Boolean('unlock' in collection ? collection.unlock : undefined)
}
return false
}, [permissions, collectionSlug])
const handleChangePassword = useCallback(
(showPasswordFields: boolean) => {
if (showPasswordFields) {
@@ -129,15 +134,13 @@ export const Auth: React.FC<Props> = (props) => {
}
}, [modified])
if (disableLocalStrategy && !useAPIKey) {
if (disableLocalStrategy && !enableFields && !useAPIKey) {
return null
}
const disabled = readOnly || isInitializing
return (
<div className={[baseClass, className].filter(Boolean).join(' ')}>
{!disableLocalStrategy && (
{enableFields && (
<React.Fragment>
<EmailAndUsernameFields
loginWithUsername={loginWithUsername}
@@ -146,7 +149,7 @@ export const Auth: React.FC<Props> = (props) => {
readOnly={readOnly}
t={t}
/>
{(changingPassword || requirePassword) && (
{(changingPassword || requirePassword) && (!disableLocalStrategy || !enableFields) && (
<div className={`${baseClass}__changing-password`}>
<PasswordField
autoComplete="new-password"
@@ -175,7 +178,7 @@ export const Auth: React.FC<Props> = (props) => {
{t('general:cancel')}
</Button>
)}
{!changingPassword && !requirePassword && (
{!changingPassword && !requirePassword && !disableLocalStrategy && (
<Button
buttonStyle="secondary"
disabled={disabled}

View File

@@ -9,7 +9,7 @@ import { devUser } from '../credentials.js'
import {
apiKeysSlug,
namedSaveToJWTValue,
partialDisableLocaleStrategiesSlug,
partialDisableLocalStrategiesSlug,
publicUsersSlug,
saveToJWTKey,
slug,
@@ -185,7 +185,7 @@ export default buildConfigWithDefaults({
],
},
{
slug: partialDisableLocaleStrategiesSlug,
slug: partialDisableLocalStrategiesSlug,
auth: {
disableLocalStrategy: {
// optionalPassword: true,

View File

@@ -12,7 +12,7 @@ import { initPayloadInt } from '../helpers/initPayloadInt.js'
import {
apiKeysSlug,
namedSaveToJWTValue,
partialDisableLocaleStrategiesSlug,
partialDisableLocalStrategiesSlug,
publicUsersSlug,
saveToJWTKey,
slug,
@@ -720,7 +720,7 @@ describe('Auth', () => {
it('should allow create of a user with disableLocalStrategy', async () => {
const email = 'test@example.com'
const user = await payload.create({
collection: partialDisableLocaleStrategiesSlug,
collection: partialDisableLocalStrategiesSlug,
data: {
email,
// password is not required
@@ -730,7 +730,7 @@ describe('Auth', () => {
})
it('should retain fields when auth.disableLocalStrategy.enableFields is true', () => {
const authFields = payload.collections[partialDisableLocaleStrategiesSlug].config.fields
const authFields = payload.collections[partialDisableLocalStrategiesSlug].config.fields
// eslint-disable-next-line jest/no-conditional-in-test
.filter((field) => 'name' in field && field.name)
.map((field) => (field as FieldAffectingData).name)
@@ -750,7 +750,7 @@ describe('Auth', () => {
it('should prevent login of user with disableLocalStrategy.', async () => {
await payload.create({
collection: partialDisableLocaleStrategiesSlug,
collection: partialDisableLocalStrategiesSlug,
data: {
email: devUser.email,
password: devUser.password,
@@ -759,7 +759,7 @@ describe('Auth', () => {
await expect(async () => {
await payload.login({
collection: partialDisableLocaleStrategiesSlug,
collection: partialDisableLocalStrategiesSlug,
data: {
email: devUser.email,
password: devUser.password,
@@ -769,7 +769,7 @@ describe('Auth', () => {
})
it('rest - should prevent login', async () => {
const response = await restClient.POST(`/${partialDisableLocaleStrategiesSlug}/login`, {
const response = await restClient.POST(`/${partialDisableLocalStrategiesSlug}/login`, {
body: JSON.stringify({
email,
password,

View File

@@ -63,14 +63,14 @@ export type SupportedTimezones =
export interface Config {
auth: {
users: UserAuthOperations;
'partial-disable-locale-strategies': PartialDisableLocaleStrategyAuthOperations;
'partial-disable-local-strategies': PartialDisableLocalStrategyAuthOperations;
'api-keys': ApiKeyAuthOperations;
'public-users': PublicUserAuthOperations;
};
blocks: {};
collections: {
users: User;
'partial-disable-locale-strategies': PartialDisableLocaleStrategy;
'partial-disable-local-strategies': PartialDisableLocalStrategy;
'api-keys': ApiKey;
'public-users': PublicUser;
relationsCollection: RelationsCollection;
@@ -81,7 +81,7 @@ export interface Config {
collectionsJoins: {};
collectionsSelect: {
users: UsersSelect<false> | UsersSelect<true>;
'partial-disable-locale-strategies': PartialDisableLocaleStrategiesSelect<false> | PartialDisableLocaleStrategiesSelect<true>;
'partial-disable-local-strategies': PartialDisableLocalStrategiesSelect<false> | PartialDisableLocalStrategiesSelect<true>;
'api-keys': ApiKeysSelect<false> | ApiKeysSelect<true>;
'public-users': PublicUsersSelect<false> | PublicUsersSelect<true>;
relationsCollection: RelationsCollectionSelect<false> | RelationsCollectionSelect<true>;
@@ -99,8 +99,8 @@ export interface Config {
| (User & {
collection: 'users';
})
| (PartialDisableLocaleStrategy & {
collection: 'partial-disable-locale-strategies';
| (PartialDisableLocalStrategy & {
collection: 'partial-disable-local-strategies';
})
| (ApiKey & {
collection: 'api-keys';
@@ -131,7 +131,7 @@ export interface UserAuthOperations {
password: string;
};
}
export interface PartialDisableLocaleStrategyAuthOperations {
export interface PartialDisableLocalStrategyAuthOperations {
forgotPassword: {
email: string;
password: string;
@@ -227,9 +227,9 @@ export interface User {
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "partial-disable-locale-strategies".
* via the `definition` "partial-disable-local-strategies".
*/
export interface PartialDisableLocaleStrategy {
export interface PartialDisableLocalStrategy {
id: string;
updatedAt: string;
createdAt: string;
@@ -296,8 +296,8 @@ export interface PayloadLockedDocument {
value: string | User;
} | null)
| ({
relationTo: 'partial-disable-locale-strategies';
value: string | PartialDisableLocaleStrategy;
relationTo: 'partial-disable-local-strategies';
value: string | PartialDisableLocalStrategy;
} | null)
| ({
relationTo: 'api-keys';
@@ -318,8 +318,8 @@ export interface PayloadLockedDocument {
value: string | User;
}
| {
relationTo: 'partial-disable-locale-strategies';
value: string | PartialDisableLocaleStrategy;
relationTo: 'partial-disable-local-strategies';
value: string | PartialDisableLocalStrategy;
}
| {
relationTo: 'api-keys';
@@ -344,8 +344,8 @@ export interface PayloadPreference {
value: string | User;
}
| {
relationTo: 'partial-disable-locale-strategies';
value: string | PartialDisableLocaleStrategy;
relationTo: 'partial-disable-local-strategies';
value: string | PartialDisableLocalStrategy;
}
| {
relationTo: 'api-keys';
@@ -427,9 +427,9 @@ export interface UsersSelect<T extends boolean = true> {
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "partial-disable-locale-strategies_select".
* via the `definition` "partial-disable-local-strategies_select".
*/
export interface PartialDisableLocaleStrategiesSelect<T extends boolean = true> {
export interface PartialDisableLocalStrategiesSelect<T extends boolean = true> {
updatedAt?: T;
createdAt?: T;
email?: T;

View File

@@ -4,7 +4,7 @@ export const publicUsersSlug = 'public-users'
export const apiKeysSlug = 'api-keys'
export const partialDisableLocaleStrategiesSlug = 'partial-disable-locale-strategies'
export const partialDisableLocalStrategiesSlug = 'partial-disable-local-strategies'
export const namedSaveToJWTValue = 'namedSaveToJWT value'