UNPKG

@payloadcms/plugin-form-builder

Version:

Form builder plugin for Payload CMS

225 lines (224 loc) • 7.82 kB
import { deepMergeWithSourceArrays } from 'payload'; import { fields } from './fields.js'; // all settings can be overridden by the config export const generateFormCollection = (formConfig)=>{ const redirect = { name: 'redirect', type: 'group', admin: { condition: (_, siblingData)=>siblingData?.confirmationType === 'redirect', hideGutter: true }, fields: [ { name: 'url', type: 'text', label: 'URL to redirect to', required: true } ] }; if (formConfig.redirectRelationships) { redirect.fields.unshift({ name: 'reference', type: 'relationship', admin: { condition: (_, siblingData)=>siblingData?.type === 'reference' }, label: 'Document to link to', maxDepth: 2, relationTo: formConfig.redirectRelationships, required: true }); redirect.fields.unshift({ name: 'type', type: 'radio', admin: { layout: 'horizontal' }, defaultValue: 'reference', options: [ { label: 'Internal link', value: 'reference' }, { label: 'Custom URL', value: 'custom' } ] }); if (redirect.fields[2].type !== 'row') { redirect.fields[2].label = 'Custom URL'; } redirect.fields[2].admin = { condition: (_, siblingData)=>siblingData?.type === 'custom' }; } const defaultFields = [ { name: 'title', type: 'text', required: true }, { name: 'fields', type: 'blocks', blocks: Object.entries(formConfig?.fields || {}).map(([fieldKey, fieldConfig])=>{ // let the config enable/disable fields with either boolean values or objects if (fieldConfig !== false) { const block = fields[fieldKey]; if (block === undefined && typeof fieldConfig === 'object') { return fieldConfig; } if (typeof block === 'object' && typeof fieldConfig === 'object') { return deepMergeWithSourceArrays(block, fieldConfig); } if (typeof block === 'function') { return block(fieldConfig); } return block; } return null; }).filter(Boolean) }, { name: 'submitButtonLabel', type: 'text', localized: true }, { name: 'confirmationType', type: 'radio', admin: { description: 'Choose whether to display an on-page message or redirect to a different page after they submit the form.', layout: 'horizontal' }, defaultValue: 'message', options: [ { label: 'Message', value: 'message' }, { label: 'Redirect', value: 'redirect' } ] }, { name: 'confirmationMessage', type: 'richText', admin: { condition: (_, siblingData)=>siblingData?.confirmationType === 'message' }, localized: true, required: true }, redirect, { name: 'emails', type: 'array', access: { read: ({ req: { user } })=>!!user }, admin: { description: "Send custom emails when the form submits. Use comma separated lists to send the same email to multiple recipients. To reference a value from this form, wrap that field's name with double curly brackets, i.e. {{firstName}}. You can use a wildcard {{*}} to output all data and {{*:table}} to format it as an HTML table in the email." }, fields: [ { type: 'row', fields: [ { name: 'emailTo', type: 'text', admin: { placeholder: '"Email Sender" <sender@email.com>', width: '100%' }, label: 'Email To' }, { name: 'cc', type: 'text', admin: { style: { maxWidth: '50%' } }, label: 'CC' }, { name: 'bcc', type: 'text', admin: { style: { maxWidth: '50%' } }, label: 'BCC' } ] }, { type: 'row', fields: [ { name: 'replyTo', type: 'text', admin: { placeholder: '"Reply To" <reply-to@email.com>', width: '50%' }, label: 'Reply To' }, { name: 'emailFrom', type: 'text', admin: { placeholder: '"Email From" <email-from@email.com>', width: '50%' }, label: 'Email From' } ] }, { name: 'subject', type: 'text', defaultValue: "You've received a new message.", label: 'Subject', localized: true, required: true }, { name: 'message', type: 'richText', admin: { description: 'Enter the message that should be sent in this email.' }, label: 'Message', localized: true } ] } ]; const config = { ...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; }; //# sourceMappingURL=index.js.map