Skip to content

Commit 9fc1cd0

Browse files
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>
1 parent 0651ae0 commit 9fc1cd0

File tree

5 files changed

+43
-40
lines changed

5 files changed

+43
-40
lines changed

packages/ui/src/views/Edit/Auth/index.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,18 @@ export const Auth: React.FC<Props> = (props) => {
4343
const modified = useFormModified()
4444
const { i18n, t } = useTranslation()
4545
const { docPermissions, isEditing, isInitializing } = useDocumentInfo()
46-
4746
const {
4847
config: {
4948
routes: { api },
5049
serverURL,
5150
},
5251
} = useConfig()
5352

54-
const hasPermissionToUnlock: boolean = useMemo(() => {
55-
const collection = permissions?.collections?.[collectionSlug]
53+
const enableFields =
54+
!disableLocalStrategy ||
55+
(typeof disableLocalStrategy === 'object' && disableLocalStrategy.enableFields === true)
5656

57-
if (collection) {
58-
return Boolean('unlock' in collection ? collection.unlock : undefined)
59-
}
60-
61-
return false
62-
}, [permissions, collectionSlug])
57+
const disabled = readOnly || isInitializing
6358

6459
const apiKeyPermissions =
6560
docPermissions?.fields === true ? true : docPermissions?.fields?.enableAPIKey
@@ -74,6 +69,16 @@ export const Auth: React.FC<Props> = (props) => {
7469

7570
const canReadApiKey = apiKeyPermissions === true || apiKeyPermissions?.read
7671

72+
const hasPermissionToUnlock: boolean = useMemo(() => {
73+
const collection = permissions?.collections?.[collectionSlug]
74+
75+
if (collection) {
76+
return Boolean('unlock' in collection ? collection.unlock : undefined)
77+
}
78+
79+
return false
80+
}, [permissions, collectionSlug])
81+
7782
const handleChangePassword = useCallback(
7883
(showPasswordFields: boolean) => {
7984
if (showPasswordFields) {
@@ -129,15 +134,13 @@ export const Auth: React.FC<Props> = (props) => {
129134
}
130135
}, [modified])
131136

132-
if (disableLocalStrategy && !useAPIKey) {
137+
if (disableLocalStrategy && !enableFields && !useAPIKey) {
133138
return null
134139
}
135140

136-
const disabled = readOnly || isInitializing
137-
138141
return (
139142
<div className={[baseClass, className].filter(Boolean).join(' ')}>
140-
{!disableLocalStrategy && (
143+
{enableFields && (
141144
<React.Fragment>
142145
<EmailAndUsernameFields
143146
loginWithUsername={loginWithUsername}
@@ -146,7 +149,7 @@ export const Auth: React.FC<Props> = (props) => {
146149
readOnly={readOnly}
147150
t={t}
148151
/>
149-
{(changingPassword || requirePassword) && (
152+
{(changingPassword || requirePassword) && (!disableLocalStrategy || !enableFields) && (
150153
<div className={`${baseClass}__changing-password`}>
151154
<PasswordField
152155
autoComplete="new-password"
@@ -175,7 +178,7 @@ export const Auth: React.FC<Props> = (props) => {
175178
{t('general:cancel')}
176179
</Button>
177180
)}
178-
{!changingPassword && !requirePassword && (
181+
{!changingPassword && !requirePassword && !disableLocalStrategy && (
179182
<Button
180183
buttonStyle="secondary"
181184
disabled={disabled}

test/auth/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { devUser } from '../credentials.js'
99
import {
1010
apiKeysSlug,
1111
namedSaveToJWTValue,
12-
partialDisableLocaleStrategiesSlug,
12+
partialDisableLocalStrategiesSlug,
1313
publicUsersSlug,
1414
saveToJWTKey,
1515
slug,
@@ -185,7 +185,7 @@ export default buildConfigWithDefaults({
185185
],
186186
},
187187
{
188-
slug: partialDisableLocaleStrategiesSlug,
188+
slug: partialDisableLocalStrategiesSlug,
189189
auth: {
190190
disableLocalStrategy: {
191191
// optionalPassword: true,

test/auth/int.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { initPayloadInt } from '../helpers/initPayloadInt.js'
1212
import {
1313
apiKeysSlug,
1414
namedSaveToJWTValue,
15-
partialDisableLocaleStrategiesSlug,
15+
partialDisableLocalStrategiesSlug,
1616
publicUsersSlug,
1717
saveToJWTKey,
1818
slug,
@@ -720,7 +720,7 @@ describe('Auth', () => {
720720
it('should allow create of a user with disableLocalStrategy', async () => {
721721
const email = 'test@example.com'
722722
const user = await payload.create({
723-
collection: partialDisableLocaleStrategiesSlug,
723+
collection: partialDisableLocalStrategiesSlug,
724724
data: {
725725
email,
726726
// password is not required
@@ -730,7 +730,7 @@ describe('Auth', () => {
730730
})
731731

732732
it('should retain fields when auth.disableLocalStrategy.enableFields is true', () => {
733-
const authFields = payload.collections[partialDisableLocaleStrategiesSlug].config.fields
733+
const authFields = payload.collections[partialDisableLocalStrategiesSlug].config.fields
734734
// eslint-disable-next-line jest/no-conditional-in-test
735735
.filter((field) => 'name' in field && field.name)
736736
.map((field) => (field as FieldAffectingData).name)
@@ -750,7 +750,7 @@ describe('Auth', () => {
750750

751751
it('should prevent login of user with disableLocalStrategy.', async () => {
752752
await payload.create({
753-
collection: partialDisableLocaleStrategiesSlug,
753+
collection: partialDisableLocalStrategiesSlug,
754754
data: {
755755
email: devUser.email,
756756
password: devUser.password,
@@ -759,7 +759,7 @@ describe('Auth', () => {
759759

760760
await expect(async () => {
761761
await payload.login({
762-
collection: partialDisableLocaleStrategiesSlug,
762+
collection: partialDisableLocalStrategiesSlug,
763763
data: {
764764
email: devUser.email,
765765
password: devUser.password,
@@ -769,7 +769,7 @@ describe('Auth', () => {
769769
})
770770

771771
it('rest - should prevent login', async () => {
772-
const response = await restClient.POST(`/${partialDisableLocaleStrategiesSlug}/login`, {
772+
const response = await restClient.POST(`/${partialDisableLocalStrategiesSlug}/login`, {
773773
body: JSON.stringify({
774774
email,
775775
password,

test/auth/payload-types.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ export type SupportedTimezones =
6363
export interface Config {
6464
auth: {
6565
users: UserAuthOperations;
66-
'partial-disable-locale-strategies': PartialDisableLocaleStrategyAuthOperations;
66+
'partial-disable-local-strategies': PartialDisableLocalStrategyAuthOperations;
6767
'api-keys': ApiKeyAuthOperations;
6868
'public-users': PublicUserAuthOperations;
6969
};
7070
blocks: {};
7171
collections: {
7272
users: User;
73-
'partial-disable-locale-strategies': PartialDisableLocaleStrategy;
73+
'partial-disable-local-strategies': PartialDisableLocalStrategy;
7474
'api-keys': ApiKey;
7575
'public-users': PublicUser;
7676
relationsCollection: RelationsCollection;
@@ -81,7 +81,7 @@ export interface Config {
8181
collectionsJoins: {};
8282
collectionsSelect: {
8383
users: UsersSelect<false> | UsersSelect<true>;
84-
'partial-disable-locale-strategies': PartialDisableLocaleStrategiesSelect<false> | PartialDisableLocaleStrategiesSelect<true>;
84+
'partial-disable-local-strategies': PartialDisableLocalStrategiesSelect<false> | PartialDisableLocalStrategiesSelect<true>;
8585
'api-keys': ApiKeysSelect<false> | ApiKeysSelect<true>;
8686
'public-users': PublicUsersSelect<false> | PublicUsersSelect<true>;
8787
relationsCollection: RelationsCollectionSelect<false> | RelationsCollectionSelect<true>;
@@ -99,8 +99,8 @@ export interface Config {
9999
| (User & {
100100
collection: 'users';
101101
})
102-
| (PartialDisableLocaleStrategy & {
103-
collection: 'partial-disable-locale-strategies';
102+
| (PartialDisableLocalStrategy & {
103+
collection: 'partial-disable-local-strategies';
104104
})
105105
| (ApiKey & {
106106
collection: 'api-keys';
@@ -131,7 +131,7 @@ export interface UserAuthOperations {
131131
password: string;
132132
};
133133
}
134-
export interface PartialDisableLocaleStrategyAuthOperations {
134+
export interface PartialDisableLocalStrategyAuthOperations {
135135
forgotPassword: {
136136
email: string;
137137
password: string;
@@ -227,9 +227,9 @@ export interface User {
227227
}
228228
/**
229229
* This interface was referenced by `Config`'s JSON-Schema
230-
* via the `definition` "partial-disable-locale-strategies".
230+
* via the `definition` "partial-disable-local-strategies".
231231
*/
232-
export interface PartialDisableLocaleStrategy {
232+
export interface PartialDisableLocalStrategy {
233233
id: string;
234234
updatedAt: string;
235235
createdAt: string;
@@ -296,8 +296,8 @@ export interface PayloadLockedDocument {
296296
value: string | User;
297297
} | null)
298298
| ({
299-
relationTo: 'partial-disable-locale-strategies';
300-
value: string | PartialDisableLocaleStrategy;
299+
relationTo: 'partial-disable-local-strategies';
300+
value: string | PartialDisableLocalStrategy;
301301
} | null)
302302
| ({
303303
relationTo: 'api-keys';
@@ -318,8 +318,8 @@ export interface PayloadLockedDocument {
318318
value: string | User;
319319
}
320320
| {
321-
relationTo: 'partial-disable-locale-strategies';
322-
value: string | PartialDisableLocaleStrategy;
321+
relationTo: 'partial-disable-local-strategies';
322+
value: string | PartialDisableLocalStrategy;
323323
}
324324
| {
325325
relationTo: 'api-keys';
@@ -344,8 +344,8 @@ export interface PayloadPreference {
344344
value: string | User;
345345
}
346346
| {
347-
relationTo: 'partial-disable-locale-strategies';
348-
value: string | PartialDisableLocaleStrategy;
347+
relationTo: 'partial-disable-local-strategies';
348+
value: string | PartialDisableLocalStrategy;
349349
}
350350
| {
351351
relationTo: 'api-keys';
@@ -427,9 +427,9 @@ export interface UsersSelect<T extends boolean = true> {
427427
}
428428
/**
429429
* This interface was referenced by `Config`'s JSON-Schema
430-
* via the `definition` "partial-disable-locale-strategies_select".
430+
* via the `definition` "partial-disable-local-strategies_select".
431431
*/
432-
export interface PartialDisableLocaleStrategiesSelect<T extends boolean = true> {
432+
export interface PartialDisableLocalStrategiesSelect<T extends boolean = true> {
433433
updatedAt?: T;
434434
createdAt?: T;
435435
email?: T;

test/auth/shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export const publicUsersSlug = 'public-users'
44

55
export const apiKeysSlug = 'api-keys'
66

7-
export const partialDisableLocaleStrategiesSlug = 'partial-disable-locale-strategies'
7+
export const partialDisableLocalStrategiesSlug = 'partial-disable-local-strategies'
88

99
export const namedSaveToJWTValue = 'namedSaveToJWT value'
1010

0 commit comments

Comments
 (0)