docs: automatic custom component detection (#6939)
This commit is contained in:
@@ -12,7 +12,7 @@ All Custom Components in Payload are [React Server Components](https://react.dev
|
|||||||
|
|
||||||
<Banner type="success">
|
<Banner type="success">
|
||||||
<strong>Note:</strong>
|
<strong>Note:</strong>
|
||||||
Client Components continue to be fully supported. To use Client Components in your app, simply import them into a Server Component and render them. Ensure your Client Component includes the `use client` directive and that any [non-serializable props](https://react.dev/reference/rsc/use-client#serializable-types) are sanitized. [More details](#client-components).
|
Client Components continue to be fully supported. To use Client Components in your app, simply include the `use client` directive. Payload will automatically detect and remove all default [non-serializable props](https://react.dev/reference/rsc/use-client#serializable-types) before rendering your component. [More details](#client-components).
|
||||||
</Banner>
|
</Banner>
|
||||||
|
|
||||||
To swap in your own Custom Component, consult the list of available components below. Determine the scope that corresponds to what you are trying to accomplish, then [author your React component(s)](#building-custom-components) accordingly.
|
To swap in your own Custom Component, consult the list of available components below. Determine the scope that corresponds to what you are trying to accomplish, then [author your React component(s)](#building-custom-components) accordingly.
|
||||||
@@ -26,9 +26,9 @@ There are four main types of Custom Components in Payload:
|
|||||||
|
|
||||||
## Custom Root Components
|
## Custom Root Components
|
||||||
|
|
||||||
Root Components are those that effect the [Admin Panel](./overview) generally. You can override Root Components through the `admin.components` property of the [Payload Config](../getting-started/overview).
|
Root Components are those that effect the [Admin Panel](./overview) generally, such as the logo. You can override Root Components through the `admin.components` property of the [Payload Config](../getting-started/overview).
|
||||||
|
|
||||||
Here is an example showing what it might look like to swap out Root Components for your own Custom Components. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
Here is an example showing what it might look like to swap out Root Components for your own. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import { buildConfig } from 'payload'
|
import { buildConfig } from 'payload'
|
||||||
@@ -71,7 +71,7 @@ The following options are available:
|
|||||||
|
|
||||||
### Custom Providers
|
### Custom Providers
|
||||||
|
|
||||||
You can add additional [React Context](https://react.dev/learn/scaling-up-with-reducer-and-context) to any Payload app through Custom Providers. As you add more and more Custom Components to your [Admin Panel](./overview), this is a great may to share state across all of them.
|
You can add additional [React Context](https://react.dev/learn/scaling-up-with-reducer-and-context) to any Payload app through Custom Providers. As you add more and more Custom Components to your [Admin Panel](./overview), this is a great way to share state across all of them.
|
||||||
|
|
||||||
To do this, add `admin.components.providers` to your config:
|
To do this, add `admin.components.providers` to your config:
|
||||||
|
|
||||||
@@ -115,9 +115,9 @@ export const useMyCustomContext = () => useContext(MyCustomContext)
|
|||||||
|
|
||||||
## Custom Collection Components
|
## Custom Collection Components
|
||||||
|
|
||||||
Collection Components are those that effect [Collection](../configuration/collections)-specific UI within the [Admin Panel](./overview). You can override Collection Components through the `admin.components` property on any [Collection Config](../configuration/collections).
|
Collection Components are those that effect [Collection](../configuration/collections)-specific UI within the [Admin Panel](./overview), such as the save button. You can override Collection Components through the `admin.components` property on any [Collection Config](../configuration/collections).
|
||||||
|
|
||||||
Here is an example showing what it might look like to swap out Collection Components for your own Custom Components. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
Here is an example showing what it might look like to swap out Collection Components for your own. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import type { SanitizedCollectionConfig } from 'payload/types'
|
import type { SanitizedCollectionConfig } from 'payload/types'
|
||||||
@@ -152,9 +152,9 @@ The following options are available:
|
|||||||
|
|
||||||
## Custom Global Components
|
## Custom Global Components
|
||||||
|
|
||||||
Global Components are those that effect [Global](../configuration/globals)-specific UI within the [Admin Panel](./overview). You can override Global Components through the `admin.components` property on any [Global Config](../configuration/globals).
|
Global Components are those that effect [Global](../configuration/globals)-specific UI within the [Admin Panel](./overview), such as the save button. You can override Global Components through the `admin.components` property on any [Global Config](../configuration/globals).
|
||||||
|
|
||||||
Here is an example showing what it might look like to swap out Global Components for your own Custom Components. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
Here is an example showing what it might look like to swap out Global Components for your own. See [Building Custom Components](#building-custom-components) for exact details on how to build them:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import type { SanitizedGlobalConfig } from 'payload/types'
|
import type { SanitizedGlobalConfig } from 'payload/types'
|
||||||
@@ -187,7 +187,7 @@ The following options are available:
|
|||||||
|
|
||||||
All Custom Components in Payload are [React Server Components](https://react.dev/reference/rsc/server-components) by default, with the exception of [Custom Providers](#custom-providers). This enables the use of the [Local API](../local-api) directly in the front-end.
|
All Custom Components in Payload are [React Server Components](https://react.dev/reference/rsc/server-components) by default, with the exception of [Custom Providers](#custom-providers). This enables the use of the [Local API](../local-api) directly in the front-end.
|
||||||
|
|
||||||
To make building Custom Components as easy as possible, Payload automatically provides common props, such as the [`payload`](../local-api/overview) class, the [`i18n`](../configuration/i18n) object, etc. This means that when building Custom Components within the Admin Panel, you do not have to get these yourself like you would from an external application.
|
To make building Custom Components as easy as possible, Payload automatically provides common props, such as the [`payload`](../local-api/overview) class and the [`i18n`](../configuration/i18n) object. This means that when building Custom Components within the Admin Panel, you do not have to get these yourself like you would from an external application.
|
||||||
|
|
||||||
Here is an example:
|
Here is an example:
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ Custom Components also receive various other props that are specific to the cont
|
|||||||
|
|
||||||
#### Client Components
|
#### Client Components
|
||||||
|
|
||||||
When [Building Custom Components](#building-custom-components), it's still possible to use client-side code such as `useState` or the `window` object. To do this, simply define your component in a new file with the `use client` directive at the top:
|
When [Building Custom Components](#building-custom-components), it's still possible to use client-side code such as `useState` or the `window` object. To do this, simply add the `use client` directive at the top of your file. Payload will automatically detect and remove all default [non-serializable props](https://react.dev/reference/rsc/use-client#serializable-types) before rendering your component.
|
||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
'use client' // highlight-line
|
'use client' // highlight-line
|
||||||
@@ -240,29 +240,14 @@ export const MyClientComponent: React.FC = () => {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Then simply import and render your Client Component within your Server Component:
|
|
||||||
|
|
||||||
```tsx
|
|
||||||
import React from 'react'
|
|
||||||
import { MyClientComponent } from './MyClientComponent'
|
|
||||||
|
|
||||||
export default function MyServerComponent() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<MyClientComponent />
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
<Banner type="warning">
|
<Banner type="warning">
|
||||||
<strong>Reminder:</strong>
|
<strong>Reminder:</strong>
|
||||||
Client Components cannot be passed [non-serializable props](https://react.dev/reference/rsc/use-client#serializable-types). Before rendering your Client Component from a Server Component, ensure that any props passed to it are appropriately sanitized.
|
Client Components cannot be passed [non-serializable props](https://react.dev/reference/rsc/use-client#serializable-types). If you are rendering your Client Component _from within_ a Server Component, ensure that its props are serializable.
|
||||||
</Banner>
|
</Banner>
|
||||||
|
|
||||||
#### Using Hooks
|
#### Using Hooks
|
||||||
|
|
||||||
To make it easier to [build your Custom Components](#building-custom-components), you can use [Payload's built-in React Hooks](./hooks) on the client. For example, you might want to interact with one of Payload's many React Contexts:
|
To make it easier to [build your Custom Components](#building-custom-components), you can use [Payload's built-in React Hooks](./hooks) in any Client Component. For example, you might want to interact with one of Payload's many React Contexts:
|
||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
'use client'
|
'use client'
|
||||||
@@ -326,7 +311,7 @@ export const MyClientComponent: React.FC = () => {
|
|||||||
|
|
||||||
#### Getting the Current Locale
|
#### Getting the Current Locale
|
||||||
|
|
||||||
All [Custom Views](./views) can support multiple locales to be consistent with Payload's [Localization](../configuration/localization). All Custom Views automatically receive the `locale` object as a prop by default. This can be used to scope API requests, etc.:
|
All [Custom Views](./views) can support multiple locales to be consistent with Payload's [Localization](../configuration/localization). They automatically receive the `locale` object as a prop by default. This can be used to scope API requests, etc.:
|
||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|||||||
@@ -33,15 +33,15 @@ This key will automatically be made available to the client-side Payload bundle
|
|||||||
'use client'
|
'use client'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
const stripeKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
|
const stripeKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY // highlight-line
|
||||||
|
|
||||||
const MyClientComponent = () => {
|
const MyClientComponent = () => {
|
||||||
// do something with the key
|
// do something with the key
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<p>
|
<div>
|
||||||
My Client Component
|
My Client Component
|
||||||
</p>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -64,15 +64,15 @@ This key will be available to your Server Components as follows:
|
|||||||
```tsx
|
```tsx
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
const stripeSecret = process.env.STRIPE_SECRET
|
const stripeSecret = process.env.STRIPE_SECRET // highlight-line
|
||||||
|
|
||||||
const MyServerComponent = async () => {
|
const MyServerComponent = async () => {
|
||||||
// do something with the secret
|
// do something with the secret
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<p>
|
<div>
|
||||||
My Server Component
|
My Server Component
|
||||||
</p>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ app/
|
|||||||
|
|
||||||
As shown above, all Payload routes are nested within the `(payload)` route group. This creates a boundary between the Admin Panel and the rest of your application by scoping all layouts and styles. The `layout.tsx` file within this directory, for example, is where Payload manages the `html` tag of the document to set proper `lang` and `dir` attributes, etc.
|
As shown above, all Payload routes are nested within the `(payload)` route group. This creates a boundary between the Admin Panel and the rest of your application by scoping all layouts and styles. The `layout.tsx` file within this directory, for example, is where Payload manages the `html` tag of the document to set proper `lang` and `dir` attributes, etc.
|
||||||
|
|
||||||
The `admin` directory contains all the _pages_ related to the interface itself, and the `api` and `graphql` directories contains all the _routes_ related to the [REST API](../rest-api/overview) and [GraphQL API](../graphql/overview). All admin routes are [easily configurable](#customizing-routes) to meet your application's requirements.
|
The `admin` directory contains all the _pages_ related to the interface itself, whereas the `api` and `graphql` directories contains all the _routes_ related to the [REST API](../rest-api/overview) and [GraphQL API](../graphql/overview). All admin routes are [easily configurable](#customizing-routes) to meet your application's requirements.
|
||||||
|
|
||||||
Finally, the `custom.scss` file is where you can add or override globally-oriented styles in the Admin Panel, such as the color palette. Customizing the look and feel through CSS alone is a powerful feature of the Admin Panel, [more on that here](./customizing-css).
|
Finally, the `custom.scss` file is where you can add or override globally-oriented styles in the Admin Panel, such as the color palette. Customizing the look and feel through CSS alone is a powerful feature of the Admin Panel, [more on that here](./customizing-css).
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ You can use whatever Collection you'd like to access the Admin Panel as long as
|
|||||||
- `admins` - meant to have a higher level of permissions to manage your data and access the Admin Panel
|
- `admins` - meant to have a higher level of permissions to manage your data and access the Admin Panel
|
||||||
- `customers` - meant for end users of your app that should not be allowed to log into the Admin Panel
|
- `customers` - meant for end users of your app that should not be allowed to log into the Admin Panel
|
||||||
|
|
||||||
To do this, specify `admin: { user: 'admins' }` in your config. This will provide access to the Admin Panel to only `admins`. Any users authenticated as `customers` will be prevented from accessing the Admin Panel. See [Access Control](/docs/access-control/overview) for full details. For a complete, working example of role-based access control, check out the official [Auth Example](https://github.com/payloadcms/payload/tree/main/examples/auth/payload).
|
To do this, specify `admin: { user: 'admins' }` in your config. This will provide access to the Admin Panel to only `admins`. Any users authenticated as `customers` will be prevented from accessing the Admin Panel. See [Access Control](/docs/access-control/overview) for full details.
|
||||||
|
|
||||||
#### Role-based access control
|
#### Role-based access control
|
||||||
|
|
||||||
@@ -141,11 +141,11 @@ To do this, add a `roles` or similar field to your auth-enabled Collection, then
|
|||||||
|
|
||||||
## Customizing Routes
|
## Customizing Routes
|
||||||
|
|
||||||
You have full control over the routes that Payload binds itself to. This includes both root-level routes such as the REST API, and admin-level routes such as the user's account page. You can customize these routes to meet the needs of your application simply by specifying the desired paths in your config.
|
You have full control over the routes that Payload binds itself to. This includes both [Root-level Routes](#root-level-routes) such as the [REST API](../rest-api/overview), and [Admin-level Routes](#admin-level-routes) such as the user's account page. You can customize these routes to meet the needs of your application simply by specifying the desired paths in your config.
|
||||||
|
|
||||||
#### Root-level Routes
|
#### Root-level Routes
|
||||||
|
|
||||||
Root-level routes are those that are not behind the `/admin` path, such as the REST API and GraphQL APIs, or the root path of the Admin Panel itself.
|
Root-level routes are those that are not behind the `/admin` path, such as the [REST API](../rest-api/overview) and [GraphQL API](../graphql/overview), or the root path of the Admin Panel itself.
|
||||||
|
|
||||||
Here is an example of how you might modify root-level routes:
|
Here is an example of how you might modify root-level routes:
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ desc:
|
|||||||
keywords:
|
keywords:
|
||||||
---
|
---
|
||||||
|
|
||||||
Views are the individual pages that make up the [Admin Panel](./overview), such as the Dashboard, List, and Edit views. One of the most powerful ways to customize the Admin Panel is to create Custom Views. These are [Custom Components](./components) that can either replace built-in ones or be entirely new.
|
Views are the individual pages that make up the [Admin Panel](./overview), such as the Dashboard, List, and Edit views. One of the most powerful ways to customize the Admin Panel is to create Custom Views. These are [Custom Components](./components) that can either replace built-in views or be entirely new.
|
||||||
|
|
||||||
To swap in your own Custom Views, consult the list of available components below. Determine the scope that corresponds to what you are trying to accomplish, then [author your React component(s)](#building-custom-views) accordingly.
|
To swap in your own Custom Views, consult the list of available components below. Determine the scope that corresponds to what you are trying to accomplish, then [author your React component(s)](#building-custom-views) accordingly.
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,10 @@ Right now, Payload is officially supporting two rich text editors:
|
|||||||
<Banner type="success">
|
<Banner type="success">
|
||||||
<strong>
|
<strong>
|
||||||
Consistent with Payload's goal of making you learn as little of Payload as possible, customizing
|
Consistent with Payload's goal of making you learn as little of Payload as possible, customizing
|
||||||
and using the Rich Text Editor does not involve learning how to develop for a <em>Payload</em>{' '}
|
and using the Rich Text Editor does not involve learning how to develop for a
|
||||||
|
{' '}
|
||||||
|
<em>Payload</em>
|
||||||
|
{' '}
|
||||||
rich text editor.
|
rich text editor.
|
||||||
</strong>
|
</strong>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user