fixes up remaining translation strings
This commit is contained in:
@@ -56,7 +56,7 @@ export const DefaultAccount: React.FC<DefaultAccountViewProps> = (props) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{/* <Meta description={t('accountOfCurrentUser')} keywords={t('account')} title={t('account')} /> */}
|
{/* <Meta description={i18n.t('authentication:accountOfCurrentUser')} keywords={t('authentication:account')} title={t('authentication:account')} /> */}
|
||||||
{/* <LoadingOverlayToggle name="account" show={isLoading} type="withoutNav" /> */}
|
{/* <LoadingOverlayToggle name="account" show={isLoading} type="withoutNav" /> */}
|
||||||
<OperationProvider operation="update">
|
<OperationProvider operation="update">
|
||||||
<Form
|
<Form
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ export const generateMetadata = async ({
|
|||||||
})
|
})
|
||||||
|
|
||||||
return meta({
|
return meta({
|
||||||
title: t('createFirstUser'),
|
title: t('authentication:createFirstUser'),
|
||||||
description: t('createFirstUser'),
|
description: t('authentication:createFirstUser'),
|
||||||
keywords: t('general:create'),
|
keywords: t('general:create'),
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
@@ -69,22 +69,19 @@ export const CreateFirstUser: React.FC<{
|
|||||||
const fields = [
|
const fields = [
|
||||||
{
|
{
|
||||||
name: 'email',
|
name: 'email',
|
||||||
label: 'Email Address',
|
label: t('general:emailAddress'),
|
||||||
// label: t('general:emailAddress'),
|
|
||||||
required: true,
|
required: true,
|
||||||
type: 'email',
|
type: 'email',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'password',
|
name: 'password',
|
||||||
label: 'Password',
|
label: t('general:password'),
|
||||||
// label: t('general:password'),
|
|
||||||
required: true,
|
required: true,
|
||||||
type: 'password',
|
type: 'password',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'confirm-password',
|
name: 'confirm-password',
|
||||||
label: 'Confirm Password',
|
label: t('authentication:confirmPassword'),
|
||||||
// label: t('confirmPassword'),
|
|
||||||
required: true,
|
required: true,
|
||||||
type: 'confirmPassword',
|
type: 'confirmPassword',
|
||||||
},
|
},
|
||||||
@@ -103,7 +100,7 @@ export const CreateFirstUser: React.FC<{
|
|||||||
return (
|
return (
|
||||||
<MinimalTemplate className={baseClass}>
|
<MinimalTemplate className={baseClass}>
|
||||||
<h1>{t('general:welcome')}</h1>
|
<h1>{t('general:welcome')}</h1>
|
||||||
<p>{t('beginCreateFirstUser')}</p>
|
<p>{t('authentication:beginCreateFirstUser')}</p>
|
||||||
<Form
|
<Form
|
||||||
action={`${serverURL}${api}/${userSlug}/first-register`}
|
action={`${serverURL}${api}/${userSlug}/first-register`}
|
||||||
method="POST"
|
method="POST"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {
|
|||||||
import type { EditViewProps } from '@payloadcms/ui'
|
import type { EditViewProps } from '@payloadcms/ui'
|
||||||
import queryString from 'qs'
|
import queryString from 'qs'
|
||||||
import { notFound } from 'next/navigation'
|
import { notFound } from 'next/navigation'
|
||||||
import { TFunction } from 'i18next'
|
import { TFunction } from '@payloadcms/translations'
|
||||||
import { AdminViewComponent } from 'payload/config'
|
import { AdminViewComponent } from 'payload/config'
|
||||||
import { getViewsFromConfig } from './getViewsFromConfig'
|
import { getViewsFromConfig } from './getViewsFromConfig'
|
||||||
import type { DocumentPermissions } from 'payload/types'
|
import type { DocumentPermissions } from 'payload/types'
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import { SanitizedConfig } from 'payload/types'
|
|||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import { initPage } from '../../utilities/initPage'
|
import { initPage } from '../../utilities/initPage'
|
||||||
import { meta } from '../../utilities/meta'
|
import { meta } from '../../utilities/meta'
|
||||||
import i18n from 'i18next'
|
|
||||||
import { Metadata } from 'next'
|
import { Metadata } from 'next'
|
||||||
|
import { getNextT } from '../../utilities/getNextT'
|
||||||
|
|
||||||
const baseClass = 'forgot-password'
|
const baseClass = 'forgot-password'
|
||||||
|
|
||||||
@@ -14,13 +14,18 @@ export const generateMetadata = async ({
|
|||||||
config,
|
config,
|
||||||
}: {
|
}: {
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
}): Promise<Metadata> =>
|
}): Promise<Metadata> => {
|
||||||
meta({
|
const t = getNextT({
|
||||||
title: i18n.t('forgotPassword'),
|
config: await config,
|
||||||
description: i18n.t('forgotPassword'),
|
})
|
||||||
keywords: i18n.t('forgotPassword'),
|
|
||||||
|
return meta({
|
||||||
|
title: t('authentication:forgotPassword'),
|
||||||
|
description: t('authentication:forgotPassword'),
|
||||||
|
keywords: t('authentication:forgotPassword'),
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const ForgotPassword: React.FC<{
|
export const ForgotPassword: React.FC<{
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
@@ -39,7 +44,7 @@ export const ForgotPassword: React.FC<{
|
|||||||
// setHasSubmitted(true)
|
// setHasSubmitted(true)
|
||||||
// },
|
// },
|
||||||
// () => {
|
// () => {
|
||||||
// toast.error(t('emailNotValid'))
|
// toast.error(i18n.t('authentication:emailNotValid'))
|
||||||
// },
|
// },
|
||||||
// )
|
// )
|
||||||
// }
|
// }
|
||||||
@@ -68,8 +73,8 @@ export const ForgotPassword: React.FC<{
|
|||||||
// if (hasSubmitted) {
|
// if (hasSubmitted) {
|
||||||
// return (
|
// return (
|
||||||
// <MinimalTemplate className={baseClass}>
|
// <MinimalTemplate className={baseClass}>
|
||||||
// <h1>{t('emailSent')}</h1>
|
// <h1>{i18n.t('authentication:emailSent')}</h1>
|
||||||
// <p>{t('checkYourEmailForPasswordReset')}</p>
|
// <p>{i18n.t('authentication:checkYourEmailForPasswordReset')}</p>
|
||||||
// </MinimalTemplate>
|
// </MinimalTemplate>
|
||||||
// )
|
// )
|
||||||
// }
|
// }
|
||||||
@@ -81,30 +86,17 @@ export const ForgotPassword: React.FC<{
|
|||||||
// handleResponse={handleResponse}
|
// handleResponse={handleResponse}
|
||||||
method="POST"
|
method="POST"
|
||||||
>
|
>
|
||||||
<h1>
|
<h1>{i18n.t('authentication:forgotPassword')}</h1>
|
||||||
Forgot Password
|
<p>{i18n.t('authentication:forgotPasswordEmailInstructions')}</p>
|
||||||
{/* {t('forgotPassword')} */}
|
|
||||||
</h1>
|
|
||||||
<p>
|
|
||||||
Enter your email address and we will send you a link to reset your password.
|
|
||||||
{/* {t('forgotPasswordEmailInstructions')} */}
|
|
||||||
</p>
|
|
||||||
<Email
|
<Email
|
||||||
admin={{ autoComplete: 'email' }}
|
admin={{ autoComplete: 'email' }}
|
||||||
label="Email Address"
|
label={i18n.t('general:emailAddress')}
|
||||||
// label={t('general:emailAddress')}
|
|
||||||
name="email"
|
name="email"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<FormSubmit>
|
<FormSubmit>{i18n.t('general:submit')}</FormSubmit>
|
||||||
Submit
|
|
||||||
{/* {t('general:submit')} */}
|
|
||||||
</FormSubmit>
|
|
||||||
</Form>
|
</Form>
|
||||||
<Link href={`${admin}/login`}>
|
<Link href={`${admin}/login`}>{i18n.t('authentication:backToLogin')}</Link>
|
||||||
Back to Login
|
|
||||||
{/* {t('backToLogin')} */}
|
|
||||||
</Link>
|
|
||||||
</MinimalTemplate>
|
</MinimalTemplate>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import React, { Fragment, useEffect } from 'react'
|
import React, { Fragment, useEffect } from 'react'
|
||||||
import { useAuth } from '../../../../ui/src/providers/Auth'
|
import { useAuth } from '../../../../ui/src/providers/Auth'
|
||||||
import { Button } from '@payloadcms/ui'
|
import { Button, useTranslation } from '@payloadcms/ui'
|
||||||
|
|
||||||
export const LogoutClient: React.FC<{
|
export const LogoutClient: React.FC<{
|
||||||
inactivity?: boolean
|
inactivity?: boolean
|
||||||
@@ -11,8 +11,8 @@ export const LogoutClient: React.FC<{
|
|||||||
const { inactivity, adminRoute, redirect } = props
|
const { inactivity, adminRoute, redirect } = props
|
||||||
|
|
||||||
const [isLoggingOut, setIsLoggingOut] = React.useState<boolean | undefined>(undefined)
|
const [isLoggingOut, setIsLoggingOut] = React.useState<boolean | undefined>(undefined)
|
||||||
const [hasLoggedOut, setHasLoggedOut] = React.useState<boolean | undefined>(undefined)
|
const { logOut } = useAuth()
|
||||||
const { logOut, user } = useAuth()
|
const { t } = useTranslation()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isLoggingOut) {
|
if (!isLoggingOut) {
|
||||||
@@ -24,18 +24,8 @@ export const LogoutClient: React.FC<{
|
|||||||
if (isLoggingOut) {
|
if (isLoggingOut) {
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
{inactivity && (
|
{inactivity && <h2>{t('authentication:loggedOutInactivity')}</h2>}
|
||||||
<h2>
|
{!inactivity && <h2>{t('authentication:loggedOutSuccessfully')}</h2>}
|
||||||
Logged Out Due To Inactivity
|
|
||||||
{/* {t('loggedOutInactivity')} */}
|
|
||||||
</h2>
|
|
||||||
)}
|
|
||||||
{!inactivity && (
|
|
||||||
<h2>
|
|
||||||
Logged Out Successfully
|
|
||||||
{/* {t('loggedOutSuccessfully')} */}
|
|
||||||
</h2>
|
|
||||||
)}
|
|
||||||
<Button
|
<Button
|
||||||
buttonStyle="secondary"
|
buttonStyle="secondary"
|
||||||
el="link"
|
el="link"
|
||||||
@@ -43,12 +33,12 @@ export const LogoutClient: React.FC<{
|
|||||||
redirect && redirect.length > 0 ? `?redirect=${encodeURIComponent(redirect)}` : ''
|
redirect && redirect.length > 0 ? `?redirect=${encodeURIComponent(redirect)}` : ''
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
Log Back In
|
{t('authentication:logBackIn')}
|
||||||
{/* {t('logBackIn')} */}
|
|
||||||
</Button>
|
</Button>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(i18n): needs translation in all languages
|
||||||
return <Fragment>Logging Out...</Fragment>
|
return <Fragment>Logging Out...</Fragment>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import React from 'react'
|
|||||||
import { MinimalTemplate, Button } from '@payloadcms/ui'
|
import { MinimalTemplate, Button } from '@payloadcms/ui'
|
||||||
import { meta } from '../../utilities/meta'
|
import { meta } from '../../utilities/meta'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
import i18n from 'i18next'
|
|
||||||
import { Metadata } from 'next'
|
import { Metadata } from 'next'
|
||||||
import { SanitizedConfig } from 'payload/types'
|
import { SanitizedConfig } from 'payload/types'
|
||||||
import { LogoutClient } from './LogoutClient'
|
import { LogoutClient } from './LogoutClient'
|
||||||
|
import { getNextT } from '../../utilities/getNextT'
|
||||||
|
|
||||||
const baseClass = 'logout'
|
const baseClass = 'logout'
|
||||||
|
|
||||||
@@ -14,13 +14,18 @@ export const generateMetadata = async ({
|
|||||||
config,
|
config,
|
||||||
}: {
|
}: {
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
}): Promise<Metadata> =>
|
}): Promise<Metadata> => {
|
||||||
meta({
|
const t = getNextT({
|
||||||
title: i18n.t('logout'),
|
config: await config,
|
||||||
description: `${i18n.t('logoutUser')}`,
|
})
|
||||||
keywords: `${i18n.t('logout')}`,
|
|
||||||
|
return meta({
|
||||||
|
title: t('authentication:logout'),
|
||||||
|
description: `${t('authentication:logoutUser')}`,
|
||||||
|
keywords: `${t('authentication:logout')}`,
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const Logout: React.FC<{
|
export const Logout: React.FC<{
|
||||||
inactivity?: boolean
|
inactivity?: boolean
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
import { Button, Gutter, useStepNav, useConfig } from '@payloadcms/ui'
|
import { Button, Gutter, useStepNav, useConfig, useTranslation } from '@payloadcms/ui'
|
||||||
// import Meta from '../../utilities/Meta'
|
// import Meta from '../../utilities/Meta'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ const NotFound: React.FC<{
|
|||||||
const { marginTop } = props
|
const { marginTop } = props
|
||||||
|
|
||||||
const { setStepNav } = useStepNav()
|
const { setStepNav } = useStepNav()
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
const {
|
const {
|
||||||
routes: { admin },
|
routes: { admin },
|
||||||
@@ -21,7 +22,7 @@ const NotFound: React.FC<{
|
|||||||
// useEffect(() => {
|
// useEffect(() => {
|
||||||
// setStepNav([
|
// setStepNav([
|
||||||
// {
|
// {
|
||||||
// label: t('notFound'),
|
// label: t('general:notFound'),
|
||||||
// },
|
// },
|
||||||
// ])
|
// ])
|
||||||
// }, [setStepNav, t])
|
// }, [setStepNav, t])
|
||||||
@@ -33,22 +34,15 @@ const NotFound: React.FC<{
|
|||||||
.join(' ')}
|
.join(' ')}
|
||||||
>
|
>
|
||||||
{/* <Meta
|
{/* <Meta
|
||||||
description={t('pageNotFound')}
|
description={t('general:pageNotFound')}
|
||||||
keywords={`404 ${t('notFound')}`}
|
keywords={`404 ${t('general:notFound')}`}
|
||||||
title={t('notFound')}
|
title={t('general:notFound')}
|
||||||
/> */}
|
/> */}
|
||||||
<Gutter className={`${baseClass}__wrap`}>
|
<Gutter className={`${baseClass}__wrap`}>
|
||||||
<h1>
|
<h1>{t('general:nothingFound')}</h1>
|
||||||
Nothing Found
|
<p>{t('general:sorryNotFound')}</p>
|
||||||
{/* {t('nothingFound')} */}
|
|
||||||
</h1>
|
|
||||||
<p>
|
|
||||||
Sorry, we couldn't find what you were looking for.
|
|
||||||
{/* {t('sorryNotFound')} */}
|
|
||||||
</p>
|
|
||||||
<Button className={`${baseClass}__button`} el="link" to={`${admin}`}>
|
<Button className={`${baseClass}__button`} el="link" to={`${admin}`}>
|
||||||
Back to Dashboard
|
{t('general:backToDashboard')}
|
||||||
{/* {t('backToDashboard')} */}
|
|
||||||
</Button>
|
</Button>
|
||||||
</Gutter>
|
</Gutter>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ import './index.scss'
|
|||||||
import { SanitizedConfig } from 'payload/types'
|
import { SanitizedConfig } from 'payload/types'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import { initPage } from '../../utilities/initPage'
|
import { initPage } from '../../utilities/initPage'
|
||||||
import i18n from 'i18next'
|
|
||||||
import { Metadata } from 'next'
|
import { Metadata } from 'next'
|
||||||
import { meta } from '../../utilities/meta'
|
import { meta } from '../../utilities/meta'
|
||||||
|
import { getNextT } from '../../utilities/getNextT'
|
||||||
|
|
||||||
const baseClass = 'reset-password'
|
const baseClass = 'reset-password'
|
||||||
|
|
||||||
@@ -24,19 +24,24 @@ export const generateMetadata = async ({
|
|||||||
config,
|
config,
|
||||||
}: {
|
}: {
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
}): Promise<Metadata> =>
|
}): Promise<Metadata> => {
|
||||||
meta({
|
const t = getNextT({
|
||||||
title: i18n.t('resetPassword'),
|
config: await config,
|
||||||
description: i18n.t('resetPassword'),
|
})
|
||||||
keywords: i18n.t('resetPassword'),
|
|
||||||
|
return meta({
|
||||||
|
title: t('authentication:resetPassword'),
|
||||||
|
description: t('authentication:resetPassword'),
|
||||||
|
keywords: t('authentication:resetPassword'),
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const ResetPassword: React.FC<{
|
export const ResetPassword: React.FC<{
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
token: string
|
token: string
|
||||||
}> = async ({ config: configPromise, token }) => {
|
}> = async ({ config: configPromise, token }) => {
|
||||||
const { config, user } = await initPage({ configPromise })
|
const { config, user, i18n } = await initPage({ configPromise })
|
||||||
|
|
||||||
const {
|
const {
|
||||||
admin: { logoutRoute, user: userSlug },
|
admin: { logoutRoute, user: userSlug },
|
||||||
@@ -50,7 +55,7 @@ export const ResetPassword: React.FC<{
|
|||||||
// history.push(`${admin}`)
|
// history.push(`${admin}`)
|
||||||
// } else {
|
// } else {
|
||||||
// history.push(`${admin}/login`)
|
// history.push(`${admin}/login`)
|
||||||
// toast.success(t('general:updatedSuccessfully'), { autoClose: 3000 })
|
// toast.success(i18n.t('general:updatedSuccessfully'), { autoClose: 3000 })
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -58,10 +63,7 @@ export const ResetPassword: React.FC<{
|
|||||||
return (
|
return (
|
||||||
<MinimalTemplate className={baseClass}>
|
<MinimalTemplate className={baseClass}>
|
||||||
<div className={`${baseClass}__wrap`}>
|
<div className={`${baseClass}__wrap`}>
|
||||||
<h1>
|
<h1>{i18n.t('authentication:alreadyLoggedIn')}</h1>
|
||||||
Already Logged In
|
|
||||||
{/* {t('alreadyLoggedIn')} */}
|
|
||||||
</h1>
|
|
||||||
<p>
|
<p>
|
||||||
<Translation
|
<Translation
|
||||||
t={i18n.t}
|
t={i18n.t}
|
||||||
@@ -73,8 +75,7 @@ export const ResetPassword: React.FC<{
|
|||||||
</p>
|
</p>
|
||||||
<br />
|
<br />
|
||||||
<Button buttonStyle="secondary" el="link" to={admin}>
|
<Button buttonStyle="secondary" el="link" to={admin}>
|
||||||
Back to Dashboard
|
{i18n.t('general:backToDashboard')}
|
||||||
{/* {t('general:backToDashboard')} */}
|
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</MinimalTemplate>
|
</MinimalTemplate>
|
||||||
@@ -84,8 +85,7 @@ export const ResetPassword: React.FC<{
|
|||||||
return (
|
return (
|
||||||
<MinimalTemplate className={baseClass}>
|
<MinimalTemplate className={baseClass}>
|
||||||
<div className={`${baseClass}__wrap`}>
|
<div className={`${baseClass}__wrap`}>
|
||||||
Reset Password
|
<h1>{i18n.t('authentication:resetPassword')}</h1>
|
||||||
{/* <h1>{t('resetPassword')}</h1> */}
|
|
||||||
<Form
|
<Form
|
||||||
action={`${serverURL}${api}/${userSlug}/reset-password`}
|
action={`${serverURL}${api}/${userSlug}/reset-password`}
|
||||||
method="POST"
|
method="POST"
|
||||||
@@ -94,17 +94,13 @@ export const ResetPassword: React.FC<{
|
|||||||
>
|
>
|
||||||
<Password
|
<Password
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
label="New Password"
|
label={i18n.t('authentication:newPassword')}
|
||||||
// label={t('newPassword')}
|
|
||||||
name="password"
|
name="password"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<ConfirmPassword />
|
<ConfirmPassword />
|
||||||
<HiddenInput name="token" value={token} />
|
<HiddenInput name="token" value={token} />
|
||||||
<FormSubmit>
|
<FormSubmit>{i18n.t('authentication:resetPassword')}</FormSubmit>
|
||||||
Reset Password
|
|
||||||
{/* {t('resetPassword')} */}
|
|
||||||
</FormSubmit>
|
|
||||||
</Form>
|
</Form>
|
||||||
</div>
|
</div>
|
||||||
</MinimalTemplate>
|
</MinimalTemplate>
|
||||||
|
|||||||
18
packages/next/src/pages/Unauthorized/UnauthorizedClient.tsx
Normal file
18
packages/next/src/pages/Unauthorized/UnauthorizedClient.tsx
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
'use client'
|
||||||
|
import React from 'react'
|
||||||
|
import { Button, useTranslation } from '@payloadcms/ui'
|
||||||
|
|
||||||
|
export const UnauthorizedClient: React.FC<{ logoutRoute: string }> = ({ logoutRoute }) => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h2>{t('error:unauthorized')}</h2>
|
||||||
|
<p>{t('error:notAllowedToAccessPage')}</p>
|
||||||
|
<br />
|
||||||
|
<Button el="link" to={logoutRoute}>
|
||||||
|
{t('authentication:logOut')}
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,22 +1,28 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
import { MinimalTemplate, Button } from '@payloadcms/ui'
|
import { MinimalTemplate } from '@payloadcms/ui'
|
||||||
import { SanitizedConfig } from 'payload/types'
|
import { SanitizedConfig } from 'payload/types'
|
||||||
import { meta } from '../../utilities/meta'
|
import { meta } from '../../utilities/meta'
|
||||||
import { Metadata } from 'next'
|
import { Metadata } from 'next'
|
||||||
import i18n from 'i18next'
|
import { getNextT } from '../../utilities/getNextT'
|
||||||
|
import { UnauthorizedClient } from './UnauthorizedClient'
|
||||||
|
|
||||||
export const generateMetadata = async ({
|
export const generateMetadata = async ({
|
||||||
config,
|
config,
|
||||||
}: {
|
}: {
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
}): Promise<Metadata> =>
|
}): Promise<Metadata> => {
|
||||||
meta({
|
const t = getNextT({
|
||||||
title: i18n.t('error:unauthorized'),
|
config: await config,
|
||||||
description: i18n.t('error:unauthorized'),
|
})
|
||||||
keywords: i18n.t('error:unauthorized'),
|
|
||||||
|
return meta({
|
||||||
|
title: t('error:unauthorized'),
|
||||||
|
description: t('error:unauthorized'),
|
||||||
|
keywords: t('error:unauthorized'),
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const Unauthorized: React.FC<{
|
export const Unauthorized: React.FC<{
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
@@ -30,19 +36,7 @@ export const Unauthorized: React.FC<{
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<MinimalTemplate className="unauthorized">
|
<MinimalTemplate className="unauthorized">
|
||||||
<h2>
|
<UnauthorizedClient logoutRoute={`${admin}${logoutRoute}`} />
|
||||||
Unauthorized
|
|
||||||
{/* {t('error:unauthorized')} */}
|
|
||||||
</h2>
|
|
||||||
<p>
|
|
||||||
Not Allowed
|
|
||||||
{/* {t('error:notAllowedToAccessPage')} */}
|
|
||||||
</p>
|
|
||||||
<br />
|
|
||||||
<Button el="link" to={`${admin}${logoutRoute}`}>
|
|
||||||
Log out
|
|
||||||
{/* {t('authentication:logOut')} */}
|
|
||||||
</Button>
|
|
||||||
</MinimalTemplate>
|
</MinimalTemplate>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import { initPage } from '../../utilities/initPage'
|
|||||||
import { SanitizedConfig } from 'payload/types'
|
import { SanitizedConfig } from 'payload/types'
|
||||||
import { redirect } from 'next/navigation'
|
import { redirect } from 'next/navigation'
|
||||||
import { Metadata } from 'next'
|
import { Metadata } from 'next'
|
||||||
import i18n from 'i18next'
|
|
||||||
import { meta } from '../../utilities/meta'
|
import { meta } from '../../utilities/meta'
|
||||||
|
import { getNextT } from '../../utilities/getNextT'
|
||||||
|
|
||||||
const baseClass = 'verify'
|
const baseClass = 'verify'
|
||||||
|
|
||||||
@@ -15,13 +15,18 @@ export const generateMetadata = async ({
|
|||||||
config,
|
config,
|
||||||
}: {
|
}: {
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
}): Promise<Metadata> =>
|
}): Promise<Metadata> => {
|
||||||
meta({
|
const t = getNextT({
|
||||||
description: i18n.t('verifyUser'),
|
config: await config,
|
||||||
keywords: i18n.t('verify'),
|
})
|
||||||
title: i18n.t('verify'),
|
|
||||||
|
return meta({
|
||||||
|
description: t('authentication:verifyUser'),
|
||||||
|
keywords: t('authentication:verify'),
|
||||||
|
title: t('authentication:verify'),
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const Verify: React.FC<{
|
export const Verify: React.FC<{
|
||||||
config: Promise<SanitizedConfig>
|
config: Promise<SanitizedConfig>
|
||||||
@@ -30,7 +35,7 @@ export const Verify: React.FC<{
|
|||||||
config: configPromise,
|
config: configPromise,
|
||||||
// token
|
// token
|
||||||
}) => {
|
}) => {
|
||||||
const { config, user } = await initPage({ configPromise })
|
const { config, user, i18n } = await initPage({ configPromise })
|
||||||
|
|
||||||
const {
|
const {
|
||||||
admin: { user: userSlug },
|
admin: { user: userSlug },
|
||||||
@@ -60,10 +65,9 @@ export const Verify: React.FC<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getText = () => {
|
const getText = () => {
|
||||||
return 'Verify'
|
if (verifyResult?.status === 200) return i18n.t('authentication:verifiedSuccessfully')
|
||||||
// if (verifyResult?.status === 200) return t('verifiedSuccessfully')
|
if (verifyResult?.status === 202) return i18n.t('authentication:alreadyActivated')
|
||||||
// if (verifyResult?.status === 202) return t('alreadyActivated')
|
return i18n.t('authentication:unableToVerify')
|
||||||
// return t('unableToVerify')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -74,8 +78,7 @@ export const Verify: React.FC<{
|
|||||||
<h2>{getText()}</h2>
|
<h2>{getText()}</h2>
|
||||||
{verifyResult?.status === 200 && (
|
{verifyResult?.status === 200 && (
|
||||||
<Button buttonStyle="secondary" el="link" to={`${adminRoute}/login`}>
|
<Button buttonStyle="secondary" el="link" to={`${adminRoute}/login`}>
|
||||||
Login
|
{i18n.t('authentication:login')}
|
||||||
{/* {t('login')} */}
|
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</MinimalTemplate>
|
</MinimalTemplate>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import fieldComponents from '../RenderFieldsToDiff/fields'
|
|||||||
import Restore from '../Restore'
|
import Restore from '../Restore'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
import { mostRecentVersionOption } from '../shared'
|
import { mostRecentVersionOption } from '../shared'
|
||||||
|
import { getTranslation } from '@payloadcms/translations'
|
||||||
|
|
||||||
const baseClass = 'view-version'
|
const baseClass = 'view-version'
|
||||||
|
|
||||||
@@ -52,8 +53,7 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
|
|||||||
docLabel = mostRecentDoc[useAsTitle]
|
docLabel = mostRecentDoc[useAsTitle]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
docLabel = 'Untitled'
|
docLabel = `[${i18n.t('general:untitled')}]`
|
||||||
// docLabel = `[${t('general:untitled')}]`
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
docLabel = mostRecentDoc.id
|
docLabel = mostRecentDoc.id
|
||||||
@@ -62,9 +62,7 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
|
|||||||
|
|
||||||
nav = [
|
nav = [
|
||||||
{
|
{
|
||||||
label:
|
label: getTranslation(collectionConfig.labels.plural, i18n),
|
||||||
typeof collectionConfig.labels.plural === 'string' ? collectionConfig.labels.plural : '', // TODO: fix this (see below)
|
|
||||||
// label: getTranslation(collectionConfig.labels.plural, i18n),
|
|
||||||
url: `${admin}/collections/${collectionConfig.slug}`,
|
url: `${admin}/collections/${collectionConfig.slug}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -139,10 +137,9 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
|
|||||||
<Gutter className={`${baseClass}__wrap`}>
|
<Gutter className={`${baseClass}__wrap`}>
|
||||||
<div className={`${baseClass}__header-wrap`}>
|
<div className={`${baseClass}__header-wrap`}>
|
||||||
<p className={`${baseClass}__created-at`}>
|
<p className={`${baseClass}__created-at`}>
|
||||||
Version Created On
|
{i18n.t('versionCreatedOn', {
|
||||||
{/* {t('versionCreatedOn', {
|
version: i18n.t(doc?.autosave ? 'autosavedVersion' : 'version'),
|
||||||
version: t(doc?.autosave ? 'autosavedVersion' : 'version'),
|
})}
|
||||||
})} */}
|
|
||||||
</p>
|
</p>
|
||||||
<header className={`${baseClass}__header`}>
|
<header className={`${baseClass}__header`}>
|
||||||
<h2>{formattedCreatedAt}</h2>
|
<h2>{formattedCreatedAt}</h2>
|
||||||
@@ -184,6 +181,9 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
|
|||||||
: []
|
: []
|
||||||
}
|
}
|
||||||
version={doc?.version}
|
version={doc?.version}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Gutter>
|
</Gutter>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
|
|||||||
locales,
|
locales,
|
||||||
permissions,
|
permissions,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
|
config,
|
||||||
}) => {
|
}) => {
|
||||||
const versionRowCount = Array.isArray(version) ? version.length : 0
|
const versionRowCount = Array.isArray(version) ? version.length : 0
|
||||||
const comparisonRowCount = Array.isArray(comparison) ? comparison.length : 0
|
const comparisonRowCount = Array.isArray(comparison) ? comparison.length : 0
|
||||||
@@ -30,8 +32,7 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
|
|||||||
{field.label && (
|
{field.label && (
|
||||||
<Label>
|
<Label>
|
||||||
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
||||||
{field.label}
|
{getTranslation(field.label, i18n)}
|
||||||
{/* {getTranslation(field.label, i18n)} */}
|
|
||||||
</Label>
|
</Label>
|
||||||
)}
|
)}
|
||||||
{maxRows > 0 && (
|
{maxRows > 0 && (
|
||||||
@@ -48,8 +49,7 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
|
|||||||
subFields = [
|
subFields = [
|
||||||
{
|
{
|
||||||
name: 'blockType',
|
name: 'blockType',
|
||||||
label: 'Block Type', // TODO: i18n
|
label: i18n.t('fields:blockType'),
|
||||||
// label: t('fields:blockType'),
|
|
||||||
type: 'text',
|
type: 'text',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@@ -86,6 +86,9 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
|
|||||||
)}
|
)}
|
||||||
locales={locales}
|
locales={locales}
|
||||||
version={versionRow}
|
version={versionRow}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -94,12 +97,11 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
|
|||||||
)}
|
)}
|
||||||
{maxRows === 0 && (
|
{maxRows === 0 && (
|
||||||
<div className={`${baseClass}__no-rows`}>
|
<div className={`${baseClass}__no-rows`}>
|
||||||
No rows found
|
{i18n.t('noRowsFound', {
|
||||||
{/* {t('noRowsFound', {
|
|
||||||
label: field.labels?.plural
|
label: field.labels?.plural
|
||||||
? getTranslation(field.labels?.plural, i18n)
|
? getTranslation(field.labels?.plural, i18n)
|
||||||
: t('general:rows'),
|
: i18n.t('general:rows'),
|
||||||
})} */}
|
})}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -19,17 +19,15 @@ const Nested: React.FC<Props & { field: FieldWithSubFields }> = ({
|
|||||||
locales,
|
locales,
|
||||||
permissions,
|
permissions,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
|
config,
|
||||||
}) => {
|
}) => {
|
||||||
// const { i18n } = useTranslation()
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={baseClass}>
|
<div className={baseClass}>
|
||||||
{field.label && (
|
{field.label && (
|
||||||
<Label>
|
<Label>
|
||||||
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
||||||
{field.label}
|
{getTranslation(field.label, i18n)}
|
||||||
// TODO(i18n)
|
|
||||||
{/* {getTranslation(field.label, i18n)} */}
|
|
||||||
</Label>
|
</Label>
|
||||||
)}
|
)}
|
||||||
<div
|
<div
|
||||||
@@ -44,6 +42,9 @@ const Nested: React.FC<Props & { field: FieldWithSubFields }> = ({
|
|||||||
fields={field.fields}
|
fields={field.fields}
|
||||||
locales={locales}
|
locales={locales}
|
||||||
version={version}
|
version={version}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
'use client'
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { getTranslation } from '@payloadcms/translations'
|
import { getTranslation } from '@payloadcms/translations'
|
||||||
import ReactDiffViewer from 'react-diff-viewer-continued'
|
import ReactDiffViewer from 'react-diff-viewer-continued'
|
||||||
import { useTranslation } from '@payloadcms/ui'
|
|
||||||
|
|
||||||
import type { RelationshipField, SanitizedCollectionConfig } from 'payload/types'
|
import type { RelationshipField, SanitizedCollectionConfig } from 'payload/types'
|
||||||
import type { Props } from '../types'
|
import type { Props } from '../types'
|
||||||
@@ -10,7 +8,6 @@ import type { Props } from '../types'
|
|||||||
import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/types'
|
import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/types'
|
||||||
import Label from '../../Label'
|
import Label from '../../Label'
|
||||||
import { diffStyles } from '../styles'
|
import { diffStyles } from '../styles'
|
||||||
import { useConfig, useLocale } from '@payloadcms/ui'
|
|
||||||
|
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
@@ -72,14 +69,13 @@ const Relationship: React.FC<Props & { field: RelationshipField }> = ({
|
|||||||
comparison,
|
comparison,
|
||||||
field,
|
field,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
|
locale,
|
||||||
|
config: { collections },
|
||||||
}) => {
|
}) => {
|
||||||
const { collections } = useConfig()
|
|
||||||
const { i18n, t } = useTranslation()
|
|
||||||
const { code: locale } = useLocale()
|
|
||||||
|
|
||||||
let placeholder = ''
|
let placeholder = ''
|
||||||
|
|
||||||
if (version === comparison) placeholder = `[${t('general:noValue')}]`
|
if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
|
||||||
|
|
||||||
let versionToRender = version
|
let versionToRender = version
|
||||||
let comparisonToRender = comparison
|
let comparisonToRender = comparison
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import type { i18n as Ii18n } from 'i18next'
|
import { getTranslation, I18n } from '@payloadcms/translations'
|
||||||
|
|
||||||
import { getTranslation } from '@payloadcms/translations'
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { DiffMethod } from 'react-diff-viewer-continued'
|
import { DiffMethod } from 'react-diff-viewer-continued'
|
||||||
|
|
||||||
@@ -34,31 +32,21 @@ const getOptionsToRender = (
|
|||||||
|
|
||||||
const getTranslatedOptions = (
|
const getTranslatedOptions = (
|
||||||
options: (OptionObject | string)[] | OptionObject | string,
|
options: (OptionObject | string)[] | OptionObject | string,
|
||||||
i18n: Ii18n,
|
i18n: I18n,
|
||||||
): string => {
|
): string => {
|
||||||
if (Array.isArray(options)) {
|
if (Array.isArray(options)) {
|
||||||
return (
|
return options
|
||||||
options
|
.map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n)))
|
||||||
// TODO: fix this
|
.join(', ')
|
||||||
// @ts-ignore-next-line
|
|
||||||
.map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n)))
|
|
||||||
.join(', ')
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
// TODO: fix this
|
|
||||||
// @ts-ignore-next-line
|
|
||||||
return typeof options === 'string' ? options : getTranslation(options.label, i18n)
|
return typeof options === 'string' ? options : getTranslation(options.label, i18n)
|
||||||
}
|
}
|
||||||
|
|
||||||
const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, version }) => {
|
const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, version, i18n }) => {
|
||||||
let placeholder = ''
|
let placeholder = ''
|
||||||
// const { i18n, t } = useTranslation('general')
|
|
||||||
const t = (key: string) => key // TODO
|
|
||||||
const i18n = {
|
|
||||||
options: {},
|
|
||||||
} as Ii18n // TODO
|
|
||||||
|
|
||||||
if (version === comparison) placeholder = `[${t('noValue')}]`
|
if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
|
||||||
|
|
||||||
const comparisonToRender =
|
const comparisonToRender =
|
||||||
typeof comparison !== 'undefined'
|
typeof comparison !== 'undefined'
|
||||||
@@ -73,8 +61,6 @@ const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, versio
|
|||||||
<div className={baseClass}>
|
<div className={baseClass}>
|
||||||
<Label>
|
<Label>
|
||||||
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
||||||
{/* TODO: fix this
|
|
||||||
@ts-ignore-next-line */}
|
|
||||||
{getTranslation(field.label, i18n)}
|
{getTranslation(field.label, i18n)}
|
||||||
</Label>
|
</Label>
|
||||||
<DiffViewer
|
<DiffViewer
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
|
|||||||
locales,
|
locales,
|
||||||
permissions,
|
permissions,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
|
config,
|
||||||
|
locale,
|
||||||
}) => (
|
}) => (
|
||||||
<div className={baseClass}>
|
<div className={baseClass}>
|
||||||
<div className={`${baseClass}__wrap`}>
|
<div className={`${baseClass}__wrap`}>
|
||||||
@@ -29,6 +32,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
|
|||||||
locales={locales}
|
locales={locales}
|
||||||
permissions={permissions}
|
permissions={permissions}
|
||||||
version={version?.[tab.name]}
|
version={version?.[tab.name]}
|
||||||
|
i18n={i18n}
|
||||||
|
config={config}
|
||||||
|
locale={locale}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -42,6 +48,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
|
|||||||
key={i}
|
key={i}
|
||||||
locales={locales}
|
locales={locales}
|
||||||
version={version}
|
version={version}
|
||||||
|
i18n={i18n}
|
||||||
|
config={config}
|
||||||
|
locale={locale}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -17,12 +17,11 @@ const Text: React.FC<Props> = ({
|
|||||||
isRichText = false,
|
isRichText = false,
|
||||||
locale,
|
locale,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
}) => {
|
}) => {
|
||||||
let placeholder = ''
|
let placeholder = ''
|
||||||
const t = (key: string) => key // TODO
|
|
||||||
const i18n = {} // TODO
|
|
||||||
|
|
||||||
if (version === comparison) placeholder = `[${t('noValue')}]`
|
if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
|
||||||
|
|
||||||
let versionToRender = version
|
let versionToRender = version
|
||||||
let comparisonToRender = comparison
|
let comparisonToRender = comparison
|
||||||
@@ -37,8 +36,7 @@ const Text: React.FC<Props> = ({
|
|||||||
<Label>
|
<Label>
|
||||||
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
|
||||||
{typeof field.label === 'string' ? field.label : '[field-label]' /* TODO */}
|
{typeof field.label === 'string' ? field.label : '[field-label]' /* TODO */}
|
||||||
// TODO(i18n)
|
{getTranslation(field.label, i18n)}
|
||||||
{/* {getTranslation(field.label, i18n)} */}
|
|
||||||
</Label>
|
</Label>
|
||||||
<DiffViewer
|
<DiffViewer
|
||||||
comparisonToRender={comparisonToRender}
|
comparisonToRender={comparisonToRender}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import type React from 'react'
|
|||||||
import type { DiffMethod } from 'react-diff-viewer-continued'
|
import type { DiffMethod } from 'react-diff-viewer-continued'
|
||||||
|
|
||||||
import type { FieldPermissions } from 'payload/auth'
|
import type { FieldPermissions } from 'payload/auth'
|
||||||
|
import type { I18n } from '@payloadcms/translations'
|
||||||
|
import { SanitizedConfig } from 'payload/types'
|
||||||
|
|
||||||
export type FieldComponents = Record<string, React.FC<Props>>
|
export type FieldComponents = Record<string, React.FC<Props>>
|
||||||
|
|
||||||
@@ -12,8 +14,10 @@ export type Props = {
|
|||||||
field: any
|
field: any
|
||||||
fieldComponents: FieldComponents
|
fieldComponents: FieldComponents
|
||||||
isRichText?: boolean
|
isRichText?: boolean
|
||||||
locale?: string
|
locale: string
|
||||||
locales?: string[]
|
locales?: string[]
|
||||||
permissions?: Record<string, FieldPermissions>
|
permissions?: Record<string, FieldPermissions>
|
||||||
version: any
|
version: any
|
||||||
|
i18n: I18n
|
||||||
|
config: SanitizedConfig
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
|
|||||||
fields,
|
fields,
|
||||||
locales,
|
locales,
|
||||||
version,
|
version,
|
||||||
|
i18n,
|
||||||
|
locale,
|
||||||
|
config,
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<div className={baseClass}>
|
<div className={baseClass}>
|
||||||
@@ -60,6 +63,8 @@ const RenderFieldsToDiff: React.FC<Props> = ({
|
|||||||
locales={locales}
|
locales={locales}
|
||||||
permissions={subFieldPermissions}
|
permissions={subFieldPermissions}
|
||||||
version={versionLocaleValue}
|
version={versionLocaleValue}
|
||||||
|
i18n={i18n}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -80,6 +85,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
|
|||||||
locales={locales}
|
locales={locales}
|
||||||
permissions={subFieldPermissions}
|
permissions={subFieldPermissions}
|
||||||
version={versionValue}
|
version={versionValue}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -96,6 +104,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
|
|||||||
key={i}
|
key={i}
|
||||||
locales={locales}
|
locales={locales}
|
||||||
version={version}
|
version={version}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -112,6 +123,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
|
|||||||
locales={locales}
|
locales={locales}
|
||||||
permissions={fieldPermissions}
|
permissions={fieldPermissions}
|
||||||
version={version}
|
version={version}
|
||||||
|
i18n={i18n}
|
||||||
|
locale={locale}
|
||||||
|
config={config}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import type { FieldPermissions } from 'payload/auth'
|
import type { FieldPermissions } from 'payload/auth'
|
||||||
import type { Field } from 'payload/types'
|
import type { Field, SanitizedConfig } from 'payload/types'
|
||||||
import type { FieldComponents } from './fields/types'
|
import type { FieldComponents } from './fields/types'
|
||||||
|
import type { I18n } from '@payloadcms/translations'
|
||||||
|
|
||||||
export type Props = {
|
export type Props = {
|
||||||
comparison: Record<string, any>
|
comparison: Record<string, any>
|
||||||
@@ -9,4 +10,7 @@ export type Props = {
|
|||||||
fields: Field[]
|
fields: Field[]
|
||||||
locales: string[]
|
locales: string[]
|
||||||
version: Record<string, any>
|
version: Record<string, any>
|
||||||
|
i18n: I18n
|
||||||
|
config: SanitizedConfig
|
||||||
|
locale: string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,13 @@ import {
|
|||||||
PerPage,
|
PerPage,
|
||||||
Table,
|
Table,
|
||||||
SetDocumentStepNav as SetStepNav,
|
SetDocumentStepNav as SetStepNav,
|
||||||
|
EditViewProps,
|
||||||
} from '@payloadcms/ui'
|
} from '@payloadcms/ui'
|
||||||
import { buildVersionColumns } from './columns'
|
import { buildVersionColumns } from './columns'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
import { EditViewProps } from '@payloadcms/ui'
|
|
||||||
import { notFound } from 'next/navigation'
|
import { notFound } from 'next/navigation'
|
||||||
|
import { getTranslation } from '@payloadcms/translations'
|
||||||
|
|
||||||
const baseClass = 'versions'
|
const baseClass = 'versions'
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
docURL = `${serverURL}${api}/${slug}/${id}`
|
docURL = `${serverURL}${api}/${slug}/${id}`
|
||||||
// entityLabel = getTranslation(collectionConfig.labels.singular, i18n)
|
entityLabel = getTranslation(collectionConfig.labels.singular, i18n)
|
||||||
editURL = `${admin}/collections/${collectionSlug}/${id}`
|
editURL = `${admin}/collections/${collectionSlug}/${id}`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
docURL = `${serverURL}${api}/globals/${globalSlug}`
|
docURL = `${serverURL}${api}/globals/${globalSlug}`
|
||||||
// entityLabel = getTranslation(globalConfig.label, i18n)
|
entityLabel = getTranslation(globalConfig.label, i18n)
|
||||||
editURL = `${admin}/globals/${globalSlug}`
|
editURL = `${admin}/globals/${globalSlug}`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,24 +109,28 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
|
|||||||
globalSlug={globalConfig?.slug}
|
globalSlug={globalConfig?.slug}
|
||||||
id={id}
|
id={id}
|
||||||
isEditing
|
isEditing
|
||||||
view="Versions" // TODO; i18n
|
|
||||||
pluralLabel={collectionConfig?.labels?.plural}
|
pluralLabel={collectionConfig?.labels?.plural}
|
||||||
// view={t('versions')}
|
view={i18n.t('version:versions')}
|
||||||
/>
|
/>
|
||||||
{/* <LoadingOverlayToggle name="versions" show={isLoadingVersions} /> */}
|
{/* <LoadingOverlayToggle name="versions" show={isLoadingVersions} /> */}
|
||||||
<main className={baseClass}>
|
<main className={baseClass}>
|
||||||
{/* <Meta description={metaDesc} title={metaTitle} /> */}
|
{/* <Meta description={metaDesc} title={metaTitle} /> */}
|
||||||
<Gutter className={`${baseClass}__wrap`}>
|
<Gutter className={`${baseClass}__wrap`}>
|
||||||
{versionCount === 0 && (
|
{versionCount === 0 && (
|
||||||
<div className={`${baseClass}__no-versions`}>{/* {t('noFurtherVersionsFound')} */}</div>
|
<div className={`${baseClass}__no-versions`}>
|
||||||
|
{i18n.t('version:noFurtherVersionsFound')}
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
{versionCount > 0 && (
|
{versionCount > 0 && (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{/* <div className={`${baseClass}__version-count`}>
|
<div className={`${baseClass}__version-count`}>
|
||||||
{t(versionCount === 1 ? 'versionCount_one' : 'versionCount_many', {
|
{i18n.t(
|
||||||
count: versionCount,
|
versionCount === 1 ? 'version:versionCount_one' : 'version:versionCount_many',
|
||||||
})}
|
{
|
||||||
</div> */}
|
count: versionCount,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<Table
|
<Table
|
||||||
columns={buildVersionColumns({
|
columns={buildVersionColumns({
|
||||||
config,
|
config,
|
||||||
@@ -154,7 +159,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
|
|||||||
{versionsData.totalPages > 1 && versionsData.totalPages !== versionsData.page
|
{versionsData.totalPages > 1 && versionsData.totalPages !== versionsData.page
|
||||||
? versionsData.limit * versionsData.page
|
? versionsData.limit * versionsData.page
|
||||||
: versionsData.totalDocs}{' '}
|
: versionsData.totalDocs}{' '}
|
||||||
{/* {t('of')} {versionsData.totalDocs} */}
|
{i18n.t('general:of')} {versionsData.totalDocs}
|
||||||
</div>
|
</div>
|
||||||
<PerPage
|
<PerPage
|
||||||
limit={limit ? Number(limit) : 10}
|
limit={limit ? Number(limit) : 10}
|
||||||
|
|||||||
@@ -181,15 +181,15 @@ const validateArrayLength: any = (
|
|||||||
if (!required && arrayLength === 0) return true
|
if (!required && arrayLength === 0) return true
|
||||||
|
|
||||||
if (minRows && arrayLength < minRows) {
|
if (minRows && arrayLength < minRows) {
|
||||||
return t('validation:requiresAtLeast', { count: minRows, label: t('rows') })
|
return t('validation:requiresAtLeast', { count: minRows, label: t('general:rows') })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxRows && arrayLength > maxRows) {
|
if (maxRows && arrayLength > maxRows) {
|
||||||
return t('validation:requiresNoMoreThan', { count: maxRows, label: t('rows') })
|
return t('validation:requiresNoMoreThan', { count: maxRows, label: t('general:rows') })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (required && !arrayLength) {
|
if (required && !arrayLength) {
|
||||||
return t('validation:requiresAtLeast', { count: 1, label: t('row') })
|
return t('validation:requiresAtLeast', { count: 1, label: t('general:row') })
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -218,11 +218,11 @@ export const number: Validate<unknown, unknown, NumberField> = (
|
|||||||
const numberValue = parseFloat(number as unknown as string)
|
const numberValue = parseFloat(number as unknown as string)
|
||||||
|
|
||||||
if (typeof max === 'number' && numberValue > max) {
|
if (typeof max === 'number' && numberValue > max) {
|
||||||
return t('validation:greaterThanMax', { label: t('value'), max, value })
|
return t('validation:greaterThanMax', { label: t('general:value'), max, value })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof min === 'number' && numberValue < min) {
|
if (typeof min === 'number' && numberValue < min) {
|
||||||
return t('validation:lessThanMin', { label: t('value'), min, value })
|
return t('validation:lessThanMin', { label: t('general:value'), min, value })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,11 +382,19 @@ export const relationship: Validate<unknown, unknown, RelationshipField> = async
|
|||||||
|
|
||||||
if (Array.isArray(value) && value.length > 0) {
|
if (Array.isArray(value) && value.length > 0) {
|
||||||
if (minRows && value.length < minRows) {
|
if (minRows && value.length < minRows) {
|
||||||
return t('validation:lessThanMin', { label: t('rows'), min: minRows, value: value.length })
|
return t('validation:lessThanMin', {
|
||||||
|
label: t('general:rows'),
|
||||||
|
min: minRows,
|
||||||
|
value: value.length,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxRows && value.length > maxRows) {
|
if (maxRows && value.length > maxRows) {
|
||||||
return t('validation:greaterThanMax', { label: t('rows'), max: maxRows, value: value.length })
|
return t('validation:greaterThanMax', {
|
||||||
|
label: t('general:rows'),
|
||||||
|
max: maxRows,
|
||||||
|
value: value.length,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,16 +74,12 @@ export const DocumentControls: React.FC<{
|
|||||||
{collectionConfig && !isEditing && !isAccountView && (
|
{collectionConfig && !isEditing && !isAccountView && (
|
||||||
<li className={`${baseClass}__list-item`}>
|
<li className={`${baseClass}__list-item`}>
|
||||||
<p className={`${baseClass}__value`}>
|
<p className={`${baseClass}__value`}>
|
||||||
Creating new{' '}
|
{i18n.t('creatingNewLabel', {
|
||||||
{typeof collectionConfig?.labels?.singular === 'string'
|
|
||||||
? collectionConfig.labels.singular
|
|
||||||
: 'Doc'}
|
|
||||||
{/* {t('creatingNewLabel', {
|
|
||||||
label:
|
label:
|
||||||
typeof collectionConfig?.labels?.singular === 'string'
|
typeof collectionConfig?.labels?.singular === 'string'
|
||||||
? collectionConfig.labels.singular
|
? collectionConfig.labels.singular
|
||||||
: 'document',
|
: 'document',
|
||||||
})} */}
|
})}
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
@@ -123,7 +119,7 @@ export const DocumentControls: React.FC<{
|
|||||||
data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : ''
|
data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : ''
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<p className={`${baseClass}__label`}>{/* {t('lastModified')}: */}</p>
|
<p className={`${baseClass}__label`}>{i18n.t('general:lastModified')}: </p>
|
||||||
{data?.updatedAt && (
|
{data?.updatedAt && (
|
||||||
<p className={`${baseClass}__value`}>
|
<p className={`${baseClass}__value`}>
|
||||||
{formatDate(data.updatedAt, dateFormat, i18n.language)}
|
{formatDate(data.updatedAt, dateFormat, i18n.language)}
|
||||||
@@ -138,7 +134,7 @@ export const DocumentControls: React.FC<{
|
|||||||
data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : ''
|
data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : ''
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<p className={`${baseClass}__label`}>{/* {t('created')}: */}</p>
|
<p className={`${baseClass}__label`}>{i18n.t('general:created')}: </p>
|
||||||
{data?.createdAt && (
|
{data?.createdAt && (
|
||||||
<p className={`${baseClass}__value`}>
|
<p className={`${baseClass}__value`}>
|
||||||
{formatDate(data?.createdAt, dateFormat, i18n.language)}
|
{formatDate(data?.createdAt, dateFormat, i18n.language)}
|
||||||
@@ -213,8 +209,7 @@ export const DocumentControls: React.FC<{
|
|||||||
id="action-create"
|
id="action-create"
|
||||||
to={`${adminRoute}/collections/${collectionConfig?.slug}/create`}
|
to={`${adminRoute}/collections/${collectionConfig?.slug}/create`}
|
||||||
>
|
>
|
||||||
Create New
|
{i18n.t('general:createNew')}
|
||||||
{/* {t('createNew')} */}
|
|
||||||
</PopupList.Button>
|
</PopupList.Button>
|
||||||
{!collectionConfig?.admin?.disableDuplicate && isEditing && (
|
{!collectionConfig?.admin?.disableDuplicate && isEditing && (
|
||||||
<DuplicateDocument
|
<DuplicateDocument
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
|
import { fieldAffectsData } from 'payload/types'
|
||||||
import type { Props } from './types'
|
import type { Props } from './types'
|
||||||
|
|
||||||
import { RenderCustomComponent } from '../../elements/RenderCustomComponent'
|
import { RenderCustomComponent } from '../../elements/RenderCustomComponent'
|
||||||
|
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
import { getTranslation } from '@payloadcms/translations'
|
||||||
|
|
||||||
const baseClass = 'render-fields'
|
const baseClass = 'render-fields'
|
||||||
|
|
||||||
const RenderFields: React.FC<Props> = (props) => {
|
const RenderFields: React.FC<Props> = (props) => {
|
||||||
const { className, fieldTypes, forceRender, margins, data, user, state } = props
|
const { className, fieldTypes, forceRender, margins, data, user, state, i18n } = props
|
||||||
|
|
||||||
if ('fields' in props) {
|
if ('fields' in props) {
|
||||||
|
if (!i18n) {
|
||||||
|
console.error('Need to implement i18n when calling RenderFields')
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={[
|
className={[
|
||||||
@@ -73,11 +79,13 @@ const RenderFields: React.FC<Props> = (props) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="missing-field" key={fieldIndex}>
|
<div className="missing-field" key={fieldIndex}>
|
||||||
{/* {t('error:noMatchedField', {
|
{i18n
|
||||||
label: fieldAffectsData(field)
|
? i18n.t('error:noMatchedField', {
|
||||||
? getTranslation(field.label || field.name, i18n)
|
label: fieldAffectsData(field)
|
||||||
: field.path,
|
? getTranslation(field.label || field.name, i18n)
|
||||||
})} */}
|
: field.path,
|
||||||
|
})
|
||||||
|
: 'Need to implement i18n when calling RenderFields'}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import type { Document, Field, FieldWithPath } from 'payload/types'
|
|||||||
import type { ReducedField } from './filterFields'
|
import type { ReducedField } from './filterFields'
|
||||||
import { Fields } from '../Form/types'
|
import { Fields } from '../Form/types'
|
||||||
import { FieldTypes } from 'payload/config'
|
import { FieldTypes } from 'payload/config'
|
||||||
|
import { I18n } from '@payloadcms/translations'
|
||||||
|
|
||||||
export type Props = {
|
export type Props = {
|
||||||
className?: string
|
className?: string
|
||||||
@@ -18,6 +19,7 @@ export type Props = {
|
|||||||
}
|
}
|
||||||
| FieldPermissions
|
| FieldPermissions
|
||||||
readOnly?: boolean
|
readOnly?: boolean
|
||||||
|
i18n?: I18n
|
||||||
} & (
|
} & (
|
||||||
| {
|
| {
|
||||||
// Fields to be filtered by the component
|
// Fields to be filtered by the component
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import Form from '../../forms/Form'
|
|||||||
import { OperationProvider } from '../../providers/OperationProvider'
|
import { OperationProvider } from '../../providers/OperationProvider'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
// import { getTranslation } from 'payload/utilities'
|
// import { getTranslation } from '@payloadcms/translations'
|
||||||
import { DocumentControls } from '../../elements/DocumentControls'
|
import { DocumentControls } from '../../elements/DocumentControls'
|
||||||
import { DocumentFields } from '../../elements/DocumentFields'
|
import { DocumentFields } from '../../elements/DocumentFields'
|
||||||
import { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving'
|
import { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving'
|
||||||
@@ -114,12 +114,12 @@ export const DefaultEditView: React.FC<EditViewProps> = async (props) => {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
{/* <Meta
|
{/* <Meta
|
||||||
description={`${isEditing ? t('editing') : t('creating')} - ${getTranslation(
|
description={`${isEditing ? t('general:editing') : t('general:creating')} - ${getTranslation(
|
||||||
collection.labels.singular,
|
collection.labels.singular,
|
||||||
i18n,
|
i18n,
|
||||||
)}`}
|
)}`}
|
||||||
keywords={`${getTranslation(collection.labels.singular, i18n)}, Payload, CMS`}
|
keywords={`${getTranslation(collection.labels.singular, i18n)}, Payload, CMS`}
|
||||||
title={`${isEditing ? t('editing') : t('creating')} - ${getTranslation(
|
title={`${isEditing ? t('general:editing') : t('general:creating')} - ${getTranslation(
|
||||||
collection.labels.singular,
|
collection.labels.singular,
|
||||||
i18n,
|
i18n,
|
||||||
)}`}
|
)}`}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
|
|||||||
useAsTitle,
|
useAsTitle,
|
||||||
} = {},
|
} = {},
|
||||||
fields,
|
fields,
|
||||||
labels: { plural: pluralLabel },
|
labels: { plural: pluralLabel, singular: singularLabel } = {},
|
||||||
slug: collectionSlug,
|
slug: collectionSlug,
|
||||||
},
|
},
|
||||||
customHeader,
|
customHeader,
|
||||||
@@ -104,15 +104,15 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
|
|||||||
{customHeader && customHeader}
|
{customHeader && customHeader}
|
||||||
{!customHeader && (
|
{!customHeader && (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<h1>{typeof pluralLabel === 'string' ? pluralLabel : pluralLabel['en']}</h1>
|
<h1>{getTranslation(pluralLabel, i18n)}</h1>
|
||||||
{/* <h1>{getTranslation(pluralLabel, i18n)}</h1> */}
|
|
||||||
{hasCreatePermission && (
|
{hasCreatePermission && (
|
||||||
<Pill
|
<Pill
|
||||||
// aria-label={t('createNewLabel', { label: getTranslation(singularLabel, i18n) })}
|
aria-label={i18n.t('general:createNewLabel', {
|
||||||
|
label: getTranslation(singularLabel, i18n),
|
||||||
|
})}
|
||||||
to={newDocumentURL}
|
to={newDocumentURL}
|
||||||
>
|
>
|
||||||
Create New
|
{i18n.t('general:createNew')}
|
||||||
{/* {t('createNew')} */}
|
|
||||||
</Pill>
|
</Pill>
|
||||||
)}
|
)}
|
||||||
{/* {!smallBreak && (
|
{/* {!smallBreak && (
|
||||||
@@ -152,11 +152,10 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
|
|||||||
)}
|
)}
|
||||||
{data.docs && data.docs.length === 0 && (
|
{data.docs && data.docs.length === 0 && (
|
||||||
<div className={`${baseClass}__no-results`}>
|
<div className={`${baseClass}__no-results`}>
|
||||||
{/* <p>{t('noResults', { label: getTranslation(pluralLabel, i18n) })}</p> */}
|
<p>{i18n.t('general:noResults', { label: getTranslation(pluralLabel, i18n) })}</p>
|
||||||
{hasCreatePermission && newDocumentURL && (
|
{hasCreatePermission && newDocumentURL && (
|
||||||
<Button el="link" to={newDocumentURL}>
|
<Button el="link" to={newDocumentURL}>
|
||||||
Create New
|
{i18n.t('general:createNewLabel', { label: getTranslation(singularLabel, i18n) })}
|
||||||
{/* {t('createNewLabel', { label: getTranslation(singularLabel, i18n) })} */}
|
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -184,7 +183,7 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
|
|||||||
{data.totalPages > 1 && data.totalPages !== data.page
|
{data.totalPages > 1 && data.totalPages !== data.page
|
||||||
? data.limit * data.page
|
? data.limit * data.page
|
||||||
: data.totalDocs}{' '}
|
: data.totalDocs}{' '}
|
||||||
{/* {t('of')} {data.totalDocs} */}
|
{i18n.t('general:of')} {data.totalDocs}
|
||||||
</div>
|
</div>
|
||||||
<PerPage
|
<PerPage
|
||||||
handleChange={handlePerPageChange}
|
handleChange={handlePerPageChange}
|
||||||
|
|||||||
Reference in New Issue
Block a user