feat(plugin-form-builder)!: update form builder plugin field overrides to use a function instead (#6497)

## Description

Changes the `fields` override for form builder plugin to use a function
instead so that we can actually override existing fields which currently
will not work.

```ts
//before
fields: [
  {
    name: 'custom',
    type: 'text',
  }
]

// current
fields: ({ defaultFields }) => {
  return [
    ...defaultFields,
    {
      name: 'custom',
      type: 'text',
    },
  ]
}
```

## Type of change

- [x] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
This commit is contained in:
Paul
2024-05-28 17:45:51 -03:00
committed by GitHub
parent b2662eeb1f
commit 7d0e909a30
5 changed files with 254 additions and 244 deletions

View File

@@ -1,4 +1,4 @@
import type { CollectionConfig } from 'payload/types' import type { CollectionConfig, Field } from 'payload/types'
import type { FormBuilderPluginConfig } from '../../types.js' import type { FormBuilderPluginConfig } from '../../types.js'
@@ -11,20 +11,7 @@ export const generateSubmissionCollection = (
): CollectionConfig => { ): CollectionConfig => {
const formSlug = formConfig?.formOverrides?.slug || 'forms' const formSlug = formConfig?.formOverrides?.slug || 'forms'
const newConfig: CollectionConfig = { const defaultFields: Field[] = [
...(formConfig?.formSubmissionOverrides || {}),
slug: formConfig?.formSubmissionOverrides?.slug || 'form-submissions',
access: {
create: () => true,
read: ({ req: { user } }) => !!user, // logged-in users,
update: () => false,
...(formConfig?.formSubmissionOverrides?.access || {}),
},
admin: {
...(formConfig?.formSubmissionOverrides?.admin || {}),
enableRichTextRelationship: false,
},
fields: [
{ {
name: 'form', name: 'form',
type: 'relationship', type: 'relationship',
@@ -90,8 +77,26 @@ export const generateSubmissionCollection = (
}, },
], ],
}, },
...(formConfig?.formSubmissionOverrides?.fields || []), ]
],
const newConfig: CollectionConfig = {
...(formConfig?.formSubmissionOverrides || {}),
slug: formConfig?.formSubmissionOverrides?.slug || 'form-submissions',
access: {
create: () => true,
read: ({ req: { user } }) => !!user, // logged-in users,
update: () => false,
...(formConfig?.formSubmissionOverrides?.access || {}),
},
admin: {
...(formConfig?.formSubmissionOverrides?.admin || {}),
enableRichTextRelationship: false,
},
fields:
formConfig?.formSubmissionOverrides?.fields &&
typeof formConfig?.formSubmissionOverrides?.fields === 'function'
? formConfig?.formSubmissionOverrides?.fields({ defaultFields })
: defaultFields,
hooks: { hooks: {
...(formConfig?.formSubmissionOverrides?.hooks || {}), ...(formConfig?.formSubmissionOverrides?.hooks || {}),
beforeChange: [ beforeChange: [

View File

@@ -64,19 +64,7 @@ export const generateFormCollection = (formConfig: FormBuilderPluginConfig): Col
} }
} }
const config: CollectionConfig = { const defaultFields: Field[] = [
...(formConfig?.formOverrides || {}),
slug: formConfig?.formOverrides?.slug || 'forms',
access: {
read: () => true,
...(formConfig?.formOverrides?.access || {}),
},
admin: {
enableRichTextRelationship: false,
useAsTitle: 'title',
...(formConfig?.formOverrides?.admin || {}),
},
fields: [
{ {
name: 'title', name: 'title',
type: 'text', type: 'text',
@@ -227,8 +215,24 @@ export const generateFormCollection = (formConfig: FormBuilderPluginConfig): Col
}, },
], ],
}, },
...(formConfig?.formOverrides?.fields || []), ]
],
const config: CollectionConfig = {
...(formConfig?.formOverrides || {}),
slug: formConfig?.formOverrides?.slug || 'forms',
access: {
read: () => true,
...(formConfig?.formOverrides?.access || {}),
},
admin: {
enableRichTextRelationship: false,
useAsTitle: 'title',
...(formConfig?.formOverrides?.admin || {}),
},
fields:
formConfig?.formOverrides.fields && typeof formConfig?.formOverrides.fields === 'function'
? formConfig?.formOverrides.fields({ defaultFields })
: defaultFields,
} }
return config return config

View File

@@ -30,20 +30,6 @@ export const formBuilderPlugin =
return { return {
...config, ...config,
// admin: {
// ...config.admin,
// webpack: (webpackConfig) => ({
// ...webpackConfig,
// resolve: {
// ...webpackConfig.resolve,
// alias: {
// ...webpackConfig.resolve.alias,
// [path.resolve(__dirname, 'collections/FormSubmissions/hooks/sendEmail.ts')]: path.resolve(__dirname, 'mocks/serverModule.js'),
// [path.resolve(__dirname, 'collections/FormSubmissions/hooks/createCharge.ts')]: path.resolve(__dirname, 'mocks/serverModule.js'),
// },
// },
// })
// },
collections: [ collections: [
...(config?.collections || []), ...(config?.collections || []),
generateFormCollection(formConfig), generateFormCollection(formConfig),

View File

@@ -39,12 +39,13 @@ export interface FieldsConfig {
export type BeforeEmail = (emails: FormattedEmail[]) => FormattedEmail[] | Promise<FormattedEmail[]> export type BeforeEmail = (emails: FormattedEmail[]) => FormattedEmail[] | Promise<FormattedEmail[]>
export type HandlePayment = (data: any) => void export type HandlePayment = (data: any) => void
export type FieldsOverride = (args: { defaultFields: Field[] }) => Field[]
export type FormBuilderPluginConfig = { export type FormBuilderPluginConfig = {
beforeEmail?: BeforeEmail beforeEmail?: BeforeEmail
fields?: FieldsConfig fields?: FieldsConfig
formOverrides?: Partial<CollectionConfig> formOverrides?: Partial<Omit<CollectionConfig, 'fields'>> & { fields: FieldsOverride }
formSubmissionOverrides?: Partial<CollectionConfig> formSubmissionOverrides?: Partial<Omit<CollectionConfig, 'fields'>> & { fields: FieldsOverride }
handlePayment?: HandlePayment handlePayment?: HandlePayment
redirectRelationships?: string[] redirectRelationships?: string[]
} }

View File

@@ -73,12 +73,26 @@ export default buildConfigWithDefaults({
// singular: 'Contact Form', // singular: 'Contact Form',
// plural: 'Contact Forms' // plural: 'Contact Forms'
// }, // },
fields: [ fields: ({ defaultFields }) => {
return [
...defaultFields,
{ {
name: 'custom', name: 'custom',
type: 'text', type: 'text',
}, },
], ]
},
},
formSubmissionOverrides: {
fields: ({ defaultFields }) => {
return [
...defaultFields,
{
name: 'custom',
type: 'text',
},
]
},
}, },
redirectRelationships: ['pages'], redirectRelationships: ['pages'],
}), }),