feat(plugin-seo): export fields from plugin seo so that they can be imported freely in a collection fields config (#6996)
Exports the fields from the SEO plugin so that they can be used anywhere
inside a collection, new exports:
```ts
import { MetaDescriptionField, MetaImageField, MetaTitleField, OverviewField, PreviewField } from '@payloadcms/plugin-seo/fields'
// Used as fields
MetaImageField({
relationTo: 'media',
hasGenerateFn: true,
})
MetaDescriptionField({
hasGenerateFn: true,
})
MetaTitleField({
hasGenerateFn: true,
})
PreviewField({
hasGenerateFn: true,
titlePath: 'meta.title',
descriptionPath: 'meta.description',
})
OverviewField({
titlePath: 'meta.title',
descriptionPath: 'meta.description',
imagePath: 'meta.image',
})
```
This commit is contained in:
98
test/plugin-seo/collections/PagesWithImportedFields.ts
Normal file
98
test/plugin-seo/collections/PagesWithImportedFields.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import type { CollectionConfig } from 'payload'
|
||||
|
||||
import {
|
||||
MetaDescriptionField,
|
||||
MetaImageField,
|
||||
MetaTitleField,
|
||||
OverviewField,
|
||||
PreviewField,
|
||||
} from '@payloadcms/plugin-seo/fields'
|
||||
|
||||
import { pagesWithImportedFieldsSlug } from '../shared.js'
|
||||
|
||||
export const PagesWithImportedFields: CollectionConfig = {
|
||||
slug: pagesWithImportedFieldsSlug,
|
||||
labels: {
|
||||
singular: 'Page with imported fields',
|
||||
plural: 'Pages with imported fields',
|
||||
},
|
||||
admin: {
|
||||
useAsTitle: 'title',
|
||||
},
|
||||
versions: {
|
||||
drafts: true,
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'title',
|
||||
label: 'Title',
|
||||
type: 'text',
|
||||
required: true,
|
||||
},
|
||||
OverviewField({
|
||||
titlePath: 'metaAndSEO.title',
|
||||
descriptionPath: 'metaAndSEO.innerMeta.description',
|
||||
imagePath: 'metaAndSEO.innerMedia.image',
|
||||
}),
|
||||
{
|
||||
type: 'tabs',
|
||||
tabs: [
|
||||
{
|
||||
label: 'General',
|
||||
fields: [
|
||||
{
|
||||
name: 'excerpt',
|
||||
label: 'Excerpt',
|
||||
type: 'text',
|
||||
},
|
||||
{
|
||||
name: 'slug',
|
||||
type: 'text',
|
||||
required: true,
|
||||
// NOTE: in order for position: 'sidebar' to work here,
|
||||
// the first field of this config must be of type `tabs`,
|
||||
// and this field must be a sibling of it
|
||||
// See `./Posts` or the `../../README.md` for more info
|
||||
admin: {
|
||||
position: 'sidebar',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Meta',
|
||||
name: 'metaAndSEO',
|
||||
fields: [
|
||||
MetaTitleField({
|
||||
hasGenerateFn: true,
|
||||
}),
|
||||
PreviewField({
|
||||
hasGenerateFn: true,
|
||||
titlePath: 'metaAndSEO.title',
|
||||
descriptionPath: 'metaAndSEO.innerMeta.description',
|
||||
}),
|
||||
{
|
||||
type: 'group',
|
||||
name: 'innerMeta',
|
||||
fields: [
|
||||
MetaDescriptionField({
|
||||
hasGenerateFn: true,
|
||||
}),
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'group',
|
||||
name: 'innerMedia',
|
||||
fields: [
|
||||
MetaImageField({
|
||||
relationTo: 'media',
|
||||
hasGenerateFn: true,
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js'
|
||||
import { devUser } from '../credentials.js'
|
||||
import { Media } from './collections/Media.js'
|
||||
import { Pages } from './collections/Pages.js'
|
||||
import { PagesWithImportedFields } from './collections/PagesWithImportedFields.js'
|
||||
import { Users } from './collections/Users.js'
|
||||
import { seed } from './seed/index.js'
|
||||
|
||||
@@ -29,7 +30,7 @@ const generateURL: GenerateURL<Page> = ({ doc, locale }) => {
|
||||
}
|
||||
|
||||
export default buildConfigWithDefaults({
|
||||
collections: [Users, Pages, Media],
|
||||
collections: [Users, Pages, Media, PagesWithImportedFields],
|
||||
i18n: {
|
||||
supportedLanguages: {
|
||||
en,
|
||||
|
||||
@@ -11,6 +11,7 @@ export interface Config {
|
||||
users: User;
|
||||
pages: Page;
|
||||
media: Media;
|
||||
pagesWithImportedFields: PagesWithImportedField;
|
||||
'payload-preferences': PayloadPreference;
|
||||
'payload-migrations': PayloadMigration;
|
||||
};
|
||||
@@ -90,6 +91,28 @@ export interface Media {
|
||||
focalX?: number | null;
|
||||
focalY?: number | null;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "pagesWithImportedFields".
|
||||
*/
|
||||
export interface PagesWithImportedField {
|
||||
id: string;
|
||||
title: string;
|
||||
excerpt?: string | null;
|
||||
slug: string;
|
||||
metaAndSEO?: {
|
||||
title?: string | null;
|
||||
innerMeta?: {
|
||||
description?: string | null;
|
||||
};
|
||||
innerMedia?: {
|
||||
image?: string | Media | null;
|
||||
};
|
||||
};
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
_status?: ('draft' | 'published') | null;
|
||||
}
|
||||
/**
|
||||
* This interface was referenced by `Config`'s JSON-Schema
|
||||
* via the `definition` "payload-preferences".
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
export const pagesSlug = 'pages'
|
||||
|
||||
export const pagesWithImportedFieldsSlug = 'pagesWithImportedFields'
|
||||
|
||||
export const mediaSlug = 'media'
|
||||
|
||||
Reference in New Issue
Block a user