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 { 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}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user