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.  --------- Co-authored-by: Germán Jabloñski <43938777+GermanJablo@users.noreply.github.com>
This commit is contained in:
@@ -43,7 +43,6 @@ export const Auth: React.FC<Props> = (props) => {
|
|||||||
const modified = useFormModified()
|
const modified = useFormModified()
|
||||||
const { i18n, t } = useTranslation()
|
const { i18n, t } = useTranslation()
|
||||||
const { docPermissions, isEditing, isInitializing } = useDocumentInfo()
|
const { docPermissions, isEditing, isInitializing } = useDocumentInfo()
|
||||||
|
|
||||||
const {
|
const {
|
||||||
config: {
|
config: {
|
||||||
routes: { api },
|
routes: { api },
|
||||||
@@ -51,15 +50,11 @@ export const Auth: React.FC<Props> = (props) => {
|
|||||||
},
|
},
|
||||||
} = useConfig()
|
} = useConfig()
|
||||||
|
|
||||||
const hasPermissionToUnlock: boolean = useMemo(() => {
|
const enableFields =
|
||||||
const collection = permissions?.collections?.[collectionSlug]
|
!disableLocalStrategy ||
|
||||||
|
(typeof disableLocalStrategy === 'object' && disableLocalStrategy.enableFields === true)
|
||||||
|
|
||||||
if (collection) {
|
const disabled = readOnly || isInitializing
|
||||||
return Boolean('unlock' in collection ? collection.unlock : undefined)
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}, [permissions, collectionSlug])
|
|
||||||
|
|
||||||
const apiKeyPermissions =
|
const apiKeyPermissions =
|
||||||
docPermissions?.fields === true ? true : docPermissions?.fields?.enableAPIKey
|
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 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(
|
const handleChangePassword = useCallback(
|
||||||
(showPasswordFields: boolean) => {
|
(showPasswordFields: boolean) => {
|
||||||
if (showPasswordFields) {
|
if (showPasswordFields) {
|
||||||
@@ -129,15 +134,13 @@ export const Auth: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
}, [modified])
|
}, [modified])
|
||||||
|
|
||||||
if (disableLocalStrategy && !useAPIKey) {
|
if (disableLocalStrategy && !enableFields && !useAPIKey) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const disabled = readOnly || isInitializing
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={[baseClass, className].filter(Boolean).join(' ')}>
|
<div className={[baseClass, className].filter(Boolean).join(' ')}>
|
||||||
{!disableLocalStrategy && (
|
{enableFields && (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<EmailAndUsernameFields
|
<EmailAndUsernameFields
|
||||||
loginWithUsername={loginWithUsername}
|
loginWithUsername={loginWithUsername}
|
||||||
@@ -146,7 +149,7 @@ export const Auth: React.FC<Props> = (props) => {
|
|||||||
readOnly={readOnly}
|
readOnly={readOnly}
|
||||||
t={t}
|
t={t}
|
||||||
/>
|
/>
|
||||||
{(changingPassword || requirePassword) && (
|
{(changingPassword || requirePassword) && (!disableLocalStrategy || !enableFields) && (
|
||||||
<div className={`${baseClass}__changing-password`}>
|
<div className={`${baseClass}__changing-password`}>
|
||||||
<PasswordField
|
<PasswordField
|
||||||
autoComplete="new-password"
|
autoComplete="new-password"
|
||||||
@@ -175,7 +178,7 @@ export const Auth: React.FC<Props> = (props) => {
|
|||||||
{t('general:cancel')}
|
{t('general:cancel')}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
{!changingPassword && !requirePassword && (
|
{!changingPassword && !requirePassword && !disableLocalStrategy && (
|
||||||
<Button
|
<Button
|
||||||
buttonStyle="secondary"
|
buttonStyle="secondary"
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { devUser } from '../credentials.js'
|
|||||||
import {
|
import {
|
||||||
apiKeysSlug,
|
apiKeysSlug,
|
||||||
namedSaveToJWTValue,
|
namedSaveToJWTValue,
|
||||||
partialDisableLocaleStrategiesSlug,
|
partialDisableLocalStrategiesSlug,
|
||||||
publicUsersSlug,
|
publicUsersSlug,
|
||||||
saveToJWTKey,
|
saveToJWTKey,
|
||||||
slug,
|
slug,
|
||||||
@@ -185,7 +185,7 @@ export default buildConfigWithDefaults({
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: partialDisableLocaleStrategiesSlug,
|
slug: partialDisableLocalStrategiesSlug,
|
||||||
auth: {
|
auth: {
|
||||||
disableLocalStrategy: {
|
disableLocalStrategy: {
|
||||||
// optionalPassword: true,
|
// optionalPassword: true,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { initPayloadInt } from '../helpers/initPayloadInt.js'
|
|||||||
import {
|
import {
|
||||||
apiKeysSlug,
|
apiKeysSlug,
|
||||||
namedSaveToJWTValue,
|
namedSaveToJWTValue,
|
||||||
partialDisableLocaleStrategiesSlug,
|
partialDisableLocalStrategiesSlug,
|
||||||
publicUsersSlug,
|
publicUsersSlug,
|
||||||
saveToJWTKey,
|
saveToJWTKey,
|
||||||
slug,
|
slug,
|
||||||
@@ -720,7 +720,7 @@ describe('Auth', () => {
|
|||||||
it('should allow create of a user with disableLocalStrategy', async () => {
|
it('should allow create of a user with disableLocalStrategy', async () => {
|
||||||
const email = 'test@example.com'
|
const email = 'test@example.com'
|
||||||
const user = await payload.create({
|
const user = await payload.create({
|
||||||
collection: partialDisableLocaleStrategiesSlug,
|
collection: partialDisableLocalStrategiesSlug,
|
||||||
data: {
|
data: {
|
||||||
email,
|
email,
|
||||||
// password is not required
|
// password is not required
|
||||||
@@ -730,7 +730,7 @@ describe('Auth', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('should retain fields when auth.disableLocalStrategy.enableFields is true', () => {
|
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
|
// eslint-disable-next-line jest/no-conditional-in-test
|
||||||
.filter((field) => 'name' in field && field.name)
|
.filter((field) => 'name' in field && field.name)
|
||||||
.map((field) => (field as FieldAffectingData).name)
|
.map((field) => (field as FieldAffectingData).name)
|
||||||
@@ -750,7 +750,7 @@ describe('Auth', () => {
|
|||||||
|
|
||||||
it('should prevent login of user with disableLocalStrategy.', async () => {
|
it('should prevent login of user with disableLocalStrategy.', async () => {
|
||||||
await payload.create({
|
await payload.create({
|
||||||
collection: partialDisableLocaleStrategiesSlug,
|
collection: partialDisableLocalStrategiesSlug,
|
||||||
data: {
|
data: {
|
||||||
email: devUser.email,
|
email: devUser.email,
|
||||||
password: devUser.password,
|
password: devUser.password,
|
||||||
@@ -759,7 +759,7 @@ describe('Auth', () => {
|
|||||||
|
|
||||||
await expect(async () => {
|
await expect(async () => {
|
||||||
await payload.login({
|
await payload.login({
|
||||||
collection: partialDisableLocaleStrategiesSlug,
|
collection: partialDisableLocalStrategiesSlug,
|
||||||
data: {
|
data: {
|
||||||
email: devUser.email,
|
email: devUser.email,
|
||||||
password: devUser.password,
|
password: devUser.password,
|
||||||
@@ -769,7 +769,7 @@ describe('Auth', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('rest - should prevent login', async () => {
|
it('rest - should prevent login', async () => {
|
||||||
const response = await restClient.POST(`/${partialDisableLocaleStrategiesSlug}/login`, {
|
const response = await restClient.POST(`/${partialDisableLocalStrategiesSlug}/login`, {
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
email,
|
email,
|
||||||
password,
|
password,
|
||||||
|
|||||||
@@ -63,14 +63,14 @@ export type SupportedTimezones =
|
|||||||
export interface Config {
|
export interface Config {
|
||||||
auth: {
|
auth: {
|
||||||
users: UserAuthOperations;
|
users: UserAuthOperations;
|
||||||
'partial-disable-locale-strategies': PartialDisableLocaleStrategyAuthOperations;
|
'partial-disable-local-strategies': PartialDisableLocalStrategyAuthOperations;
|
||||||
'api-keys': ApiKeyAuthOperations;
|
'api-keys': ApiKeyAuthOperations;
|
||||||
'public-users': PublicUserAuthOperations;
|
'public-users': PublicUserAuthOperations;
|
||||||
};
|
};
|
||||||
blocks: {};
|
blocks: {};
|
||||||
collections: {
|
collections: {
|
||||||
users: User;
|
users: User;
|
||||||
'partial-disable-locale-strategies': PartialDisableLocaleStrategy;
|
'partial-disable-local-strategies': PartialDisableLocalStrategy;
|
||||||
'api-keys': ApiKey;
|
'api-keys': ApiKey;
|
||||||
'public-users': PublicUser;
|
'public-users': PublicUser;
|
||||||
relationsCollection: RelationsCollection;
|
relationsCollection: RelationsCollection;
|
||||||
@@ -81,7 +81,7 @@ export interface Config {
|
|||||||
collectionsJoins: {};
|
collectionsJoins: {};
|
||||||
collectionsSelect: {
|
collectionsSelect: {
|
||||||
users: UsersSelect<false> | UsersSelect<true>;
|
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>;
|
'api-keys': ApiKeysSelect<false> | ApiKeysSelect<true>;
|
||||||
'public-users': PublicUsersSelect<false> | PublicUsersSelect<true>;
|
'public-users': PublicUsersSelect<false> | PublicUsersSelect<true>;
|
||||||
relationsCollection: RelationsCollectionSelect<false> | RelationsCollectionSelect<true>;
|
relationsCollection: RelationsCollectionSelect<false> | RelationsCollectionSelect<true>;
|
||||||
@@ -99,8 +99,8 @@ export interface Config {
|
|||||||
| (User & {
|
| (User & {
|
||||||
collection: 'users';
|
collection: 'users';
|
||||||
})
|
})
|
||||||
| (PartialDisableLocaleStrategy & {
|
| (PartialDisableLocalStrategy & {
|
||||||
collection: 'partial-disable-locale-strategies';
|
collection: 'partial-disable-local-strategies';
|
||||||
})
|
})
|
||||||
| (ApiKey & {
|
| (ApiKey & {
|
||||||
collection: 'api-keys';
|
collection: 'api-keys';
|
||||||
@@ -131,7 +131,7 @@ export interface UserAuthOperations {
|
|||||||
password: string;
|
password: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface PartialDisableLocaleStrategyAuthOperations {
|
export interface PartialDisableLocalStrategyAuthOperations {
|
||||||
forgotPassword: {
|
forgotPassword: {
|
||||||
email: string;
|
email: string;
|
||||||
password: string;
|
password: string;
|
||||||
@@ -227,9 +227,9 @@ export interface User {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* 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;
|
id: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
@@ -296,8 +296,8 @@ export interface PayloadLockedDocument {
|
|||||||
value: string | User;
|
value: string | User;
|
||||||
} | null)
|
} | null)
|
||||||
| ({
|
| ({
|
||||||
relationTo: 'partial-disable-locale-strategies';
|
relationTo: 'partial-disable-local-strategies';
|
||||||
value: string | PartialDisableLocaleStrategy;
|
value: string | PartialDisableLocalStrategy;
|
||||||
} | null)
|
} | null)
|
||||||
| ({
|
| ({
|
||||||
relationTo: 'api-keys';
|
relationTo: 'api-keys';
|
||||||
@@ -318,8 +318,8 @@ export interface PayloadLockedDocument {
|
|||||||
value: string | User;
|
value: string | User;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
relationTo: 'partial-disable-locale-strategies';
|
relationTo: 'partial-disable-local-strategies';
|
||||||
value: string | PartialDisableLocaleStrategy;
|
value: string | PartialDisableLocalStrategy;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
relationTo: 'api-keys';
|
relationTo: 'api-keys';
|
||||||
@@ -344,8 +344,8 @@ export interface PayloadPreference {
|
|||||||
value: string | User;
|
value: string | User;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
relationTo: 'partial-disable-locale-strategies';
|
relationTo: 'partial-disable-local-strategies';
|
||||||
value: string | PartialDisableLocaleStrategy;
|
value: string | PartialDisableLocalStrategy;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
relationTo: 'api-keys';
|
relationTo: 'api-keys';
|
||||||
@@ -427,9 +427,9 @@ export interface UsersSelect<T extends boolean = true> {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* This interface was referenced by `Config`'s JSON-Schema
|
* 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;
|
updatedAt?: T;
|
||||||
createdAt?: T;
|
createdAt?: T;
|
||||||
email?: T;
|
email?: T;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ export const publicUsersSlug = 'public-users'
|
|||||||
|
|
||||||
export const apiKeysSlug = 'api-keys'
|
export const apiKeysSlug = 'api-keys'
|
||||||
|
|
||||||
export const partialDisableLocaleStrategiesSlug = 'partial-disable-locale-strategies'
|
export const partialDisableLocalStrategiesSlug = 'partial-disable-local-strategies'
|
||||||
|
|
||||||
export const namedSaveToJWTValue = 'namedSaveToJWT value'
|
export const namedSaveToJWTValue = 'namedSaveToJWT value'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user